Урок №157. Асоціація

  Юрій  | 

  Оновл. 19 Лют 2021  | 

 35

На попередніх уроках ми розглянули два підтипи композиції об’єктів: композицію і агрегацію. Композиція об’єктів використовується для моделювання відносин, в яких складний об’єкт (ціле) складається з декількох простих об’єктів (частин).

На цьому уроці ми розглянемо наступний тип відносин між двома незв’язаними об’єктами — асоціацію. На відміну від композиції об’єктів, в асоціації немає відносин “частин-цілого”.

Асоціація

В асоціації два незв’язаних об’єкти повинні відповідати наступним відносинам:

   Перший об’єкт (член) не зв’язаний з другим об’єктом (класом).

   Перший об’єкт (член) може належати одночасно відразу декільком об’єктам (класам).

   Перший об’єкт (член) існує, НЕ керований другим об’єктом (класом).

   Перший об’єкт (член) може знати або не знати про існування другого об’єкта (класу).

На відміну від композиції або агрегації, де частина є частиною цілого, в асоціації об’єкти між собою ніяк не пов’язані. Подібно агрегації, перший об’єкт може належати відразу декільком об’єктам одночасно і не керується ними. Однак, на відміну від агрегації, де відносини односпрямовані, в асоціації відносини можуть бути як односпрямованими, так і двонаправленими (коли обидва об’єкти знають про існування один одного).

Відносини між лікарями і пацієнтами — це відмінний приклад асоціації. Лікар пов’язаний з пацієнтом, але ці відносини не можна назвати відносинами “частин-цілого”. Лікар може приймати десятки пацієнтів за день, а пацієнт може звертатися до декількох лікарів.

Ми можемо сказати, що типом відносин в асоціації є «використовує». Лікар «використовує» пацієнта для отримання доходу. Пацієнт «використовує» лікаря, щоб вилікувати хворобу або поліпшити своє самопочуття.

Реалізація асоціацій

Асоціації реалізуються по-різному. Однак найчастіше вони реалізуються через вказівники, де класи вказують на об’єкти один одного.

У наступному прикладі ми реалізуємо двонаправлені відносини між Лікарем і Пацієнтом, тому що Лікар повинен знати своїх Пацієнтів в обличчя, а Пацієнти можуть звертатися до різних Лікарів:

Результат виконання програми:

John is seeing patients: Anton
Tom is seeing patients: Anton Derek
Anton is seeing doctors: John Tom
Ivan has no doctors right now
Derek is seeing doctors: Tom

Якщо говорити в загальному, то краще уникати двонаправлених асоціацій, якщо для вирішення завдання підходить і односпрямований зв’язок, так як двонаправлений зв’язок реалізувати складніше (з урахуванням виникнення можливих помилок) і він ускладнює логіку програми.

Рефлексивна асоціація

Іноді об’єкти можуть мати відносини з іншими об’єктами того ж типу. Це називається рефлексивною асоціацією. Хорошим прикладом рефлексивної асоціації є відношення між університетським курсом і його мінімальними вимогами для студентів.

Розглянемо спрощений випадок, коли Курс може мати тільки одну Вимогу:

Це може призвести до “ланцюжка” асоціацій (курс має необхідну умову, виконання якої включає ще одну умову і т.д.).

Асоціації можуть бути непрямими

У прикладах, наведених вище, ми використовували вказівники для зв’язування об’єктів. Однак в асоціації це не є обов’язковою умовою. Можна використовувати будь-які дані, які дозволяють зв’язати два об’єкти. У наступному прикладі ми покажемо, як клас Водій може мати односпрямований зв’язок з класом Автомобіль без змінної-члена у вигляді вказівника на об’єкт класу Автомобіль:

Результат виконання програми:

Ivan is driving a Focus

У прикладі, наведеному вище, у нас є CarLot (Гараж) в якому знаходяться наші автомобілі. Водій, якому потрібен Автомобіль, не має вказівника на цей Автомобіль — замість цього у нього є Ідентифікатор Автомобіля, який він може використати для отримання Автомобіля з Гаражу, коли йому це потрібно.

Саме в цьому прикладі реалізація виглядає дещо нерозумною, так як отримання Автомобіля з Гаражу вимагає додаткового виконання процесів (було б швидше, якби існував вказівник, який з’єднує безпосередньо два класи). Проте є і переваги прив’язки об’єктів до ідентифікатора замість використання вказівника. Наприклад, ви можете посилатися на об’єкти, які зараз не знаходяться в пам’яті (можливо, вони знаходяться в файлі або в базі даних і можуть бути завантажені на вимогу).

Композиція vs. Агрегація vs. Асоціація

Ось таблиця, яка допоможе вам швидко згадати відмінності між композицією, агрегацією і асоціацією:

Властивості Композиція Агрегація Асоціація
Відносини Частин-Цілого Частин-Цілого Об’єкти не зв’язані між собою
Члени можуть належати відразу декільком класам Ні Так Так
Існування членів керується класами Так Ні Ні
Вид відносин Односпрямовані Односпрямовані Односпрямовані або Двонаправлені
Тип відносин “Частина чогось” “Має” “Використовує”

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *