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

В чем разница между агрегацией и композицией?

2.2 Middle🔥 131 комментариев
#Архитектура и паттерны

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

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

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

Разница между агрегацией и композицией

Это две формы связи (ассоциации) между объектами в объектно-ориентированном программировании. Обе описывают отношение "имеет" (has-a), но различаются степенью связанности и жизненным циклом объектов.

Композиция (Composition)

Композиция — это связь, при которой родительский объект полностью отвечает за создание и уничтожение дочерних объектов. Дочерний объект не может существовать без родителя (жёсткое владение).

class Engine:
    def __init__(self, horsepower: int):
        self.horsepower = horsepower

class Car:
    def __init__(self, model: str):
        self.model = model
        # Машина создаёт и владеет движком
        self.engine = Engine(horsepower=200)
    
    def __del__(self):
        # Когда машина удаляется, удаляется и её движок
        print(f"Car {self.model} and its engine are destroyed")

car = Car("BMW")
# При удалении car автоматически удалится и engine

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

  • Жизненный цикл: родитель создаёт и уничтожает дочерний объект
  • Связанность: сильная, тесная связь
  • Владение: родитель полностью владеет дочерним объектом
  • Переиспользуемость: дочерний объект используется только этим родителем
  • Пример: машина и её движок, дом и его комнаты

Агрегация (Aggregation)

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

class Employee:
    def __init__(self, name: str):
        self.name = name

class Department:
    def __init__(self, name: str):
        self.name = name
        self.employees = []  # Ссылки на сотрудников
    
    def add_employee(self, employee: Employee):
        self.employees.append(employee)

# Сотрудник создаётся отдельно
employee = Employee("John")
department = Department("IT")
# Отдел не создаёт сотрудника, только ссылается на него
department.add_employee(employee)

# Даже если отдел удалится, сотрудник продолжит существовать
del department
print(employee.name)  # "John" — всё ещё жив

Характеристики агрегации:

  • Жизненный цикл: независимый, оба объекта создаются и уничтожаются отдельно
  • Связанность: слабая, можно легко изменить состав
  • Владение: родитель содержит ссылку, но не владеет
  • Переиспользуемость: один объект может быть частью нескольких родителей
  • Пример: отдел и его сотрудники, библиотека и её книги

Наглядное сравнение

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

Практический пример

# КОМПОЗИЦИЯ: сердце существует только в контексте человека
class Heart:
    def pump(self):
        return "pump pump"

class Human:
    def __init__(self, name: str):
        self.name = name
        self.heart = Heart()  # Создаётся внутри
    
    def is_alive(self):
        return self.heart.pump()

# АГРЕГАЦИЯ: учитель существует независимо от школы
class Teacher:
    def __init__(self, name: str):
        self.name = name

class School:
    def __init__(self, name: str):
        self.name = name
        self.teachers = []
    
    def hire_teacher(self, teacher: Teacher):
        self.teachers.append(teacher)
    
    def fire_teacher(self, teacher: Teacher):
        self.teachers.remove(teacher)  # Учитель остаётся жив

Когда использовать

Композиция:

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

Агрегация:

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

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