Это паттерн компоновщик (Composite) нужен совет !

pachanga

Новичок
Хех, ну, конечно, с точки зрения OO purist'а, пожалуй да :) Хотя мне кажется получается слишком вербозно....
 

vitus

мимо проходил
твой пример не компоновщик, у тебя равноправные 'b' и 'c' неравноправны, скорее 'b' декорирован с помощью 'c'
такчто - декоратор тут правильное слово :)
 

pachanga

Новичок
Автор оригинала: vitus
твой пример не компоновщик, у тебя равноправные 'b' и 'c' неравноправны,
Как это неравноправные? Они все поддерживают единый интерфейс. Просто было выбрано такое решение(а не твое) чисто из-за удобства использования. Скажем в твоем случае нельзя сделать следующим образом, т.к тебе потребуется делать вспомогательные композиты:

PHP:
$a = new SQLRawCriteria('a=1');
$a->addAnd(SQLRawCriteria('b=2'))->addAnd(new SQLRawCriteria('c=3'));
//жаль, что php не поддерживает такие фокусы:
//$a = new SQLRawCriteria('a=1')->addAnd(SQLRawCriteria('b=2'))->addAnd(new SQLRawCriteria('c=3'));
скорее 'b' декорирован с помощью 'c'
такчто - декоратор тут правильное слово :)
Очень интересно, можешь доказать?
 

vitus

мимо проходил
Как это неравноправные? Они все поддерживают единый интерфейс.
они в дереве неравноправны, а по идее компоновщика должны быть, к примеру - удали 'b', не удаляя 'c'.

почему ты решил что 'b' должен быть контейнером для 'c' ?
а не наоборот к примеру?

Просто было выбрано такое решение чисто из-за удобства использования.
ну и правильно, только оно от этого не стало компоновщиком, а мы ведь тут про компоновщик флудим.
 

pachanga

Новичок
Автор оригинала: vitus
только оно от этого не стало компоновщиком, а мы ведь тут про компоновщик флудим.
Ок, я с тобой соглашусь в том моменте, что предложенный мною вариант не является имплементацией данного паттерна в чистом виде.

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

vitus

мимо проходил
PHP:
$a='a';

$b='b';
$b.='c';

$a.=$b;

echo $a;
// abc
это тоже модифицированный компоновщик?

-~{}~ 04.10.05 10:56:

на самом деле твоя иллюстрация не является компоновщиком, поскольку не строит "древовидные структуры для представления иерархий часть-целое" и имеет по меньшей мере два метода для строительства

-~{}~ 04.10.05 11:00:

хороший пример компоновщика - DOM api
 

pachanga

Новичок
Автор оригинала: vitus
PHP:
$a='a';

$b='b';
$b.='c';

$a.=$b;

echo $a;
// abc
это тоже модифицированный компоновщик?
зачем так утрировать?

на самом деле твоя иллюстрация не является компоновщиком, поскольку не строит "древовидные структуры для представления иерархий часть-целое" и имеет по меньшей мере два метода для строительства
ты в этом уверен? $c1->addOr($c2->addAnd($c3)); - здесь нет древовидной структуры?
 

texrdcom

Новичок
pachanga - не смиши людей ! В коде ошибок нет можеш его спокойно скопировать и запустить на выходе textline
что и надо было доказать. А твой код размыт.
Напиши простой пример а мы его потестим ?
 

pachanga

Новичок
Больше "смишить" не буду, просто смотри мой самый первый пример(там где про обработку ошибок), если второй сложен.
 

vitus

мимо проходил
texrdcom
иди книжку читай до просветления
pachanga
твой второй пример больше похож на буффер какойта, согласись,
типа SQLBufferedBuilder (не путать с паттерном билдер, там ещё директор есть) , и не обижайся плиз.
А про декоратор я соврал, беру слово обратно, каюсь, был неправ.
 

texrdcom

Новичок
Автор оригинала: vitus
texrdcom
иди книжку читай до просветления
pachanga
твой второй пример больше похож на буффер какойта, согласись,
типа SQLBufferedBuilder (не путать с паттерном билдер, там ещё директор есть) , и не обижайся плиз.
А про декоратор я соврал, беру слово обратно, каюсь, был неправ.
Я не говорю что я прав на 100% я просто говорю человеку что ошибок в моем коде нет! :)
И еще vitus може ты напишеш тестовый пример - правильный :) а то расуждать и я могу причем на любые темы :)
 

