UML - объединение или агрегация (простые фрагменты кода)

Я свожу с ума, сколько книг противоречит самим себе.

Class A {} class B {void UseA(A a)} //some say this is an association,
no reference is held but communication is possible
Class A {} class B {A a;} //some say this is
    aggregration, a reference is held

Но многие говорят, что проведение ссылки по-прежнему является просто ассоциацией, и для агрегации они используют список - IMHO, это одно и то же, это все еще ссылка.

Я очень смущен, я хотел бы понять проблему.

например. здесь: http://aviadezra.blogspot.cz/2009/05/uml-association-aggregation-composition.html - в чем разница между сильной ассоциацией и агрегированием, в обоих случаях автор использует поле для хранения ссылки.

Другой пример: Говорят, что это Ассоциация:

enter image description here

И это называется Агрегация:

enter image description here

public class Professor {
  // ...
}

public class Department {
  private List<Professor> professorList;
  // ..

}

Опять же, в чем разница? Это ссылка в обоих случаях

Ответ 1

Этот вопрос был и будет задаваться много раз во многих разных вариантах, поскольку многие люди, в том числе многие высококлассные разработчики, путаются в смысле этих терминов, которые были определены в UML. Поскольку вопрос задавался много раз, на него также много ответов. См., Например, этот ответ. Я попытаюсь обобщить определения UML.

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

Необходимо сначала понять логическую концепцию ассоциаций, прежде чем смотреть, как они кодируются. Связь между типами объектов классифицирует отношения между объектами этих типов. Например, ассоциация Committee -has- ClubMember -as-chair, которая визуализируется как линия соединения в диаграмме классов, показанной ниже, может классифицировать отношения, которые финансирует Финансовый комитет-имеет-PeterMiller-as-chair, RecruitmentCommittee - имеет -SusanSmith-as-chair и AdvisoryCommittee-SarahAnderson-as-chair, где объекты PeterMiller, SusanSmith и SarahAnderson имеют тип ClubMember, а объекты FinanceCommittee, RecruitmentCommittee и AdvisoryCommittee имеют тип Committee.

The association Committee-has-ClubMember-as-chair

Связь всегда кодируется с помощью ссылочных свойств, диапазон/тип которой является ассоциированным классом. Например, так:

class Committee { ClubMember chair; String name;}

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

An example of aggregation

Определяющая характеристика композиции состоит в том, чтобы иметь исключительные (или не разделяемые) части. Композиция может иметь зависимость жизненного цикла между целым и его частями, подразумевая, что когда целое разрушается, все его части уничтожаются вместе с ним. Однако это относится только к некоторым случаям композиции, а не к другим, и поэтому не является определяющей характеристикой. Примером композиции, в которой части (компоненты) можно отделить от целого (составного) и, следовательно, выдержать ее разрушение, является следующее:

enter image description here

Ответ 2

См. надстройки 2.1.1:

Ассоциация может представлять составную агрегацию (т.е. отношение целое/часть). Только бинарные ассоциации могут быть агрегатами. Композитная агрегация представляет собой сильную форму агрегации, которая требует, чтобы экземпляр детали включался не более чем в один композитный за раз. Если композит удален, все его части обычно удаляются вместе с ним. Обратите внимание, что часть может (если разрешено) удаляться из композита до того, как композит будет удален, и, таким образом, не будет удален как часть составного элемента. Композиции могут быть связаны в направленном ациклическом графе с транзитивными характеристиками удаления; то есть удаление элемента в одной части графика также приведет к удалению всех элементов подграфа ниже этого элемента. Композиция представлена ​​атрибутом isComposite, на конце партии которой установлено значение true.

Навигационная способность означает, что экземпляры, участвующие в ссылках во время выполнения (экземпляры ассоциации), могут быть эффективно доступны из экземпляров, участвующих в ссылках на других концах ассоциации. Точный механизм достижения такого доступа является специфичным для реализации. Если конец не является судоходным, доступ с других концов может быть или не быть возможен, и если это так, это может быть неэффективно. Обратите внимание, что инструменты, работающие на UML-моделях, не препятствуют навигации ассоциаций с неходных концов.

Ваши приведенные выше примеры находятся на разных уровнях абстракции. Department/Course - это конкретные классы кодирования, а Department/Professor находятся на некотором абстрактном бизнес-уровне. Хотя нет хорошего источника (я знаю), объясняющего этот факт, composition и aggregation - это концепции, которые вы будете использовать только на уровне бизнеса и почти никогда не на уровне кодирования (исключение ниже). Когда вы находитесь на уровне кода, вы живете намного лучше, если Association имеет имена ролей с обеих сторон. Роли сами по себе отличаются (избыточным!) Рендерингом свойств класса, относящихся к противоположному классу.

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

TL;DR;

Если отношение между классами показывает это как простое объединение. Добавление деталей, таких как роли, поможет при обсуждении данных домена. Использование композиции/агрегации рекомендуется только при моделировании на уровне бизнеса и не поощряется на уровне кода.

Ответ 3

Я написал статью о различиях между UML Association vs Aggregation vs Composition на основе фактической спецификации UML, а не интерпретаций авторов книг.

Основной вывод состоит в том, что

Короче говоря, Композиция - это тип Ассоциации с реальными ограничениями и воздействием на развитие, тогда как Агрегация является чисто функциональным признаком природы Ассоциации без какого-либо технического воздействия.

Навигационная способность - совершенно другое свойство и не зависит от AggregationKind.

Ответ 4

С одной стороны, UML - это богатый язык, то есть есть более чем один способ описать одно и то же. Это одна из причин, по которой вы найдете разные способы, описанные в разных книгах (и противоречивые ответы на SO).

Но ключевой проблемой является огромный разрыв между UML и исходным кодом. Как конкретная конструкция исходного кода представлена ​​в UML, и наоборот, вообще не является частью спецификации UML. Насколько мне известно, только один язык (Java) имеет официальный профиль UML и устарел.

Таким образом, представление конкретных конструкций на языке исходного текста предоставляется поставщикам инструментов и поэтому отличается. Если вы собираетесь генерировать код из своей модели, вы должны следовать соглашениям с поставщиками. Если, наоборот, вы хотите создать модель из существующего исходного кода, вы получите модель, основанную на тех же соглашениях. Но если вы перенесите эту модель на другой инструмент (что сложно в лучшие моменты) и сгенерируйте код, вы не получите тот же код.

В языковом и инструментальном агностическом режиме, я беру на себя, какие отношения использовать, в каких ситуациях можно найти здесь. Один момент, который стоит повторить, заключается в том, что я не использую неориентированные ассоциации в моделях исходного кода, именно потому, что у них нет очевидного аналога в реальном коде. Если в классе кода A есть ссылка на класс B, а B также имеет один для A, тогда я рисую два отношения.