Агрегация против композиции против ассоциации против прямой ассоциации

Я просматриваю свои знания в объектно-ориентированном программировании. В рамках отношения между темами классов я столкнулся с некоторыми отношениями, которые немного неоднозначны для меня.

Я знаю, что зависимость "uses-a" и наследование "is-a", но я немного незнакома с Aggregation, Composition, Association и Direct Association; также, какая из них - "есть-а". Некоторые используют Агрегацию взаимозаменяемо с Ассоциацией.

Что такое Direct Association? Кроме того, что такое композиция? В диаграммах UML стрелки, которые представляют их, различны. Я был бы очень благодарен, если бы вы могли прояснить это для меня.

37
задан 23 февр. '14 в 14:53
источник поделиться
4 ответов

Обратите внимание, что существуют разные интерпретации определений "ассоциации". Мои взгляды ниже в значительной степени основаны на том, что вы читали в книгах Oracle Certification и учебных пособиях.

Временная ассоциация

Использование внутри метода, его подпись или возвращаемое значение. Это не ссылка на конкретный объект.

Пример: я припарковал свой автомобиль в гараже.

Temporary Association UML

Составная ассоциация

A так называемое " СИЛЬНОЕ отношение": создание связанного объекта часто затруднено закодированный внутри конструктора объекта. Он не может быть установлен из вне объекта. (Состав не может быть много-ко многим отношения.)

Пример: Дом состоит из камней.

Composition UML

Прямая ассоциация

Это " WEAK отношения". Объекты могут жить независимо и обычно есть сеттеры или другие способы вставки зависимых объектов.

Пример: автомобиль может иметь пассажиров.

Direct Association UML

Агрегирующая ассоциация

Очень похож на прямую ассоциацию. Это также " WEAK relationship" с независимыми объектами. Однако здесь связанные объекты являются важной частью содержащего объекта.

Пример: автомобиль должен иметь шины.

Aggregation UML

Примечание. Как прямые ассоциации, так и ассоциации агрегации часто обобщаются как "ассоциации". Разница довольно тонкая.

84
ответ дан 27 окт. '14 в 14:33
источник

Например Весь смысл ООП заключается в том, что ваш код реплицирует объекты реального мира, что делает ваш код читаемым и поддерживаемым.

  • Ассоциация

В основном ассоциация класса A использует класс B. В качестве примера

  • Сотрудник использует автобус/поезд Услуги для перевозки.
  • Компьютер использует клавиатуру в качестве устройства ввода

А в диаграмме UML ассоциация обозначается нормальной стрелкой.

  1. Aggregation Класс A содержит класс B, или класс A имеет экземпляр класса B. Агрегация используется, когда жизнь объекта не зависит от объекта-контейнера. Но объект-контейнер принадлежит агрегированному объекту.

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

  1. Состав Класс A владеет классом B. Например, Тело состоит из руки, головы, ног, BankAccount состоит из баланса и истории транзакций. Поэтому, если класс будет удален, тогда и класс B будет удален.
8
ответ дан 21 окт. '14 в 15:01
источник

Прямая связь не имеет ничего общего с другими тремя. Он вообще не принадлежит UML, это термин моделирования требований IBM.

Как и для других,

Ассоциация A- > B является ребенком зависимости. Ассоциация означает, что A (или его экземпляр) имеет простой способ добраться до экземпляра B. Например, a.x.y.b. Или по функции или некоторой локальной переменной. Или прямой ссылкой или указателем, или что-то еще (в мире есть много языков). Как вы видите, не существует строгой границы между зависимостью и ассоциацией.

Одним из атрибутов Ассоциации является агрегация, она может иметь значения: None, shared (часто неправильно называемая агрегация) и состав.

Если A (или экземпляр) имеет некоторые (или одно) экземпляры B, поэтому уничтожение ассоциации означает уничтожение экземпляров B, это композиция.

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

Есть еще несколько интересных атрибутов ассоциаций. Посмотрите здесь, если вы заинтересованы.

6
ответ дан 24 февр. '14 в 0:26
источник

Связь между типами объектов классифицирует отношения между объектами этих типов. Например, ассоциация Person -isEmployedBy- Enterprise может классифицировать отношения PeterMiller-isEmployedBy-IBM, SusanSmith-isEmployedBy-IBM и SarahAnderson-isEmployedBy-Google между объектами PeterMiller, SusanSmith и SarahAnderson типа Person, а также как Google и IBM типа Enterprise. Другими словами, ассоциации - это типы отношений с двумя или более объектами, участвующими в них. Связь между двумя типами объектов называется двоичной. В то время как бинарные ассоциации более распространены, нам также приходится иметь дело с n-арными ассоциациями, где n - натуральное число, большее 2. Например, Person -isTreatedIn- Hospital -for- Disease является 3 (тройная) связь между типами объектов Person, Hospital и Disease.

Я предполагаю, что с "прямой ассоциацией" вы подразумеваете направленную (или направленную) ассоциацию, которая представляет собой ассоциацию (с классом домена и классом диапазона), которая представляет собой ссылочное свойство в своем классе домена. Такая направленная ассоциация имеет "точку собственности" на своем целевом конце.

Подробнее об ассоциациях см. в этой книге.

И посмотрите мой ответ на этот вопрос SO для объяснения агрегаций и композиций.

4
ответ дан 24 февр. '14 в 1:48
источник

Другие вопросы по меткам или Задайте вопрос