0
Answered

разница между агрегацией и ассоциацией

Рамиль Измайлов 2 years ago updated by dani 1 year ago 13
Добрый день. Объясните мне пожалуйста разницу между агрегацией и ассоциацией. Из книги я понял что и там и там классы могут существовать отдельно друг от друга. И там и там один класс не управляет жизненным циклом другого. И там и там может быть отношение один к одному и один ко многим. Мне показалось что основная разница в том что при ассоциации может быть двунаправленная связь, а при агрегации - нет. Так ли это? Но если это так, то почему на этой диаграмме именно ассоциация, а не агрегация?

Image 848

Under review

Здравствуйте!

> И там и там может быть отношение один к одному и один ко многим

Не уверен, почему у вас сложилось такое впечатление, но в книге указано, что:

Ассоциация — один к одному.

Агрегация — один к многим.

Вот например тут один к одному. Пример из книги:

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

Значит все-таки может быть один-к-одному при агрегации. Как тогда правильно будет звучать определение агрегации?

+1

Позволю себе процитировать абзац из книги:

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

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

Стало яснее, спасибо за ответ!

в книги, где показываете отличие ассоциации и зависимости, вы привели следующий пример:

class Professor is
    field Student student
    // ...
    method teach(Course c) is
        // ...
        this.student.remember(c.getKnowledge())

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

Агре­га­ция — это спе­ци­а­ли­зи­ро­ван­ная раз­но­вид­ность ассо­ци­а­ции, кото­рая опи­сы­ва­ет отно­ше­ния один-ко-мно­гим, мно­гие-ко-мно­гим, часть-целое между несколь­ки­ми объ­ек­та­ми, тогда как ассо­ци­а­ция уста­нав­ли­ва­ет связь толь­ко между двумя объектами.”

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

Получается следующее:
Есть обьект Professor, у которого есть поле student, в котором "живет" обьект типа Student
это является ассоциацией. Получается говоря об агрегация, и композиция, подразумевается управление жизненным циклом зависимости (поле student)?
Что при агрегации, что при композиции, у нас есть поле, с постоянным доступом к зависимости
Я запутался:С Надеюсь вы сможете направить на правильные мысли 

+1

Здравствуйте!

Прошу прощения за задержку с ответом! Давайте я попробую расставить точки над «і» и убрать все неточности. Сперва, что касается этого абзаца:

“Агре­га­ция — это спе­ци­а­ли­зи­ро­ван­ная раз­но­вид­ность ассо­ци­а­ции, кото­рая опи­сы­ва­ет отно­ше­ния один-ко-мно­гим, мно­гие-ко-мно­гим, часть-целое между несколь­ки­ми объ­ек­та­ми, тогда как ассо­ци­а­ция уста­нав­ли­ва­ет связь толь­ко между двумя объектами.” 

Думаю, я совершил ошибку, формулируя конец абзаца таким образом. В последней редакции книги я уберу окончание этого абзаца. Я добавил этот фрагмент с целью продемонстрировать смысловую разницу между двумя типами связей, не найдя мысленно примеров множественной ассоциации. Сейчас задался вопросом и нашёл (пример).

Итак, если все три типа отношений — ассоциация, агрегация и композиция — могут быть базово реализованы полем в классе. Как понять что перед вами?

Перед тем как отвечу, хочу сказать, что обычно такой вопрос не возникает, когда вы смотрите на код. Обычно, код создаётся на основании UML диаграммы или другой спецификации, в которой указан тип связи, а не наоборот. Тип связи определяется при проектировании класса, а код пишется уже позже. К примеру, вы получаете на входе спецификацию, в которой кто-то потрудился нарисовать UML-диаграмму, видите там "композицию" и понимаете, что вам нужно сделать "контейнер с управлением жизненным циклом компонентов". Возможно, определение типа связи пост-фактум, как-то может помочь при обсуждении кода, если спеки утеряны или устарели.


Итак, как понять что перед вами, если у вас есть класс, в нём поле-ссылка на другой класс?

1. По-умолчанию, мы думаем что это ассоциация, но делаем несколько проверок, которые могут уточнить тип связи.

2. Если мы можем с определённостью сказать, что один класс выступает контейнером, а второй компонентом, то эту связь можно считать агрегацией. Как это понять? В большинстве случаев, это очевидно. Вы видите класс PageCollection и класс Page – явный контейнер-коллекция и явный для него компонент. В менее очевидных случаях, пытаетесь понять, есть ли между классами здесь отношение часть-целое. При этом, как "часть", так и "целое" могут вполне нормально существовать в программе сами по себе (пустой список страниц vs страница в отрыве от списка). Если определить не выходит, то двигаетесь к следующему шагу, может он это прояснит.

3. Если ли в "контейнере" (класс, который содержит ссылку) мы нашли код управления жизненным циклом компонента, то это связь-композиция.


Надеюсь, этот ответ прояснит для вас вопрос с отношениями. Если что, задавайте вопросы :)

все ок, спасибо что ответили)

Получается ассоциация, это базовое представление агрегации и композиции?

+1

Да, верно.

Ассоциация — связь между объектами.

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

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

спасибо, кажется все стало на свои места)

Зависимость -- базовая связь между объектами

Ассоциация -- связь, И один объект имеет постоянный доступ к другому (у объекта А есть поле с объектом В)

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

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