Удивительно, как много путаницы существует в отношении различия между агрегированием и составом концепций ассоциации « часть – целое». . Основная проблема - это широко распространенное заблуждение (даже среди опытных разработчиков программного обеспечения и среди авторов UML), что концепция композиции подразумевает зависимость жизненного цикла между целым и его частями, так что части не могут существовать без целого. Но эта точка зрения игнорирует тот факт, что бывают также случаи ассоциаций части и целого с неделимыми частями, когда части могут быть отделены от целого и пережить разрушение целого.
В документе спецификации UML определение термина «композиция» всегда подразумевало не разделяемые части, но не было ясно, что является определяющей характеристикой «композиции», а что является просто необязательной характеристикой. Даже в новой версии (по состоянию на 2015 год), UML 2.5, после попытки улучшить определение термина «композиция», он остается неоднозначным и не дает никаких указаний по моделированию частично целых ассоциаций с не разделяемыми части, в которых части могут быть отделены от целого и выдерживают разрушение целого, в отличие от случая, когда части не могут быть отделены и разрушаются вместе с целым. Они говорят
При удалении составного объекта все экземпляры его частей, являющиеся объектами, удаляются вместе с ним.
Но в то же время говорят
Частичный объект может быть удален из составного объекта перед удалением составного объекта и, таким образом, не может быть удален как часть составного объекта.
Эта путаница указывает на неполноту определения UML, которое не учитывает зависимости жизненного цикла между компонентами и композитами. Поэтому важно понимать, как определение UML может быть улучшено путем введения стереотипа UML для « неотделимых» композиций, когда компоненты не могут быть отделены от их композиции и, таким образом, должны уничтожаться всякий раз, когда их композиция разрушается.
Сочинение
Как объяснил Мартин Фаулер , главная проблема для характеристики композиции состоит в том, что «объект может быть только частью одного отношения композиции». Это также объясняется в отличном сообщении блога « Состав UML против агрегирования против ассоциации » Гирта Беллекенса. В дополнение к этой определяющей характеристике композиции (иметь эксклюзивные или не подлежащие совместному использованию части) композиция также может иметь зависимость жизненного цикла между композитом и его компонентами. На самом деле существует два вида таких зависимостей:
- Каждый раз, когда компонент всегда должен быть присоединен к композиту, или, другими словами, когда он имеет обязательный состав , что выражается кратностью "ровно один" на композитной стороне линии компоновки, он должен либо использоваться повторно. в (или повторно присоединен) к другому составу, или уничтожается, когда его текущий состав разрушается. Примером этого служит композиция между
Person
и Heart
, показанная на диаграмме ниже. Сердце либо разрушается, либо пересаживается другому человеку, когда его владелец умирает.
- Когда компонент не может быть отделен от своего композита, или, другими словами, когда он неразделим , тогда и только тогда компонент должен быть уничтожен, когда его состав разрушен. Примером такой композиции с неразрывными частями является композиция между
Person
и Brain
.
Таким образом, зависимости жизненного цикла применимы только к конкретным случаям композиции, но не в целом, поэтому они не являются определяющей характеристикой.
Спецификация UML гласит: «Часть может быть удалена из составного экземпляра до того, как будет удален составной экземпляр, и, следовательно, не может быть удалена как часть составного экземпляра». В примере композиции Car
- Engine
, как показано на следующей диаграмме, очевидно, что двигатель может быть отсоединен от автомобиля до того, как автомобиль будет разрушен, и в этом случае двигатель не будет разрушен и может быть использован повторно. Это подразумевается нулевой или одной кратностью на составной стороне линии композиции.
Кратность конца ассоциации композиции , по меньшей композиционной стороне равна 1 или 0..1, в зависимости от того , если компоненты имеют обязательный композит (должно быть присоединены к составному) или нет. Если компоненты неразделимы , это означает, что они имеют обязательную композицию.
Агрегация
Агрегация - это еще одна особая форма ассоциации с предполагаемым значением отношения «часть – целое», когда части целого могут быть разделены с другими целыми. Например, мы можем смоделировать агрегацию между классами DegreeProgram
и Course
, как показано на следующей диаграмме, поскольку курс является частью программы на получение степени, и курс может быть разделен между двумя или более программами получения степени (например, степень инженера может совместно использовать C курс программирования со степенью информатики).
Однако концепция агрегации с разделяемыми частями на самом деле не имеет большого значения, поэтому она не имеет никаких последствий для реализации, и поэтому многие разработчики предпочитают не использовать белый ромб в своих диаграммах классов, а просто моделировать простую ассоциацию. вместо. Спецификация UML гласит: «Точная семантика совместной агрегации зависит от области приложения и разработчика».
Кратность конца ассоциации агрегации по крайней всей стороне может быть любое число (*) , так как часть может принадлежать или совместно среди, любого количества целостностей.