В чем разница между объединением, агрегацией и составом? - PullRequest
344 голосов
/ 20 мая 2009

В чем разница между объединением, агрегацией и составом? Пожалуйста, объясните с точки зрения реализации.

Ответы [ 16 ]

5 голосов
/ 15 октября 2017

Состав : Именно здесь, когда вы уничтожаете объект (школу), другой объект (классные комнаты), связанный с ним, также будет уничтожен. Оба они не могут существовать независимо.

Aggregation : Это как бы полная противоположность вышеприведенной (Composition) ассоциации, когда после того, как вы убьете объект (Company), другой объект (Employees), связанный с ним, может существовать самостоятельно.

Ассоциация .
Состав и агрегация - это две формы ассоциации.

5 голосов
/ 19 декабря 2016

Проблема с этими ответами состоит в том, что они - половина истории: они объясняют, что агрегация и состав являются формами ассоциации, но они не говорят, возможно ли объединение быть ни тем, ни другим.

Я понял, основываясь на кратких чтениях многих постов на SO и некоторых документах UML, что существует 4 основные конкретные формы ассоциации классов:

  1. состав: А состоит из А; Б не существует без А, как комната в доме
  2. агрегация: A имеет-A B; Б может существовать без А, как ученик в классе
  3. зависимость: A использует-a B; нет зависимости жизненного цикла между A и B, как параметр вызова метода, возвращаемое значение или временный объект, созданный во время вызова метода
  4. обобщение: A is-a B

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

Я предполагаю, что "родовая ассоциация" предназначена для использования в основном в двух обстоятельствах:

  • когда специфика отношений все еще прорабатывается; такие отношения в диаграмме должны быть как можно скорее преобразованы в то, чем они на самом деле являются / будут (один из других 4).
  • когда отношение не совпадает ни с одним из тех 4, которые заданы UML; «универсальная» ассоциация все еще дает вам способ представления отношения, которое «не одно из других», так что вы не застряли, используя неправильные отношения с примечанием «это на самом деле не агрегация, это просто UML нет другого символа, который мы могли бы использовать "
5 голосов
/ 20 мая 2009

Я думаю, что эта ссылка сделает вашу домашнюю работу: http://ootips.org/uml-hasa.html

Чтобы понять термины, я помню пример из моих ранних дней программирования:

Если у вас есть объект «шахматная доска», который содержит объекты «ящика», который является композицией , потому что, если «шахматная доска» удалена, больше нет причин для существования ящиков.

Если у вас есть «квадратный» объект, имеющий «цветной» объект, и квадрат удаляется, «цветной» объект все еще может существовать, то есть агрегация

Оба они являются ассоциациями , основное различие концептуально

2 голосов
/ 12 марта 2019
    Simple rules:
    A "owns" B = Composition : B has no meaning or purpose in the system 
    without A
    A "uses" B = Aggregation : B exists independently (conceptually) from A
    A "belongs/Have" B= Association; And B exists just have a relation
    Example 1:

    A Company is an aggregation of Employees.
    A Company is a composition of Accounts. When a Company ceases to do 
    business its Accounts cease to exist but its People continue to exist. 
    Employees have association relationship with each other.

    Example 2: (very simplified)
    A Text Editor owns a Buffer (composition). A Text Editor uses a File 
    (aggregation). When the Text Editor is closed,
    the Buffer is destroyed but the File itself is not destroyed.
2 голосов
/ 12 сентября 2017

Я хотел бы проиллюстрировать, как три термина реализованы в Rails. ActiveRecord называет любой тип отношений между двумя моделями association. Не часто можно найти термины composition и aggregation при чтении документации или статей, связанных с ActiveRecord. Ассоциация создается путем добавления одного из макросов класса ассоциации в тело класса. Вот некоторые из этих макросов: belongs_to, has_one, has_many и т. Д.

Если мы хотим установить composition или aggregation, нам нужно добавить belongs_to к собственной модели (также называемой дочерней) и has_one или has_many к модели-владельцу (также называемой родительской). ). Настроены ли мы composition или aggregation, зависит от параметров, которые мы передаем вызову belongs_to в дочерней модели. До Rails 5, при настройке belongs_to без каких-либо параметров создавался aggregation, дочерний элемент мог существовать без родительского элемента. Если мы хотели composition, нам нужно было явно объявить это, добавив параметр required: true:

class Room < ActiveRecord::Base
  belongs_to :house, required: true
end

В Rails 5 это было изменено. Теперь, если объявить ассоциацию belongs_to, по умолчанию создается composition, дочерний элемент не может существовать без родителя. Таким образом, приведенный выше пример можно переписать так:

class Room < ApplicationRecord
  belongs_to :house
end

Если мы хотим позволить дочернему объекту существовать без родителя, нам нужно объявить это явно с помощью опции optional

class Product < ApplicationRecord
  belongs_to :category, optional: true
end
0 голосов
/ 04 октября 2018

В очень простом предложении:
Агрегация и состав являются подмножествами ассоциации.

  • A использует B -> это агрегация

  • A нужно B -> это композиция.

Подробнее здесь .

...