Ассоциации vs Агрегирование vs Композиция vs Отношение использования

korpus

злой бобёр
Изучаю книгу Мэтта Зандстры, которая называется "PHP. Объекты, шаблоны и методики программирования". На страницах 146 -148 описываются возможные отношения между объектами и приводятся их UML-диаграммы. Это такие отношения как "Ассоциация", "Агрегирование", "Композиция". В чём между этими отношениями разница и в чём их особенности?
Может где-то есть хорошее описание этих отношений? Они были бы полезны любому, так как без них понимание многих шаблнов становится затруднительным.

UPDATE. В названии темы применён термин "Отношение использования", но этот термин левый. Нет возможности подправить.
 

Dez

Новичок
В моем Зандстре это страницы 131-133, но там вроде очень доступно объяснено.
Лучше скажи что непонятно?
 

WMix

герр M:)ller
Партнер клуба
PHP:
class A{

function b( $obj, $obj2 ){
  $this->c = new Class(); // Композиция (new Class создан и живет только в данном классе )
  $this->d[] = $obj; //( $obj создан за пределами класса и живет сам по себе) - Агрегация
  $obj2->foo(); // Ассоциация
}

}
 

Dez

Новичок
У вмикса не совсем корректно, а про ассоциации вообще не верно, не важно где созданы объекты, важно их взаимоотношение.
Ассоциация - просто наличие с св-ве одного объекта ссылки на другой объект. Что тут непонятного?
 

korpus

злой бобёр
Ассоциация - просто наличие с св-ве одного объекта ссылки на другой объект. Что тут непонятного?
А агрегация что такое, а композиция? Самое простое про все эти отношения можно сказать "что один объект имеет ссылку на другой объект". Но это не так много объясняет.
 

WMix

герр M:)ller
Партнер клуба
korpus
Это правда, Ассоциация это и Композиция и Агрегация. но в 2х последних говориться также о месте хранения обьекта. в первом же случае об этом умалчивается важно лишь что существует связь.

когда этот вопрос возникает задайся вопросом
$a=new A
что будет если мы уничтожим обьект $a, уничтожится также $this->c и $this->d[] со всем содержимым или чтото будет еще в памяти?
 

fixxxer

К.О.
Партнер клуба
Агрегация и композиция - одно и то же в том смысле, что и там и там $this->fooObject.

Смысл в отношениях между $this и fooObject.
 

WMix

герр M:)ller
Партнер клуба
Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.

Композиция (агрегирование по значению) — более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.

http://ru.wikipedia.org/wiki/Агрегирование_(программирование)
 

Dez

Новичок
А агрегация что такое, а композиция? Самое простое про все эти отношения можно сказать "что один объект имеет ссылку на другой объект". Но это не так много объясняет.
Ассоциация - просто имеет ссылку на какой то объект, с которым ему надо любым образом работать. Например в ф-ции напишешь global $var, получишь доступ к глобальной переменной. А тут через свое какое то св-во можно работать с нужным конкретным объектом (именно экземпляром)

Композиция - это где по сути объект состоит из других объектов, как арбуз состоит из мякоти, семечек и корки.

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

fixxxer

К.О.
Партнер клуба
Про уничтожение это ноги растут из GOF с С++ и деструкторами, это не объясняет смысловую разницу. :)

Одно - когда связанные объекты самостоятельны (например, телефон и аккумулятор), второе - когда части составляют единое целое и по отдельности не имеют смысла (ручка у чашки, скажем).

Что из них какое, я сам все время путаю =)

Вообще это не то, чем стоит забивать себе голову ;) есть куда более внятные и полезные паттерны, без пляски вокруг тонких отличий между has_a, is_a и contains. Это все появилось в GoF на примере С++, где важно управление памятью; с GC разница становится исключительно смысловой и практически незаметной.
 

WMix

герр M:)ller
Партнер клуба
fixxxer
я тоже хотел сказать что это перестало иметь огромный смысл с того момента мы перестали различать переменную как адрес *xyz и как полноценную структуру.. это и про яву кажись
 

fixxxer

К.О.
Партнер клуба
Да собственно даже с shared_ptr в С++ я разницу перестаю замечать. ;)
 

korpus

злой бобёр
Про уничтожение это ноги растут из GOF с С++ и деструкторами, это не объясняет смысловую разницу. :)

Одно - когда связанные объекты самостоятельны (например, телефон и аккумулятор), второе - когда части составляют единое целое и по отдельности не имеют смысла (ручка у чашки, скажем).

Что из них какое, я сам все время путаю =)

Вообще это не то, чем стоит забивать себе голову ;) есть куда более внятные и полезные паттерны, без пляски вокруг тонких отличий между has_a, is_a и contains. Это все появилось в GoF на примере С++, где важно управление памятью; с GC разница становится исключительно смысловой и практически незаметной.
Можно посмотреть на перевод слов "aggregation" и "composition" с английского. Вероятно, в английском языке это совсем разные термины.
И это ещё не паттерны ;).
 

korpus

злой бобёр
korpus
Это правда, Ассоциация это и Композиция и Агрегация. но в 2х последних говориться также о месте хранения обьекта. в первом же случае об этом умалчивается важно лишь что существует связь.
В книге Зандстры для каждого из терминов (ассоциация, композиция, агрегация) на диаграмме UML вводится своё собственное обозначение, кстати. То есть можно сказать, что иногда, если точно не известно отношение между объектами, то можно поставить простую ассоциацию?
 

WMix

герр M:)ller
Партнер клуба
на диаграмме UML вводится своё собственное обозначение
Код:
---------------------   символ ассоциации
*                  x   

-------------------<>   символ конкретной ассоциации (агрегация, если ромб закрашен - композиция)
*                  x
 

fixxxer

К.О.
Партнер клуба
Да понятно что еще не паттерны, паттерны начинаются в С++ - где память выделяется, где освобождается. В PHP имеет смысл рассматривать только разницу между

PHP:
    public function __construct(Bar $bar) {
         $this->bar = $bar;
    }
и
PHP:
    public function __construct() {
         $this->bar = new Bar();
// или, кстати, $this->bar = new Bar($this)
    }
Стрелочки и ромбики, ну, я хрен знает, а кто-нибудь это правда использует? Именно в процессе построения архитектуры, а не постфактум чтобы пустить пыль в глаза? :)
 

korpus

злой бобёр
Стрелочки и ромбики, ну, я хрен знает, а кто-нибудь это правда использует? Именно в процессе построения архитектуры, а не постфактум чтобы пустить пыль в глаза? :)
Мне показалось, что разобраться в них как раз стоит. Хотя бы для расширения своего понимания. И проще разные паттерны разбирать. Посмотри на прилагаемое к статье изображение http://ru.wikipedia.org/wiki/Стратегия_(шаблон_проектирования). В книге Зандстры получше про шаблон написано, чем на википедии.
 

korpus

злой бобёр
Код:
---------------------   символ ассоциации
*                  x   

-------------------<>   символ конкретной ассоциации (агрегация, если ромб закрашен - композиция)
*                  x
В книге ещё есть
Код:
-------------------->   направленная ассоциация
*                  x
<------------------->  двунаправленная ассоциация
*                  x
 
Сверху