Ассоциация против агрегации

Я просмотрел много информации об этих вещах, но не могу понять, в чем разница между ними? В UML Distilled Фаулера говорится, что агрегация строго бессмысленна, поэтому автор рекомендует не использовать ее в диаграммах. Объясните, пожалуйста, когда мне следует использовать каждый из них и как это повлияет на код Java.

6 ответов

Решение

Это очень спорный вопрос. Как объясняет Мартин в ответе, заказ объединяет продукт. И это можно считать правдой. Грэди Буч в своем "Объектно-ориентированном анализе и проектировании" приводит аналогичный пример для ассоциации - продажа связана с продуктами в этой продаже, и наоборот. И продажа не объединяет продукты. Таким образом, все примеры должны быть специфичными для предметной области, поскольку с другой точки зрения ассоциация может стать более конкретной. Другим примером является составление документов с использованием абзацев.

Так что все в этой области сильно зависит от контекста. Это ООП.

Вы можете попробовать применить свои знания в конкретном проекте, который вы собираетесь разработать. Я бы порекомендовал вам прочитать книгу Грэди Буча, если вы еще этого не сделали. С тех пор было написано много книг, но это все еще Библия ОО *.

Есть четыре вида отношений класса

  1. Ассоциация: использует
    Пример: класс Man использует класс Pen (Ручка все еще там, когда человек умирает)
  2. Агрегация: имеет
    Пример: класс Man имеет класс Car (Автомобиль все еще там, когда человек умрет)
  3. Композиция: владеет
    Пример: класс Man владеет классом Heart (Когда человек умирает, сердце умирает)
  4. Наследование: это
    Пример: класс Man это класс Human (Человек человек)

Отношения между классами объектов

Наследование> Состав>Aggregation> Ассоциация

Ассоциация означает, что два класса имеют какие-то отношения, может быть что угодно.

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

Агрегация, агрегированный объект продолжает жить. (Подумайте заказать <-> товар, товар продолжает жить).

Композиция агрегированного объекта умирает вместе с владельцем. (Думайте параграфы <-> документ, параграфы умирают вместе с документом).

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

Композиция UML, агрегация и простая ассоциация - это семантические концепции, а не концепции программирования. Смысл их можно понять следующим образом:

  • Состав: А состоит из Б; B является частью A и, следовательно, не может существовать без A
  • Агрегация: A владеет B, B принадлежит A
  • Ассоциация: A использует B, A относится к B определенным образом

(Состав и агрегация - это особые типы ассоциаций.)

В Java вы можете реализовать их все одинаково. Это концептуальная разница.

Ассоциация - это любое отношение между классами, где экземпляры одного класса имеют ссылку на поле для экземпляра другого класса.

Композиция - это "более сильное" отношение, означающее, что один экземпляр (родитель) "владеет" другим (дочерним).

Это Агрегация, которая не имеет никакой дополнительной семантики, кроме как ассоциация.

Смотрите больше здесь: http://martinfowler.com/bliki/AggregationAndComposition.html

РЕДАКТИРОВАТЬ: Вы можете добавить некоторую особую семантику к символу агрегации, например, "Может принадлежать максимум одному родителю за раз, но может менять родителей или быть сиротой". Однако такие расширения являются вашими собственными и, насколько я знаю, не определены в UML.

Кажется, есть некоторые споры о том, какое слово есть какое.

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

Один сценарий говорит, что у детей нет жизни вне жизни их родителей, поэтому они должны быть удалены при удалении родителя. Подумайте "УДАЛИТЬ КАСКАД" в внешних ключах и реляционных базах данных.

Другой сценарий говорит, что дети должны сохраняться за пределами своих родителей, поэтому их не следует удалять при удалении их родителей.

Я оставлю это другим, чтобы спорить, какое слово описывает каждую ситуацию.

Другие вопросы по тегам