Урок 149. Ассоциация

   | 

   | 

 Обновлено 13 Июн 2018  | 

 925

В предыдущих двух уроках мы рассмотрели два подтипа композиции объектов: композицию и агрегацию. Композиция объектов используется для моделирования отношений, в которых сложный объект (целое) состоит из нескольких более простых объектов (частей).

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

Ассоциация

В ассоциации два несвязанных объекта должны соответствовать следующим отношениям:

 первый объект (член) не связан со вторым объектом (классом);

 первый объект (член) может принадлежать одновременно сразу нескольким объектам (классам);

 первый объект (член) существует, не управляемый вторым объектом (классом);

 первый объект (член) может знать или не знать о существовании второго объекта (класса).

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



Отношения между врачами и пациентами – это отличный пример ассоциации. Врач связан с пациентом, но эти отношения нельзя назвать отношениями «части-целого». Врач может принимать десятки пациентов в день, а пациент может обращаться к нескольким врачам.

Мы можем сказать, что типом отношений в ассоциации является «использует». Врач «использует» пациента (для получения дохода). Пациент «использует» врача (чтобы вылечить болезнь или улучшить своё самочувствие).

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

Ассоциации реализовываются по-разному. Однако чаще всего их реализовывают, используя указатели, где классы указывают на объекты друг друга.

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

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

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 (12 оценок, среднее: 5,00 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО