Каковы ключевые различия между агрегацией и композицией в ООП?

Ответ

Агрегация и композиция — это типы ассоциации, описывающие отношение «часть-целое» (has-a). Ключевое различие заключается в силе связи и времени жизни связанных объектов.

Агрегация (слабая связь, 'имеет')

Объект-часть может существовать независимо от объекта-контейнера. Их жизненные циклы не связаны.

  • Связь: Независимая.
  • Жизненный цикл: Уничтожение контейнера не приводит к уничтожению его частей.
  • Пример: Кафедра и Профессора. Профессор может существовать без кафедры или перейти на другую.
class Professor:
    def __init__(self, name):
        self.name = name

class Department:
    def __init__(self, professors):
        # Кафедра получает список уже существующих профессоров
        self.professors = professors

prof1 = Professor("Dr. Smith")
prof2 = Professor("Dr. Jones")
# prof1 и prof2 существуют независимо
cs_department = Department([prof1, prof2])

Композиция (сильная связь, 'состоит из')

Объект-часть не может существовать без объекта-контейнера. Жизненный цикл частей полностью управляется контейнером.

  • Связь: Зависимая, владеющая.
  • Жизненный цикл: При уничтожении контейнера уничтожаются и все его части.
  • Пример: Автомобиль и Двигатель. Двигатель не существует отдельно от конкретного автомобиля.
class Engine:
    def __init__(self, horsepower):
        self.horsepower = horsepower

class Car:
    def __init__(self, hp):
        # Двигатель создается внутри автомобиля и принадлежит ему
        self.engine = Engine(hp)

# Создание Car автоматически создает Engine
my_car = Car(200)
# Если my_car будет удален сборщиком мусора, его engine также будет удален

Итог: Выбор зависит от логической связи. Если 'часть' немыслима без 'целого' — это композиция. В противном случае — агрегация.