Дивно , як багато плутанини існує розбіжності між частину-ціле - об'єднання понять агрегації і композиції . Основною проблемою є поширене непорозуміння (навіть серед експертів-розробників програмного забезпечення та серед авторів UML), що поняття композиції передбачає залежність життєвого циклу між цілим та його частинами, так що частини не можуть існувати без цілого. Але ця точка зору ігнорує той факт, що існують також випадки часткових цілих асоціацій з нерозподіленими частинами, де ці частини можна від'єднати від цілого і пережити його руйнування.
У документі специфікації UML визначення поняття "композиція" завжди передбачало нерозмінні частини, але не було ясно, що є визначальною характеристикою "композиції", а що є просто необов'язковою характеристикою. Навіть у новій версії (станом на 2015 рік), UML 2.5, після спроби вдосконалити визначення поняття "склад", він все ще залишається неоднозначним і не містить жодних вказівок щодо моделювання частково-цілих асоціацій з не- спільні частини, де частини можна від’єднати від цілого і пережити його знищення, на відміну від випадку, коли частини неможливо від’єднати і знищуються разом із цілим. Вони кажуть
Якщо складений об’єкт видаляється, усі його екземпляри частин, які є об’єктами, видаляються разом із ним.
Але в той же час вони також говорять
Об'єкт-частина може бути видалений із складеного об'єкта до того, як складений об'єкт буде видалений, і, отже, не буде видалений як частина складеного об'єкта.
Ця плутанина вказує на неповноту визначення UML, яке не враховує залежності життєвого циклу між компонентами та композитами. Тому важливо зрозуміти, як можна вдосконалити визначення UML, запровадивши стереотип UML для << нерозривних >> композицій, де компоненти неможливо від'єднати від їх композиту, і, отже, їх потрібно знищувати щоразу, коли їх композит руйнується.
1) Склад
Як пояснив Мартін Фаулер , головне питання, що характеризує композицію, полягає в тому, що "об'єкт може бути лише частиною одного композиційного зв'язку". Це також пояснюється у чудовому дописі в блозі UML Composition vs Aggregation vs Association від Geert Bellekens. На додаток до цієї визначальної характеристики композиції (щоб мати ексклюзивні або нерозподіляються частини), композиція може також мати залежність життєвого циклу між композитом та його компонентами. Насправді існує два види таких залежностей:
- Кожного разу, коли компонент завжди повинен бути приєднаний до композиту, або, іншими словами, коли він має обов’язковий композит , що виражається кратністю "рівно одна" на складовій стороні композиційної лінії, тоді він повинен бути використаний повторно в (або знову прикріплений до) іншого композиту або знищений, коли його нинішній композит знищений Прикладом цього є склад між
Person
і Heart
, показаний на діаграмі нижче. Серце або знищується, або пересаджується іншій людині, коли його власник помер.
- Коли компонент не може бути від'єднаний від композиту, або, іншими словами, коли він невіддільний , тоді і лише тоді компонент повинен бути знищений, коли його композит зруйнований. Прикладом такої композиції з нероздільними частинами є композиція між
Person
і Brain
.
Підсумовуючи, залежності життєвого циклу стосуються лише конкретних випадків складу, але не в цілому, тому вони не є визначальною характеристикою.
У специфікації UML зазначено: "Частина може бути видалена зі складеного екземпляра перед тим, як складений екземпляр буде видалений, і, отже, не може бути видалена як частина складеного екземпляра." У прикладі a Car
- Engine
композиції, як показано на наступній схемі, очевидно, що двигун можна від'єднати від автомобіля до того, як автомобіль буде зруйнований, і в цьому випадку двигун не руйнується і може бути використаний повторно. Це передбачається нульовою або однією кратністю на складеній стороні композиційної лінії.
Кратність кінця асоціації композиції , по меншій композиційної стороні дорівнює 1 або 0..1, в залежності від того , якщо компоненти мають обов'язковий композит (повинно бути приєднані до складеного) чи ні. Якщо компоненти нероздільні , це означає, що вони мають обов’язковий композит.
2) Агрегація
Агрегація - це ще одна особлива форма асоціації із передбачуваним значенням відносини частина ціле, коли частини цілого можуть ділитися з іншими цілими. Наприклад, ми можемо змоделювати агрегування між класами, DegreeProgram
і Course
, як показано на наступній схемі, оскільки курс є частиною дипломної програми, і курс може бути спільним для двох або більше дипломних програм (наприклад, інженерний ступінь може поділяти C курс програмування зі ступенем інформатики).
Однак концепція агрегації з частинами, що діляться, насправді не означає багато, тому вона не має жодних наслідків для реалізації, тому багато розробників вважають за краще не використовувати білий діамант у своїх діаграмах класів, а просто моделюють просту асоціацію натомість. У специфікації UML сказано: "Точна семантика спільного агрегування залежить від області застосування та моделятора".
Кратність кінця асоціації агрегації по крайней всій стороні може бути будь-яке число (*) , так як частина може належати або спільно серед, будь-якої кількості цілісності.