Открытая коллекция знаний

OpenU.Ru

Справочник UML. Объектно-ориентированное проектирование.

aggregation (агрегация)

Форма ассоциации, описывающая отношение часть-целое между агрегатом (целое) и композитом (частное).
См, composition.

Семантика

Бинарная ассоциация может быть объявлена как отношение часть-целое. Один полюс ассоциации обозначает агрегат, а другой полюс никак не маркирован. При этом оба полюса не могут быть агрегатами (или композитами) одновременно. Бывает, что оба полюса ассоциации никак не маркированы - в этом случае ассоциация не является агрегацией.
Связи, являющиеся экземплярами агрегации, подчиняются определенным правилам. Отношение агрегации транзитивно и асимметрично во всех связях агрегации, даже в тех, которые принадлежат различным агрегациям. Транзитивность означает, что можно сказать "Б является частью А" в случае, когда линия агрегации идет к А (то есть от части к целому), причем, возможно, через промежуточные объекты. Асимметричность означает отсутствие циклов. Иными словами, объект не может напрямую или опосредованно быть частью самого себя. Объединяя оба правила (асимметричность и транзитивность), получаем, что граф связей агрегации всех агрегированных ассоциаций представляет собой частично упорядоченный граф. Частично упорядоченный граф - это граф, в котором нет циклов. Например, одним из стандартных вариантов частично упорядоченного графа является дерево (рис. 18).
Рис 18. Агрегация объектов ациклична
Рис 18. Агрегация объектов ациклична
ПРИМЕЧАНИЕ: В нотации UML не принято "агрегировать" объекты, это прерогатива классов, этот рисунок всего лишь наглядный пример агрегации.
Ориентированный маршрут связей между объектом Б и объектом А подразумевает наличие ориентированного маршрута агрегированных ассоциаций от класса Б к классу А. Маршрут ассоциаций может включать в себя циклы, в которых один и тот же класс может появляться более одного раза. Ориентированный маршрут агрегированной ассоциации, идущей от класса к самому себе, называется рекурсией.
Существует более сильная форма ассоциации, которая называется композицией. Композит - это агрегат, имеющий дополнительное ограничение: объект может быть частью только одного композита, а композитный объект несет всю ответственность за управление своими частями (то есть за их создание и уничтожение).
См. более подробно в статье энциклопедии composition.
В простой агрегации часть может принадлежать одному или нескольким агрегатам, а может существовать и независимо от них. Агрегат не может обойтись без частей, так как он представляет собой их совокупность. В отличие от него части могут существовать сами по себе. При этом они не будут рассматриваться как части. Например, маршрут представляет собой нечто большее, нежели совокупность его сегментов. Сегмент же может существовать независимо от того, является он частью маршрута или нет. Кроме того, сегмент может быть частью сразу нескольких маршрутов.
См. более подробно о свойствах агрегации в статьях энциклопедии association и association end.

Нотация

Агрегация изображается на диаграммах в виде не закрашенного ромба, который находится на том полюсе ассоциации, который подходит к классу-агрегату (рис. 19). В случае если это сильная форма агрегации (то есть композиция), ромб закрашивается (рис. 68). Оба полюса ассоциации значками агрегации заканчиваться не могут.
Рис. 19. Нотация агрегации
Рис. 19. Нотация агрегации
У класса-агрегата есть несколько частей. Отношение между классом-агрегатом и его частями является отдельной ассоциацией (рис. 20).
Рис. 20. Агрегат и несколько его частей
Рис. 20. Агрегат и несколько его частей
Когда у одного класса-агрегата есть две или более агрегации, их можно нарисовать в виде дерева, у которого все полюса агрегации объединены в один сегмент (рис. 21). Для такого объединения необходимо, чтобы все полюса агрегаций соответствовали друг другу, например, имели одинаковую множественность. Изображение агрегации в виде дерева не несет в себе никакой дополнительной семантики - это просто еще одна форма презентации.
Рис. 21. Нотаций в виде дерева, изображающая множественные агрегации одного класса
Рис. 21. Нотация в виде дерева, изображающая множественные агрегации одного класса

Обсуждение

Разница между агрегацией и ассоциацией в большей степени является вопросом личного предпочтения разработчика, а не семантики. Всегда помните, что агрегация - это ассоциация. Агрегация несет в себе идею, что агрегат является совокупностью своих частей. Единственной новой семантической чертой, которую агрегация добавляет к ассоциации, является ограничение на цикличность связей. Все прочие ограничения (такие как зависимости существования) определяются множественностью, а не значком агрегации. Несмотря на всю скудность семантики агрегации, многие разработчики рассматривают ее как обязательную часть моделирования. Мы бы рекомендовали относиться к ней как к дополнительному, а не обязательному средству.
С агрегацией связано несколько второстепенных свойств, которые не были включены в определение агрегации. К ним относятся передача операций от агрегата к его частям (например, операция перемещения) и компактное распределение памяти (употребляется для того, чтобы агрегат и его части можно было загрузить с помощью одного обращения к памяти). Некоторые авторы различают несколько видов агрегации, но нам кажется, что различия между этими видами слишком слабы, чтобы считать их необходимыми при стандартном моделировании.
Агрегация представляет собой свойство, выходящее за пределы отдельной ассоциации. Можно построить агрегацию из разных пар классов, и результатом будет новая агрегация. Агрегация накладывает ограничение на экземпляры всех агрегированных ассоциаций (включая и композиции), запрещающее цикличность связей, включая те, которые существуют между различными ассоциациями. В некотором роде агрегация является обобщением ассоциации, в котором к ассоциациям различных видов применяются одни и те же ограничения и операции.
Композиция имеет более специфическую семантику, которая касается физического хранения объектов и различных аспектов их принадлежности другим объектам. Композицию можно использовать тогда, когда каждая часть принадлежит только одному объекту и не существует независимо от этого объекта. Лучше всего использовать композицию в тех случаях, когда части должны быть размещены в памяти и проинициализированы во время создания агрегата (части не могут пережить уничтожение своего владельца). Этими свойствами обладают атрибуты классов, поэтому их можно считать определенного рода композицией, хотя они и не моделируются подобным образом. С помощью композиций можно избежать таких опасностей, как появление провисших указателей или осиротевших объектов. Композицию используют также в ситуациях, когда в целях инкапсуляции и удобства манипулирования несколько атрибутов помещают в отдельный класс, хотя в действительности они относятся к основному классу. Еще одним вероятным кандидатом в качестве композитной части выступают классы-контейнеры, реализующие ассоциации (несмотря на то, что, как правило, они создаются с помощью генераторов кода, а не моделируются). Не забудьте, что у композитной части, такой как класс-контейнер, например, могут быть ссылки (указатели) на не композитные части. При этом объекты, на которые делаются ссылки, не уничтожаются вместе со ссылавшимся объектом.

Алфавитный указатель