Асоціації vs Агрегування vs Композиція vs Ставлення до використання, PHPClub - клуб розробників

злий бобер

Вивчаю книгу Метта Зандстри, яка називається "PHP. Об'єкти, шаблони та методики програмування". На сторінках 146 -148 описуються можливі відносини між об'єктами та наводяться їх UML-діаграми. Це такі відносини як "Асоціація", "Агрегування", "Композиція". У чому між цими відносинами різниця та у чому їх особливості? Може десь є добрий опис цих відносин? Вони були б корисні будь-кому, тому що без них розуміння багатьох шаблонів стає скрутним.

UPDATE. У назві теми застосовано термін "Ставлення використання", але цей термін лівий. Немає можливості підправити.

гер M:)ller
злий бобер
злий бобер
гер M:)ller

korpusЦе правда, Асоціація це і Композиція та Агрегація. Однак у 2-х останніх йдеться також про місце зберігання об'єкта. у першому ж випадку про це замовчується важливо, що існує зв'язок.

коли це питання виникає запитання $a=new A що буде якщо ми знищимо об'єкт $a, знищиться також $this->c і $this->d[] з усім вмістом або щось буде ще в пам'яті?

Агрегація і композиція - те саме в тому сенсі, що і там і там $this-fooObject.

Сенс у відносинах між $this та fooObject.

гер M:)ller

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

Композиція (агрегування за значенням) — суворіший варіант агрегування, коли об'єкт, що включається, може існувати тільки як частина контейнера.Якщо контейнер буде знищено, то включений об'єкт теж буде знищений.

Асоціація - просто має посилання на якийсь об'єкт, з яким йому треба будь-яким чином працювати. Наприклад, у ф-ції напишеш global $var, отримаєш доступ до глобальної змінної. А тут через своє якесь св-во можна працювати з потрібним конкретним об'єктом (саме екземпляром)

Композиція - це де насправді об'єкт складається з інших об'єктів, як кавун складається з м'якоті, насіння і кірки.

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

Про знищення це ноги ростуть із GOF із С++ та деструкторами, це не пояснює смислову різницю.

Що з них якесь, я сам весь час плутаю =)

Взагалі це не те, чим варто забивати собі голову є куди більш виразні та корисні патерни, без танців навколо тонких відмінностей між has_a, is_a та contains. Це з'явилося в GoF з прикладу З++, де важливе управління пам'яттю; з GC різниця стає виключно смисловою та практично непомітною.

гер M:)ller
злий бобер

Про знищення це ноги ростуть із GOF із С++ та деструкторами, це не пояснює смислову різницю.

Що з них якесь, я сам весь час плутаю =)

Взагалі це не те, чим варто забивати собі голову є куди більш виразні та корисні патерни, без танців навколо тонких відмінностей між has_a, is_a та contains. Це з'явилося в GoF з прикладу З++, де важливе управління пам'яттю; з GC різниця стає виключно смисловою та практично непомітною.