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

Европа - быстрые серверы на дисках NVMe от $5 / Русский датацентр от 199руб

Тема в разделе "Вопросы по теории программирования", создана пользователем korpus, 27 апр 2013.

  1. korpus

    korpus злой бобёр

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

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

    Dez Новичок

    Сообщения:
    379
    Address:
    Kherson, Ukraine
    Country:
    Location on Map:
    В моем Зандстре это страницы 131-133, но там вроде очень доступно объяснено.
    Лучше скажи что непонятно?
     
  3. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    PHP:
    class A{

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

    }
     
    denisOg и korpus нравится это.
  4. korpus

    korpus злой бобёр

    Сообщения:
    341
    Address:
    Novosibirsk, Russia
    Country:
    Location on Map:
    Примеры нужны, и классификация. Примерно как у WMIx.
     
  5. Dez

    Dez Новичок

    Сообщения:
    379
    Address:
    Kherson, Ukraine
    Country:
    Location on Map:
    У вмикса не совсем корректно, а про ассоциации вообще не верно, не важно где созданы объекты, важно их взаимоотношение.
    Ассоциация - просто наличие с св-ве одного объекта ссылки на другой объект. Что тут непонятного?
     
  6. korpus

    korpus злой бобёр

    Сообщения:
    341
    Address:
    Novosibirsk, Russia
    Country:
    Location on Map:
    А агрегация что такое, а композиция? Самое простое про все эти отношения можно сказать "что один объект имеет ссылку на другой объект". Но это не так много объясняет.
     
  7. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    korpus
    Это правда, Ассоциация это и Композиция и Агрегация. но в 2х последних говориться также о месте хранения обьекта. в первом же случае об этом умалчивается важно лишь что существует связь.

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

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.964
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Агрегация и композиция - одно и то же в том смысле, что и там и там $this->fooObject.

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

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.

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

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

    Dez Новичок

    Сообщения:
    379
    Address:
    Kherson, Ukraine
    Country:
    Location on Map:
    Ассоциация - просто имеет ссылку на какой то объект, с которым ему надо любым образом работать. Например в ф-ции напишешь global $var, получишь доступ к глобальной переменной. А тут через свое какое то св-во можно работать с нужным конкретным объектом (именно экземпляром)

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

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

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.964
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Про уничтожение это ноги растут из GOF с С++ и деструкторами, это не объясняет смысловую разницу. :)

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

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

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

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    fixxxer
    я тоже хотел сказать что это перестало иметь огромный смысл с того момента мы перестали различать переменную как адрес *xyz и как полноценную структуру.. это и про яву кажись
     
  13. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.964
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Да собственно даже с shared_ptr в С++ я разницу перестаю замечать. ;)
     
  14. korpus

    korpus злой бобёр

    Сообщения:
    341
    Address:
    Novosibirsk, Russia
    Country:
    Location on Map:
    Можно посмотреть на перевод слов "aggregation" и "composition" с английского. Вероятно, в английском языке это совсем разные термины.
    И это ещё не паттерны ;).
     
  15. korpus

    korpus злой бобёр

    Сообщения:
    341
    Address:
    Novosibirsk, Russia
    Country:
    Location on Map:
    В книге Зандстры для каждого из терминов (ассоциация, композиция, агрегация) на диаграмме UML вводится своё собственное обозначение, кстати. То есть можно сказать, что иногда, если точно не известно отношение между объектами, то можно поставить простую ассоциацию?
     
  16. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    Код:
    ---------------------   символ ассоциации
    *                  x   
    
    -------------------<>   символ конкретной ассоциации (агрегация, если ромб закрашен - композиция)
    *                  x
    
     
  17. fixxxer

    fixxxer К.О. Партнер клуба

    Сообщения:
    12.964
    Ваш город:
    Moscow, Russia
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Да понятно что еще не паттерны, паттерны начинаются в С++ - где память выделяется, где освобождается. В PHP имеет смысл рассматривать только разницу между

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

    korpus злой бобёр

    Сообщения:
    341
    Address:
    Novosibirsk, Russia
    Country:
    Location on Map:
    Мне показалось, что разобраться в них как раз стоит. Хотя бы для расширения своего понимания. И проще разные паттерны разбирать. Посмотри на прилагаемое к статье изображение http://ru.wikipedia.org/wiki/Стратегия_(шаблон_проектирования). В книге Зандстры получше про шаблон написано, чем на википедии.
     
  19. korpus

    korpus злой бобёр

    Сообщения:
    341
    Address:
    Novosibirsk, Russia
    Country:
    Location on Map:
    В книге ещё есть
    Код:
    -------------------->   направленная ассоциация
    *                  x
    <------------------->  двунаправленная ассоциация
    *                  x
    
     
  20. WMix

    WMix герр M:)ller Партнер клуба

    Сообщения:
    6.311
    Ваш город:
    Berlin
    Address:
    Berlin, Germany
    Country:
    Location on Map:
    korpus нравится это.