Агрегация UML против ассоциации
вот я, с другим вопросом об агрегации и ассоциации. Я хотел изучить некоторые основы UML, поэтому я начал читать "UML distilled" Мартина Фаулера. Я прочитал обе главы о классах, и есть одна вещь, которую я не могу полностью понять, я думаю, и это агрегация против ассоциации. В книге есть такая цитата:
в дни до UML люди обычно были довольно расплывчатыми о том, что такое агрегация и что такое ассоциация. Неясно или нет, они всегда были несовместимы со всеми остальными. В результате, многие моделисты считают, что агрегация важна, хотя и по разным причинам. Так УЯМ включенная агрегация (рис. 5.3), но почти без семантики. Как говорит Джим Рамбо: "подумайте об этом в качестве модельного плацебо"[Rumbaugh, UML Reference].
Как я понимаю из этой цитаты и тем, которые я читал при переполнении стека, не имеет значения, какое из этих двух отношений я использую, они означают bassicly то же самое, или есть какая-либо ситуация, когда использование агрегации вместо ассоциации было бы оправдано и/или я не мог бы изменить один на другой без изменения "значения" диаграммы классов?
Я спрашиваю это, потому что эта книга из 2003 года, и некоторые вещи могут измениться за эти несколько лет.
8 ответов
заявление Рамбо-самый красноречивый и хороший совет дяди Боба. Как я уже сказал!--1-->везде, агрегация семантически настолько слаба, что не предлагает ничего практически полезного. Он имеет только один допустимый угловой случай (ацикличность рекурсивных отношений), однако мало кто знает и понимает это. Так что вам все равно придется указывать в комментариях.
Я просто не использую его. И никогда не чувствовал никакой потери. Придерживайтесь простых бинарных ассоциаций и сосредоточьтесь на что действительно имеет значение-получение мощности и право именования. Вы получите гораздо больше, чем пытаясь решить неразрешимую ассоциацию против агрегации.
hth.
возможно, это может помочь вам, но я не думаю, что вы найдете идеальное объяснение:
разница заключается в импликации. Агрегация обозначает целое / часть отношения, тогда как ассоциации-нет. Однако, нет вероятно, будет большая разница в том, как эти два отношения выполненный. То есть, было бы очень сложно посмотреть на код и определить, должны ли определенные отношения быть агрегация или ассоциация. Для эта причина, довольно безопасна к полностью игнорируйте отношение агрегации.
[Robert C. Martin / UML]
и пример для каждой ситуации :
A) ассоциация-это отношение, в котором все объекты имеют свои собственные жизненный цикл и нет владельца. Возьмем пример учителя и Студент. Несколько студентов могут общаться с одним учителем и один студент может общаться с несколькими учителями, но нет собственность между объектами и оба имеют свой жизненный цикл. Оба может создавать и удалять самостоятельно.
б) агрегация-это разновидность ассоциации, где все объекты имеют свой собственный жизненный цикл, но есть собственность и детей объект не может принадлежать другому родительскому объекту. Давайте возьмем пример кафедры и преподавателя. Один учитель не может принадлежать несколько отделов, но если мы удалим отдел, объект teacher не будет уничтожен. Мы можем думать об отношениях "имеет-а".
[Маеш / GeeksWithBlogs]
Я склонен использовать агрегацию, чтобы показать отношение, которое совпадает с композицией с одним большим различием: содержащий класс не отвечает за жизненный цикл содержащегося объекта. Как правило (не-null) указатель или ссылка на объект, который будет содержаться передается конструктору содержащего класса. Содержащийся объект в течение своего жизненного цикла зависит от существующего содержащегося объекта. Содержащего данный объект не может выполнять свою работу (полностью) без содержащихся объект. Это моя интерпретация отношения "часть / целое", подразумеваемого агрегацией.
в UML агрегация недоопределена и поскольку у них нет четко определенной семантики. Допустимым вариантом использования агрегации является инкапсуляция нескольких классов, как указано в "Domain Driven Design" Эрика Эванса.
Е. Г. автомобиль имеет четыре колеса. Возможно, вы захотите рассчитать общее количество метров, которые каждое колесо проехало для каждого автомобиля. Этот расчет выполняется Car-entity, так как он знает, какие колеса у него есть, и вам все равно, какие колеса принадлежат автомобиль.
автомобиль-это корень агрегации для всех его частей, таких как колеса, и вы не можете получить доступ к частям автомобиля извне агрегации, только корень.
таким образом, в основном агрегация инкапсулирует набор классов, которые принадлежат друг другу.
реализация мудрая нет большой разницы, но концептуально есть большая разница:агрегаты используются для выражения иерархии. При работе с иерархией компонентов в корневом интерфейсе необходимо выполнить определенные операции:
- найти подкомпоненты в иерархии
- добавить/удалить компоненты из иерархии
- изменить общие атрибуты всех компонентов
- траверс иерархия рекурсивно (шаблон посетителя)
- перенастроить иерархию и связи (ассоциации) между компонентами
большинство этих операций не требуется при работе с ассоциациями.
этот термин часто путается.
агрегация и состав-это некоторые из типов ассоциаций. там едва ли разница между агрегациями и ассоциациями во время реализация, и многие пропустят агрегационные отношения вообще в их диаграммы с ассоциативным отношением.
вы можете получить идею из этой аналогии.
класс:A(человек) и класс:B(автомобиль) и ассоциация отношении, если Класс: A есть Класс:B декларации, а также класс:B(автомобиль)
чтобы добавить, я бы просто предложил загрузить спецификацию UML с сайта OMG : лучшая ссылка и см. p 110.
none указывает, что свойство не имеет семантики агрегации.
shared указывает, что свойство имеет общую семантику агрегации. Точная семантика общей агрегации зависит от области применения и моделирующего устройства.
composite указывает, что свойство агрегируется compositely, т. е. составной объект несет ответственность за этот существование и хранение составленных объектов (см. Определение частей в 11.2.3).
Они не означают то же самое! Я могу выразить это так:
Ассоциации отношения: класс ссылается на другой класс. На самом деле это показывает, что класс связан с другим классом, но они не обязательно иметь атрибуты, чтобы показать эту связь... например "Учитель" и "ученик" классы, хотя "учитель" класс не имеет атрибут, который относится к студентам, но мы знаем, что в действительности у учителя есть ученики... А также "школьный" класс имеет учителей и "свойства студентов", которые теперь делают эти два класса связанными друг с другом другой.
агрегация отношения: класс содержит другой класс. Но если контейнер(класс) разрушен, то содержащийся (стул) - нет. На самом деле стул принадлежит классу. Агрегация более сильна отношения, чем отношения Ассоциации.
вот также учебник об этом и весь UML2.0, что объясняет все легко и просто, вы можете найти его полезным:https://github.com/imalitavakoli/learn-uml2
совет: также позвольте мне упомянуть это, потому что Ассоциации отношения существует между классами большую часть времени, мы иногда не рисуем его, чтобы предотвратить ненужную сложность.