UML-отношения. Агрегация

#uml #aggregation #relationships

#uml #агрегация #отношения

Вопрос:

У меня проблема с моей UML-диаграммой, и я буду рад, если вы мне поможете. У меня есть такие отношения, как

Объект A (1)<>—-(0..*) Объект В

Объект B (1)<>—-(0..*) Объект А

и я хотел бы объединить их. Как я могу это сделать? Большое спасибо.

Комментарии:

1. Разве это не то же самое, что ( .. ) ? Какой пример может быть, когда у объекта Singe A есть несколько объектов B, в то время как у одного объекта B есть несколько объектов A?

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

Ответ №1:

Не могли бы вы, пожалуйста, определить термин «объединить их»? Чего именно вы хотели бы достичь? Вероятно, может помочь пример.

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

введите описание изображения здесь

В решении 1 я только что создал одно отношение, которое описывает оба ваших. Это можно использовать, если существует только один и четкий критерий связи между объектами. Типичное n ..m отношение. Каждый объект A будет содержать коллекцию связанных объектов B и наоборот.

  • Например, человек (A на диаграмме) может присоединиться к нескольким клубам (B), а в клубе может быть несколько членов — за этой ситуацией стоит только одно логическое отношение — членство.

В решении 2 на самом деле существует 2 разных способа связи между этими элементами, каждый из которых 1 ..n. Итак, A содержит коллекцию Bs, а B содержит коллекцию As, но они не связаны.

  • Расширяя тот же пример — человек (A) может присоединиться только к 1 клубу (B), а в клубе может быть много членов и содержать их ссылку (col_a на диаграмме). В то же время у клуба может быть только 1 владелец, и человек может владеть несколькими клубами (col_b). Здесь у нас есть два разных логических отношения — членство и владение.

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

Похожа ли одна из этих ситуаций на вашу?

ОБНОВЛЕНИЕ (после 1-го комментария):

Итак, вот обновленное решение 1:

введите описание изображения здесь

Здесь используется агрегация, и это скорее отношение между членами группы. Это идеально соответствует описанию моего первого решения там. Члены (B) могут быть «разделены» между группами (A), и Gruop не имеет никакого специального контроля над их жизненным циклом.

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

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

Комментарии:

1. Спасибо! Да, я использовал первое решение, но мне кажется, что оно не показывает отношения «часть-целое». Правильно ли это? Есть ли другое решение для этого случая?

2. Вы правы, это вообще не показывает природу отношений между частями. Для этого у нас есть композиции и агрегации. Пожалуйста, посмотрите мой обновленный ответ.

Ответ №2:

Вот способ, которым вы могли бы представить этот сценарий в UML.

Один сервер может содержать 0 или много функций (т.е. агрегированные отношения).

Каждая функция должна принадлежать одному серверу. Или, если это распределенная функция, она может принадлежать многим серверам.

введите описание изображения здесь