Ассоциация против агрегации
Я просмотрел много информации об этих вещах, но не могу понять, в чем разница между ними? В UML Distilled Фаулера говорится, что агрегация строго бессмысленна, поэтому автор рекомендует не использовать ее в диаграммах. Объясните, пожалуйста, когда мне следует использовать каждый из них и как это повлияет на код Java.
6 ответов
Это очень спорный вопрос. Как объясняет Мартин в ответе, заказ объединяет продукт. И это можно считать правдой. Грэди Буч в своем "Объектно-ориентированном анализе и проектировании" приводит аналогичный пример для ассоциации - продажа связана с продуктами в этой продаже, и наоборот. И продажа не объединяет продукты. Таким образом, все примеры должны быть специфичными для предметной области, поскольку с другой точки зрения ассоциация может стать более конкретной. Другим примером является составление документов с использованием абзацев.
Так что все в этой области сильно зависит от контекста. Это ООП.
Вы можете попробовать применить свои знания в конкретном проекте, который вы собираетесь разработать. Я бы порекомендовал вам прочитать книгу Грэди Буча, если вы еще этого не сделали. С тех пор было написано много книг, но это все еще Библия ОО *.
Есть четыре вида отношений класса
- Ассоциация: использует
Пример: классMan
использует классPen
(Ручка все еще там, когда человек умирает) - Агрегация: имеет
Пример: классMan
имеет классCar
(Автомобиль все еще там, когда человек умрет) - Композиция: владеет
Пример: классMan
владеет классомHeart
(Когда человек умирает, сердце умирает) - Наследование: это
Пример: классMan
это классHuman
(Человек человек)
Отношения между классами объектов
Наследование> Состав>Aggregation> Ассоциация
Ассоциация означает, что два класса имеют какие-то отношения, может быть что угодно.
Состав и агрегация - это два вида ассоциаций. Самый простой способ их различить - думать о том, насколько сложны отношения. Подумайте о том, что происходит, когда вы удаляете объект владельца.
Агрегация, агрегированный объект продолжает жить. (Подумайте заказать <-> товар, товар продолжает жить).
Композиция агрегированного объекта умирает вместе с владельцем. (Думайте параграфы <-> документ, параграфы умирают вместе с документом).
Агрегацию можно считать бессмысленной, поскольку на самом деле нет большой разницы между проведением линии с незаполненной стрелкой (ассоциация) и линией с незаполненным ромбом (агрегация). Отношения очень похожи. Линия с заполненным ромбом (состав), однако, очень отличается.
Композиция UML, агрегация и простая ассоциация - это семантические концепции, а не концепции программирования. Смысл их можно понять следующим образом:
- Состав: А состоит из Б; B является частью A и, следовательно, не может существовать без A
- Агрегация: A владеет B, B принадлежит A
- Ассоциация: A использует B, A относится к B определенным образом
(Состав и агрегация - это особые типы ассоциаций.)
В Java вы можете реализовать их все одинаково. Это концептуальная разница.
Ассоциация - это любое отношение между классами, где экземпляры одного класса имеют ссылку на поле для экземпляра другого класса.
Композиция - это "более сильное" отношение, означающее, что один экземпляр (родитель) "владеет" другим (дочерним).
Это Агрегация, которая не имеет никакой дополнительной семантики, кроме как ассоциация.
Смотрите больше здесь: http://martinfowler.com/bliki/AggregationAndComposition.html
РЕДАКТИРОВАТЬ: Вы можете добавить некоторую особую семантику к символу агрегации, например, "Может принадлежать максимум одному родителю за раз, но может менять родителей или быть сиротой". Однако такие расширения являются вашими собственными и, насколько я знаю, не определены в UML.
Кажется, есть некоторые споры о том, какое слово есть какое.
Это связано с отношениями родитель-потомок между объектами и тем, что происходит с потомками при удалении родителя.
Один сценарий говорит, что у детей нет жизни вне жизни их родителей, поэтому они должны быть удалены при удалении родителя. Подумайте "УДАЛИТЬ КАСКАД" в внешних ключах и реляционных базах данных.
Другой сценарий говорит, что дети должны сохраняться за пределами своих родителей, поэтому их не следует удалять при удалении их родителей.
Я оставлю это другим, чтобы спорить, какое слово описывает каждую ситуацию.