Я запутался в некоторых обозначениях диаграмм классов UML.
Я уверен, что знаю, что такое Ассоциация . Любые отношения между экземплярами двух классов, где экземпляру одного класса необходимо знать об экземпляре второго класса для выполнения своей работы, - это отношения Ассоциации. Ассоциация часто означает, что класс A имеет ссылку (поле) на экземпляр класса B.
Однако мне сложно понять, что означают стрелки « Агрегация» и « Состав» . Часть моего замешательства была вызвана столкновением разных определений этих обозначений.
Два определения обозначения агрегации :
Определение 1: нотация агрегации между двумя классами подходит всякий раз, когда экземпляр класса A содержит коллекцию экземпляров класса B (например, List, Array и т. Д.).
Определение 2. Ссылка агрегации между двумя классами подходит, если экземпляр класса A содержит ссылку на экземпляр класса B, а экземпляр B зависит от жизненного цикла экземпляра A. Значение: когда экземпляр класса A удаляется, то же самое происходит и с экземпляром класса B. Экземпляр класса B полностью содержится в экземпляре класса A, в отличие от экземпляра класса A, просто владеющего ссылкой на экземпляр класса класс B (который является регулярной ассоциацией).
Что касается обозначения «Состав» и того, как оно отличается от обозначения «Агрегация», я не уверен.
Пожалуйста, уточните определения и помогите мне понять. Конкретные примеры приветствуются.
источник
Ответы:
Три звена Ассоциация, Агрегация и Композиция образуют своего рода шкалу того, насколько тесно два класса связаны друг с другом.
На одном конце шкалы находится Ассоциация, где объекты двух классов могут знать друг о друге, но они не влияют на время жизни друг друга. Объекты могут существовать независимо, и какой объект класса A знает, какие объекты класса B могут изменяться со временем.
На другом конце шкалы находится композиция. Композиция представляет отношение часть-целое, так что класс B является неотъемлемой частью класса A. Это отношение обычно используется, если объекты класса A не могут логически существовать без наличия объекта класса B.
Отношение агрегации находится где-то между этими двумя целями, но, кажется, никто не согласен, где именно, поэтому также нет универсально согласованного определения того, что означает агрегация. В этом смысле оба найденных вами определения верны, и если вы спросите 10 человек, вы рискуете получить 11 разных определений.
источник
Композиция - это когда
object A
содержитobject B
иobject A
также несет ответственность за созданиеobject B
.Композиционные отношения
У нас есть класс A, который будет использоваться классом B.
Есть несколько вариантов того, как может выглядеть композиция.
Прямая инициализация композиции:
Состав инициализации конструктора
Ленивая инициализация композиции
Вы видите, что это создает тесные отношения между классами
A
иB
. КлассB
просто не может существовать безA
. Это огромное нарушение принципа внедрения зависимостей , которое гласит:Композиция иногда имеет смысл, например, вызов
new DateTime
в php илиnew std::vector<int>
в C ++. Но чаще всего это предупреждение о том, что ваш код написан неправильно.В случае, когда
class A
будет специальным объектом, используемым для кэширования,class B
он всегда будет кэшироваться с использованием реализацииclass A
, и у вас не будет контроля для его динамического изменения, что плохо.Кроме того, если вы использовали ленивую композицию инициализации , то есть у вас есть рабочий
object B
, называемыйuseA()
методом и созданиемobject A
не удастся, ваш файлobject B
внезапно окажется бесполезным.Агрегация, с другой стороны, является способом взаимоотношений, который следует принципу DI .
object B
необходимо использоватьobject A
, то вы должны передать уже созданный экземплярobject A
дляobject B
, и если созданиеobject A
завершится ошибкой, ничего не будет передано в первую очередь.Короче, Агрегация - это представление UML для принципа внедрения зависимостей , будь то внедрение конструктора, установка сеттера или внедрение открытого свойства.
Это все агрегации
Самая тесная инъекция в конструктор (
object B
не может существовать безobject A
).Слабее (вы можете или не можете использовать
object A
внутриobject B
, но если вы это сделаете, вы, вероятно, должны установить его первым).Через сеттер:
Через общественную собственность:
На самом деле нет хорошего способа оправдать использование Aggregation over Composition, если все, что вы используете, - это конкретные реализации классов, но как только вы начнете внедрять интерфейсы или в случае абстрактных классов C ++, внезапно Aggregation станет единственным способом выполнить ваш контракт.
источник
Кроме того, выдержка из текущего стандарта UML:
11.5.4 Ассоциации - Семантика - Обозначения
9.5.4 Классификация - Свойства - Обозначения
источник
Я уже разместил ответ на Stackoverflow .
По сути, агрегация сильнее, чем простая ассоциация, но агрегированные объекты могут «жить» друг без друга, как при простой ассоциации.
Композиция даже сильнее, чем агрегация, потому что агрегированный класс не может быть агрегирован другими классами. Его «жизнь» зависит от контейнера.
источник