Какое преимущество принесет шаблон Composite перед массивом? - PullRequest
6 голосов
/ 10 августа 2009

Я недавно работаю над древовидной структурой, несколькими узлами, множественными и расширяемыми уровнями и методом print (). Сначала я подумал, что это должен быть Composite, затем я записал некоторые возможные конструкции и коды:

alt text

$struc = new Node(‘name0’, ‘id0’, ‘desc0’);
$node1 = new Node(‘node1’, ‘id1’, ‘desc1’);
$node2 = new Node(‘node2’, ‘id2’, ‘desc2’);
$node3 = new Node(‘node3’, ‘id3’, ‘desc3’);
$leaf1 = new Leaf(‘leaf1’, ‘ld1’, ‘lesc1’);
$leaf2 = new Leaf(‘leaf2’, ‘ld2’, ‘lesc2’);
$leaf3 = new Leaf(‘leaf3’, ‘ld3’, ‘lesc3’);
$leaf4 = new Leaf(‘leaf4’, ‘ld4’, ‘lesc4’);

$struc.add($node1);
$struc.add($node3);

$node1.add($leaf1);
$node1.add($leaf2);
$node1.add($node2);

$node2.add($leaf3);    
$node3.add($leaf4);

Выглядит хорошо, я думаю и начинаю кодировать, метод print () может последовать примеру итератора позже. Но во время кодирования я чувствую, что это слишком сложно для этих простых узлов? И мне нужно создать множество конкретных классов (более 50 и более). Затем я остановился и подумал простым способом, используя массив:

-- Structure Class --
//To be more readable and clear, array here could be
//divided to 3 arrays(root/nodes/leafs), then connect
//in a similar way Composite does.
$struc = array('name0', 'id0', 'desc0',

           'children'=>array(

               array('node1', 'id1', 'desc1',
                  'children' => array(
                     array('leaf1', 'ld1', 'lesc1'),
                     array('leaf2', 'ld2', 'lesc2'),
                     array('node2', 'id2', 'desc2',
                        'children'=>array(array('leaf3', 'ld3', 'lesc3'))
                     )
                  )
               ),

               array('node3', 'id3', 'desc3',
                  'children' => array(array('leaf4', 'ld4', 'lesc4'))
               )
           )
);

function print($node = $this->struct) {
    ...
    if(isset($node['children'])) $this->print($node['children']);
    ...
}

Два дизайна выглядят очень похоже, теперь я немного запутался, в чем ценность композитного паттерна, я пропустил что-то важное из этого паттерна?

Ответы [ 3 ]

7 голосов
/ 10 августа 2009

значение составного состоит в том, что вы торгуете некоторой сложностью за возможность не нарушать инкапсуляцию .

В вашей версии массива вы нарушаете инкапсуляцию, так как вы тестирование, если узел не является листом:

if(isset($node['children'])) $this->print($node['children']);

с композитом вы можете сказать:

print();

тогда полиморфизм во время выполнения вызовет правильный метод. В этом случае (я не программист PHP, поэтому позвольте мне использовать подобный Java-синтаксису):

class Node {

   void print() {
       for (child in children) {
          child.print();
       } 
   }

   ...
}

class Leaf {

   void print() {
       // print it! 
   }
}

еще одно преимущество перед простым массивом состоит в том, что вы скрываете детали своей реализации (структура данных и т. Д.)

6 голосов
/ 10 августа 2009

Смысл составного шаблона состоит в том, чтобы иметь возможность обрабатывать коллекцию объектов, как если бы это был один объект (например, для его отображения или записи в файл). Когда вы пишете себе, что «метод print () может следовать шаблону Итератора позже» - хорошо, смысл составного шаблона состоит в том, что вы можете вызывать print (), не беспокоясь о том, печатаете ли вы один Компонент или вам нужно итерировать через все дерево.

Но похоже, что вы не совсем понимаете объектно-ориентированное программирование в целом, поскольку вместо этого вы планируете использовать вложенные массивы. Значение использования объектов вместо хешей (которые являются массивами PHP) для всего составляет безопасность типов , что значительно упрощает отладку и обслуживание программ.

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

Разве реализация массива не выглядит для вас более сложной? Если я смотрю на это, я должен изучить его поближе, чтобы понять, что вы делаете. Вы имеете дело с индексами, присваиваете записи определенным индексам и т. Д. ... это выглядит действительно сложно.

Ваша реализация составного шаблона на другом сайте выглядит простой и естественной, когда вы смотрите на код, где вы его используете. У вас есть узел, и вы присоединяете к нему другие узлы или листья. Ничего сложного, странного, мне не нужно заботиться / запоминать индексы и т.д. ... Вот почему составной шаблон полезен в вашем случае. Конечно, его реализация может показаться вам немного сложной, если вы к ней не привыкли, но важным моментом (как и другим заявленным) является то, что вы скрываете детали. Это очень важно. Это простой пример, он все еще может работать с вашими массивами, но когда вы реализуете такой код в производственной среде, где, возможно, другие разработчики также редактируют / поддерживают ваш код. Если кто-то должен изменить ваше решение «массива», гораздо более вероятно, что он представит новые ошибки.

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