TclOO: Класс Точка - PullRequest
       7

TclOO: Класс Точка

0 голосов
/ 05 сентября 2018

Это мой первый класс, я в правильном направлении? Я задаю себе вопросы в основном по методу init (). Все в порядке? Я не уверен ... Я ищу некоторый совет, метод ...

oo::class create Point {

    variable x y z

    method init {val} {
        lassign $val x y z
    }

    method x {} {
        set x $x
    }

    method y {} {
        set y $y
    }

    method z {} {
        set z $z
    }

    method formatPoint {} {
        set x [format %.4f $x]
        set y [format %.4f $y]
        set z [format %.4f $z]
    }

}
proc distance3D {a b} {

    return [expr { \
            sqrt(([$a x] - [$b x])**2 \
               + ([$a y] - [$b y])**2 \
               + ([$a z] - [$b z])**2 )}]
}

set P0 [Point new]
set P1 [Point new]

$P0 init {8.2 30 40}
$P1 init {9.5 10 10}
set val [distance3D $P0 $P1]

1 Ответ

0 голосов
/ 05 сентября 2018

Вероятно, было бы лучше иметь конструктор, а не метод init:

constructor val {
    lassign $val x y z
}

set P0 [Point new {8.2 30 40}]

или

constructor args {
    lassign $args x y z
}

set P0 [Point new 8.2 30 40]

С точки зрения ООП, точка без координат не имеет особого смысла, и вы, вероятно, не хотите «перемещать» точку путем изменения координат, поэтому координаты должны быть назначены при создании точки, а точка заменена с новым, если предмет, которому принадлежит точка, перемещается.

Это хорошая идея, чтобы изменить значения координат методом formatPoint? Почему бы не позволить координатам сохранять свои значения и предоставлять форматированный доступ:

method formatPoint {} {
    format {%.4f %.4f %.4f} $x $y $z
}

Методы доступа к координатам немного отключены. Попробуйте

method x {} {
    set x
}

вместо этого: унарная форма множества возвращает значение. Или

method x {} {
    return $x
}

если вы предпочитаете.

Вычисление дает правильный результат (~ 36.0789), но имейте в виду, что вам не нужно экранировать окончания строк в фигурных скобках выражения (поскольку окончания строк уже экранированы фигурными скобками).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...