Агрегация UML против ассоциации - PullRequest
47 голосов
/ 10 марта 2012

Вот я с другим вопросом об агрегации и ассоциации. Я хотел изучить некоторые основы UML, поэтому я начал читать «UML дистиллированный» Мартина Фаулера. Я прочитал обе главы о классах, и есть одна вещь, которую я не могу полностью понять, я думаю, это агрегация против ассоциации. В книге есть эта цитата:

В дни до UML люди обычно были довольно расплывчаты в отношении того, что было агрегацией и что было ассоциация. Независимо от того, были ли они расплывчаты или нет, они всегда были несовместимы со всеми остальными. В следствии, Многие моделисты считают, что агрегация важна, хотя и по разным причинам. Так что UML включена агрегация (рис. 5.3), но практически без семантики. Как говорит Джим Рамбо: «Подумай об этом как моделирующее плацебо " [Rumbaugh, UML Reference].

Как я понимаю из этой цитаты и тем, которые я читаю в Переполнении стека, не имеет значения, какое из этих двух отношений я использую, они означают в основном то же самое, или есть ли ситуации, когда использование агрегации вместо ассоциации было бы оправданным, и / или я не мог бы поменять одно на другое без изменения «значения» диаграммы классов?

Я спрашиваю об этом, потому что эта книга написана в 2003 году, и некоторые вещи могли измениться за эти несколько лет.

Ответы [ 8 ]

29 голосов
/ 10 марта 2012

Может быть, это может вам помочь, но я не думаю, что вы найдете идеальное объяснение:

Разница заключается в подтексте. Агрегация обозначает целое / часть отношения, тогда как ассоциации нет. Тем не менее, нет вероятно, будет большая разница в том, как эти два отношения реализованы. То есть было бы очень сложно взглянуть на код и определить, должны ли быть определенные отношения агрегация или ассоциация. По этой причине довольно безопасно полностью игнорировать отношение агрегации.
[Роберт С. Мартин | UML]

И пример для каждой ситуации:

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

б) Агрегация - это специализированная форма ассоциации, где все объекты имеют свой жизненный цикл, но есть собственность и дочерний объект не может принадлежать другому родительскому объекту. Давайте возьмем пример кафедры и преподаватель. Один учитель не может принадлежать несколько отделов, но если мы удалим отдел, объект учителя не будет уничтожен. Мы можем думать об отношениях "есть".
[Маеш | GeeksWithBlogs]

27 голосов
/ 10 марта 2012

Заявление Румбо - самый красноречивый и добрый совет дяди Боба.Как я уже сказал в другом месте , Агрегация семантически настолько слаба, что не предлагает ничего практически полезного.У него есть только один действительный угловой случай (ацикличность рекурсивных отношений), однако мало кто знает и понимает это.Так что в конечном итоге вам все равно придется указывать в комментариях.

Я просто не пользуюсь им.И никогда не чувствовал никакой потери.Придерживайтесь простых бинарных ассоциаций и сосредоточьтесь на том, что действительно имеет значение - на кардинальном учете и правильном названии.Вы получите гораздо больше от этого, чем попытаться решить неразрешимую связь с агрегацией.

hth.

3 голосов
/ 31 мая 2013

Я склонен использовать Агрегацию, чтобы показать отношение, аналогичное Композиции, с одним большим отличием: содержащий класс НЕ отвечает за жизненный цикл содержащегося объекта.Как правило, (ненулевой) указатель или ссылка на объект, который будет содержаться, передается конструктору содержащего класса.Содержащий объект в течение его жизненного цикла зависит от существующего содержащегося объекта.Содержащий объект не может выполнять свою работу (полностью) без содержащегося объекта.Это моя интерпретация отношения «часть / целое», подразумеваемая агрегацией.

0 голосов
/ 01 марта 2017

Чтобы добавить, я бы просто предложил скачать спецификацию UML с сайта OMG: лучшая ссылка и см. Стр. 110.

нет Указывает, что у свойства нет семантики агрегации.

shared Указывает, что свойство имеет общую семантику агрегации. Точная семантика совместной агрегации зависит от области применения и модели.

составной Указывает, что свойство агрегируется составным образом, т.е. составной объект несет ответственность за существование и хранение составных объектов (см. определение частей в 11.2.3).

0 голосов
/ 28 февраля 2017

Этот термин часто путается.

Агрегация и состав являются одними из типов ассоциации. Едва ли существует разница между агрегатами и ассоциациями во время реализации, и многие вообще пропускают отношения агрегации в своих диаграммах с ассоциациейотношение.

Вы можете получить представление из этой аналогии.

Класс: A (человек) и Класс: B (автомобиль) имеет ассоциативное отношение , если Класс: A имеет Класс: B декларация, а также Класс: B (автомобиль) объект не обязателен для создания Класс: A (человек) объект.

Класс: A (автомобиль) и Класс: B (шина) имеет отношение агрегации , если Класс: A имеет Класс: B декларация, а также Класс: B(шина) объект необходим для создания класса: A (автомобиль) объект.

ура!

0 голосов
/ 08 августа 2016

В реализации нет большой разницы, но концептуально есть большая разница: агрегации используются для выражения иерархии . При работе с иерархией компонентов в корневом интерфейсе необходимо выполнить определенные операции:

  • найти подкомпоненты в иерархии
  • добавить / удалить подкомпоненты в / из иерархии
  • изменить общие атрибуты всех компонентов
  • рекурсивно пересечь иерархию (шаблон посетителя)
  • перенастроить иерархию и связи (связи) между компонентами

Большинство этих операций не требуется при работе с ассоциациями.

0 голосов
/ 11 июля 2016

Они не имеют в виду одно и то же!Я могу выразить это так:

Ассоциативные отношения : класс ссылается на другой класс.На самом деле это показывает, что класс связан с другим классом, но они не обязательно имеют атрибуты, чтобы показать эту связь ... например, классы «Учитель» и «Студент», хотя класс «Учитель» не имеет атрибута, который относится к студентам, номы действительно знаем, что в действительности у учителя есть ученики ... А также у класса «Школьный» есть свойства «учителя» и «ученики», которые теперь связывают эти два класса друг с другом.

Агрегацияотношение : класс содержит другой класс.Но если контейнер (ClassRoom) уничтожен, содержащийся (Chair) нет.На самом деле ClassRoom владеет кафедрой.Агрегация - это более сильная связь, чем связь Ассоциации.

Вот также учебник об этом и целом UML2.0, который объясняет все легко и просто, вы можете найти его полезным: https://github.com/imalitavakoli/learn-uml2

СОВЕТ : Также позвольте мне упомянуть, что поскольку Ассоциативное отношение существует между классами большую часть времени, мы иногда не рисуем его, чтобы предотвратить ненужную сложность.

0 голосов
/ 10 марта 2012

В UML агрегация недостаточно определена, и поскольку у них нет четко определенной семантики. Действительный вариант использования агрегации - это инкапсуляция нескольких классов, как указано в «Управлении доменами» Эрика Эванса.

например. У машины четыре колеса. Возможно, вы захотите рассчитать общее количество метров, которое проехало каждое колесо, для каждой машины. Этот расчет выполняется объектом-автомобилем, поскольку он знает, какие у него колеса, и вам все равно, какие колеса принадлежат какому автомобилю.

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

Таким образом, в основном агрегация инкапсулирует набор классов, которые принадлежат друг другу.

...