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

Ответ

Агрегация и композиция — это типы ассоциации, описывающие отношение «часть-целое» (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 также будет удален

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

Ответ 18+ 🔞

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

Агрегация (связь так себе, по-соседски, «имеет где-то»)

Тут часть может и сама по себе пожить, если целое вдруг сдохнет. Жизненные циклы — отдельная песня, блядь.

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

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

prof1 = Professor("Доктор Смит")
prof2 = Professor("Доктор Джонс")
# 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)

# Создал машину — автоматом создался и её личный, ебучый движок
my_car = Car(200)
# Если my_car отправят на свалку (удалят), то его engine отправится туда же. Вместе. Навеки.

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