В чем разница между агрегацией и композицией?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между агрегацией и композицией
Это две формы связи (ассоциации) между объектами в объектно-ориентированном программировании. Обе описывают отношение "имеет" (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) # Учитель остаётся жив
Когда использовать
Композиция:
- Когда часть существует исключительно для целого
- Когда нужен полный контроль над жизненным циклом части
- Когда часть не имеет смысла без целого
Агрегация:
- Когда часть может существовать независимо
- Когда одна часть может быть с несколькими целыми
- Когда нужна гибкость в управлении коллекцией
При проектировании правильный выбор между композицией и агрегацией обеспечивает гибкость, переиспользуемость и ясность отношений между объектами.