pachanga

Новичок
vitus

Ты меня тоже извини за подобное упрямство...но я буду настаивать на своем :)

В первом примере также использован композит, только он, в практических целях, ограничен только одним уровнем вложенности. Конечно, можно сделать сколько угодно вложенную иерархию, но в данном случае в этом смысла нет.

Ок, я согласен, опять же не "чистый" пример. Но меня это ни сколь не смущает, скажу даже больше, именно такой вид композита(только один контейнер + много терминальных нодов) на моей практике встречался наиболее часто.

Несколько крайне субъективных замечаний. По-моему, на то они и паттерны, чтобы только описать обобщенную схему некоторого взаимодействия. Вариаций "на тему" может быть очень много, т.е паттерну обычно следуют по "духу", а не по "слову" буквально. Как и во везде, в данной области есть "полутона", и это здорово. Это конечно не означает, что можно злоупотреблять с терминологией и называть белое черным....вобщем, ты меня понял :)

И еще, я обычно пытаюсь показывать примеры из своей практики, как можно меньше витая в облаках. Конечно, можно было бы за пару минут рассказать о заезженном теоретическом примере....только зачем переливать пустое в порожнее? Кстати, насколько я помню, по-настоящему чистый композит встречался мне в WACT шаблонизаторе, только поверь мне, пример получился бы не самый простой.
 

vitus

мимо проходил
pachanga
в первом примере действительно композит, и построение делева, (насколько я понял) возможно с любой глубиной, хотя задача этого и не требует ;)

в целом я с тобой согласен, но во втором примере мне виден только интерфейс, а он напоминает конкатенацию :0)

texrdcom
то что код выполняется без ошибок не говорит о том что он правильный: задача построения иерархии в нём не решается.

пример написать - не проблема, но сначала ответь на вопросы из моего первого поста в этом треде.
 

texrdcom

Новичок
vitus
Отвечаю:
для чего ты написал этот код? - стараюсь разобраться с ооп
какова мотивация? - знать правильное решения паттернов на php - для того что бы их гдето приминить их надо знать - понимать или ты не согласен ?
где может быть применён этот паттерн на твой взгляд?
для построения системы cmf как возможность наращивать
функциональность системы
 

vitus

мимо проходил
обещаный композит: решена задача от pachanga
перефразированная мной

!!! пример демонстрационный, использовать только после обработки напильником !!!

PHP:
//php4
  class AbstractComponent{
    function getProduct(){
        //abstract
    }
  }
  
  class AbstractComposite extends AbstractComponent{
    var $comp;
    
    function AbstractComposite(){
        $this->comp=array();
    }

    function add($criteria){
        $this->comp[]=$criteria;
    }
  }
  
  class SQLRawCriteria{
    var $criteria;

    function SQLRawCriteria($criteria){
        $this->criteria=$criteria;
    }
    function getProduct(){
        return $this->criteria;
    }
  }

  class SQLCompositeAnd extends AbstractComposite{
    function getProduct(){
        $result="";
        foreach($this->comp as $comp){
            $result.=$result?" AND ".($comp->getProduct()):$comp->getProduct();
        }
        return "(".$result.")";
    }
  }

  class SQLCompositeOr extends AbstractComposite{  
    function getProduct(){
        $result="";
        foreach($this->comp as $comp){
            $result.=$result?" OR ".($comp->getProduct()):$comp->getProduct();
        }
        return "(".$result.")";
    }
  }

///////////////////test 
$and = new SQLCompositeAnd();
$or =new SQLCompositeOr();

$a=new SQLRawCriteria('a=1');
$b=new SQLRawCriteria('b=2');
$c=new SQLRawCriteria('c=3');

$or->add($b);
$or->add($c);

$and->add($a);
$and->add($or);

$str = $and->getProduct();

echo $str;
для чего ты написал этот код? - стараюсь разобраться с ооп
- похвально

какова мотивация? - знать правильное решения паттернов на php
гораздо важнее понимать их назначение и каким образом оно реализуется, а решения зависят от задачи.
где может быть применён этот паттерн на твой взгляд?
для построения системы cmf как возможность наращивать
слишком обобщённо, незачот
 
Сверху