← Назад к вопросам

Что такое композиция в диаграмме классов?

2.0 Middle🔥 81 комментариев
#Нотации и диаграммы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Композиция в диаграмме классов UML

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

Определение и обозначение

Композиция — это отношение целое-часть, где часть не может существовать без целого. На диаграмме классов композиция обозначается линией со стрелкой в виде чёрного ромба на стороне контейнера.

Отличие от агрегации (которая обозначается пустым ромбом):

  • Композиция: части не могут существовать отдельно от целого (сильная связь)
  • Агрегация: части могут существовать независимо от целого (слабая связь)

Характеристики композиции

1. Сильная связанность

  • Дочерний объект полностью принадлежит родительскому
  • Нельзя передать часть другому целому
  • Жизненный цикл части полностью зависит от целого

2. Исключительность владения

  • Часть принадлежит только одному целому
  • При удалении целого удаляются и все части
  • Мультиплициность обычно 1..n

3. Неотделимость

  • Без целого часть потеряет смысл
  • Нельзя переиспользовать в других контекстах

Примеры из реальной жизни

Хороший пример — Автомобиль:

Автомобиль содержит:
  ├─ Двигатель (1)
  ├─ Колёса (4)
  ├─ Кузов (1)
  └─ Трансмиссия (1)

Если разобрать автомобиль, двигатель не имеет смысла без машины. Это точная композиция.

Ещё пример — Компания и отделы:

Компания ────⬥────── Отдел
         (1)    (0..*)

Для отдела существовать внутри этой компании он ДОЛЖЕН принадлежать ей. Если компания ликвидирована, отдел также прекращает существование в этом контексте.

Синтаксис на диаграмме

Класс А ────⬥──── Класс В
    (целое)      (часть)
      1          0..*

Чёрный ромб (⬥) находится со стороны целого, линия может иметь мультипликативность (1, 0.., 1..).

Отличие от агрегации

ПараметрКомпозицияАгрегация
СимволЧёрный ромбПустой ромб
СвязьСильнаяСлабая
Жизненный циклСвязанНезависим
ВладениеИсключительноеОбщее
Передача частиНевозможнаВозможна

Пример кода в Java

// Композиция: Автомобиль содержит Двигатель
public class Car {
    private Engine engine;  // сильная связь
    
    public Car() {
        this.engine = new Engine();  // создаём одновременно
    }
    
    // Двигатель недоступен снаружи
    // Нельзя заменить на другой двигатель
}

public class Engine {
    // Двигатель теряет смысл без Car
}

Композиция в проектировании систем

Примеры в IT:

  1. Документ и Страницы: Документ содержит страницы. При удалении документа удаляются все страницы.

  2. Форма и Поля: Форма содержит поля ввода. Поля существуют только в контексте формы.

  3. Заказ и Позиции: Заказ содержит товарные позиции. Позиции теряют смысл без заказа.

  4. Окно и Элементы интерфейса: Окно содержит кнопки, текстовые поля и т.д.

Правила использования

Когда использовать композицию:

  • Есть чёткое отношение целое-часть
  • Часть не может существовать без целого
  • Жизненный цикл части совпадает с целым
  • Нет необходимости переиспользовать часть в других контекстах

Когда использовать агрегацию:

  • Части могут существовать независимо
  • Одна часть может принадлежать нескольким целым
  • Гибкость и переиспользование важны

Практическая ценность для аналитика

Понимание композиции критично при:

  • Проектировании архитектуры — правильное определение иерархии классов
  • Анализе требований — выявление структуры предметной области
  • Оценке сложности — композиция усложняет тестирование и отладку
  • Планировании разработки — определение порядка создания классов

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