Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Temporary Association UML

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

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

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

Composition UML

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

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

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

Direct Association UML

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

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

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

Aggregation UML

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

Ответ 2

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

1. Ассоциация

Ассоциация: класс A использует класс B.

Пример:

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

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

2. Агрегация

Класс A содержит класс B, или класс A имеет экземпляр класса B.

Агрегация используется, когда жизнь объекта не зависит от объекта контейнера. Но все же контейнерный объект владеет агрегированным объектом.

Поэтому, если мы удаляем класс A, это не означает, что класс B также будет удален. Например, ни один, ни много учителей не могут принадлежать к одному или нескольким отделам.

Отношения между учителями и отделами являются агрегацией.

3. Композиция

Класс А владеет классом В.

Например, тело состоит из руки, головы, ног. BankAccount состоит из баланса и истории транзакций.

Таким образом, если класс A будет удален, то и класс B будет удален.

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Связь между типами объектов классифицирует отношения между объектами этих типов. Например, ассоциация 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 для объяснения агрегаций и композиций.