Gymterview
junior

Какие виды отношений существуют в структурной диаграмме классов?

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

Взаимосвязи классов

Обобщение (Generalization) показывает, что один класс (подтип) является частной формой другого (супертип). Любой экземпляр подтипа является также экземпляром супертипа. На диаграмме изображается сплошной линией со стрелкой-треугольником, направленной к супертипу. Это то же самое, что наследование (extends) в Java, или отношение «is a».

Пример: «Табурет» является подтипом «Мебели» — табурет is a мебель.

Реализация (Realization) — отношение, в котором один элемент (клиент) реализует поведение, заданное другим (поставщиком). Поставщик, как правило, является интерфейсом или абстрактным классом. На диаграмме изображается пунктирной линией со стрелкой-треугольником. В Java это implements.

Пример: «Кровать» реализует интерфейс «Мебель для сна».

Взаимосвязи объектов (экземпляров классов)

Зависимость (Dependency) — самая слабая связь. Означает, что изменение класса-поставщика может повлиять на зависимый класс, но не наоборот. Возникает, когда объект используется как параметр метода, локальная переменная или возвращаемое значение. На диаграмме — пунктирная стрелка.

Пример: «Расписание занятий» зависит от «Списка предметов». При изменении списка предметов расписание вынуждено измениться, но не наоборот.

Ассоциация (Association) — структурная связь между классами, показывающая, что объекты одного класса связаны с объектами другого. Ассоциация может быть именованной и иметь направление навигации. Это общий случай, частными формами которого являются агрегация и композиция. На диаграмме — сплошная линия.

Пример: «Студент» и «Университет» связаны ассоциацией «учится в».

Агрегация (Aggregation) — разновидность ассоциации, отношение «целое — часть» по ссылке. Части могут существовать независимо от контейнера: если контейнер уничтожен, его содержимое продолжает существовать. На диаграмме — сплошная линия с пустым ромбом на стороне «целого».

Пример: «Группа» состоит из «Студентов», но студент существует и без группы.

Композиция (Composition) — строгий вариант агрегации, отношение «целое — часть» по значению. Время жизни частей жёстко зависит от контейнера: при уничтожении контейнера уничтожается и всё его содержимое. На диаграмме — сплошная линия с закрашенным ромбом на стороне «целого».

Пример: «Факультет» является частью «Университета» и не может существовать без него.

Сравнение отношений

Отношение Сила связи Обозначение Аналог в Java Пример
Зависимость Слабая Пунктирная стрелка Параметр метода, локальная переменная Сервис использует DTO
Ассоциация Средняя Сплошная линия Поле класса Студент ↔ Университет
Агрегация Средняя+ Пустой ромб Поле-коллекция (независимое время жизни) Группа ◇→ Студент
Композиция Сильная Закрашенный ромб Поле-коллекция (зависимое время жизни) Университет ◆→ Факультет
Обобщение Наследование Пустой треугольник extends Табурет → Мебель
Реализация Контракт Пунктир + треугольник implements Кровать → МебельДляСна

Мощность (кратность) отношений

Мощность указывает число связей между экземплярами классов на каждом конце ассоциации.

Нотация Значение Пример
0..1 Ноль или один экземпляр У кошки может быть или не быть хозяина
1 Обязательно один экземпляр У кошки одна мать
0..* или * Ноль или более экземпляров У кошки могут быть котята, а может и не быть
1..* Один или более экземпляров У кошки есть хотя бы одно место для сна

Общие взаимосвязи

Зависимость на общем уровне — это слабая форма отношения использования, при котором изменение спецификации одного элемента влечёт за собой изменение другого. Зависимость может быть между экземплярами, классами или экземпляром и классом. Объект может выступать в форме параметра, локальной переменной или возвращаемого значения.

Уточнение (Refinement) — отношение между элементами на разных уровнях детализации. Один пакет уточняет другой, если содержит те же элементы, но в более подробном представлении. Используется для перехода от абстрактной модели к детальной.

На собеседовании: это один из самых популярных вопросов по UML. Интервьюер хочет услышать чёткую разницу между агрегацией и композицией (время жизни частей), между ассоциацией и зависимостью (сила связи), а также уверенное сопоставление с конструкциями Java — extends, implements, поле класса, параметр метода. Если можете нарисовать на доске пример с ромбами и стрелками — это сильный плюс.