Решение на лист делится на два с разными родителями? - PullRequest
0 голосов
/ 22 августа 2009

Учитывая лист и его родительский TD, сделайте печать:

$parent = new Node('td');
$child = new Leaf('Text:', 'Value');
$parent->add($child);
$parent->print();

требование к печати:

sometimes <td>Text: Value</td>
sometimes <td>Text:</td><td>Value</td>

Пока что я построил 3 решения, но ни одно не удовлетворило меня, интересно, какое из них больше ОО? И есть ли 4-й выбор?

-- Solution 1 --
// Divide the leaf object to two leaf objects
$leafText = new Leaf('Text: ');
$leafvalue = new Leaf('Value');
$parent->add($leafText);
$parent->add($leafValue);
$parent->print();

-- Solution 2 --
// Change leaf print() logic, if leaf's parent is TD, output "Text: Value",
// otherwise output "<td>Text:</td><td>Value</td>"

-- Solution 3 --
// Change parent add() logic, give leaf a variable $separate to describe if it 
// should be divided
function add($child) {
    if($child->separate) {
        $this->parent->add($child->text);
        $this->children[] = $child->value;
    }
    ...
}

Ответы [ 2 ]

1 голос
/ 22 августа 2009

В большинстве случаев ОО будет отделять логику рендеринга от модели данных ... ваша иерархия модели должна быть отслеживаемой контроллером, который рендерит ваши данные в иерархию представлений ...

также, «цепочка контроля» должна следовать вашей иерархии ... это не зависит от листа, определяющего его поведение в зависимости от родителя, это зависит от родителя, чтобы получить информацию из листа, а затем обработать ее в зависимости от того, собственное состояние или для передачи необходимых данных дочернему элементу при запросе любой информации ... таким образом, лист отделяется от узла ... в противном случае вы получаете двустороннюю зависимость, которая значительно уменьшает возможность повторного использования ...

Greetz

back2dos

0 голосов
/ 22 августа 2009

Я должен был бы пойти с решением 2 лично. Вы говорите, что при таком решении лист может содержать узел, который вам не нравится, но есть ли какая-то причина, по которой он имеет , чтобы иметь возможность содержать узел? Поскольку вы используете разные классы (Node и Leaf), вы должны иметь возможность добавить проверку, которая предотвращает передачу Node в Leaf (что-то вроде этого):

class Leaf {
  public function __construct($text, $value) {
    if (is_object($text))
      throw new Exception('error message');

    if (get_class($value) == 'Node')
      throw new Exception('error message');
  }
}

Обе эти проверки должны работать, вторая просто проверяет определенный класс, а первая просто запрещает все объекты. Вы также можете использовать функцию is_string(), но это не допустит целые числа.

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