Что такое агрегация в контексте ООП?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Агрегация в контексте ООП
Агрегация — это одна из форм связи между объектами в объектно-ориентированном программировании, которая представляет отношение «часть-целое» с более слабой связью, чем композиция. При агрегации один объект может состоять из других объектов, но эти другие объекты могут существовать независимо от контейнера.
Основные характеристики агрегации
Слабая связь: Составной объект (целое) содержит ссылки на другие объекты (части), но не отвечает за их жизненный цикл. Части могут существовать и использоваться независимо от целого.
Переиспользуемость: Объект-часть может принадлежать нескольким объектам-целым одновременно.
Независимость жизненного цикла: Удаление объекта-целого не означает удаление объектов-частей.
Пример агрегации на Python
class Department:
def __init__(self, name):
self.name = name
self.employees = [] # Агрегация
def add_employee(self, employee):
self.employees.append(employee)
def get_total_salary(self):
return sum(emp.salary for emp in self.employees)
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
# Использование
dept = Department("IT")
emp1 = Employee("Alice", 50000)
emp2 = Employee("Bob", 60000)
dept.add_employee(emp1)
dept.add_employee(emp2)
print(dept.get_total_salary()) # 110000
# Если удалить отдел, сотрудники остаются
del dept
print(emp1.name) # Alice - существует независимо
Отличие от композиции
Композиция — это более сильная форма связи, где целое отвечает за жизненный цикл частей. При удалении целого удаляются и его части.
# КОМПОЗИЦИЯ - части удаляются с целым
class Car:
def __init__(self, brand):
self.brand = brand
self.engine = Engine() # Engine создаётся вместе с Car
self.wheels = [Wheel() for _ in range(4)]
class Engine:
pass
class Wheel:
pass
# АГРЕГАЦИЯ - части существуют независимо
class Team:
def __init__(self, name):
self.name = name
self.members = [] # Members существуют независимо
def add_member(self, member):
self.members.append(member)
class Person:
def __init__(self, name):
self.name = name
person = Person("John")
team = Team("Developers")
team.add_member(person)
del team
print(person.name) # John - существует, т.к. это агрегация
Практический пример: система управления проектом
class Project:
def __init__(self, name):
self.name = name
self.tasks = [] # Агрегация задач
def add_task(self, task):
self.tasks.append(task)
def remove_task(self, task):
self.tasks.remove(task)
def get_progress(self):
if not self.tasks:
return 0
completed = sum(1 for t in self.tasks if t.is_completed)
return (completed / len(self.tasks)) * 100
class Task:
def __init__(self, title, priority):
self.title = title
self.priority = priority
self.is_completed = False
def complete(self):
self.is_completed = True
# Использование
project = Project("Website Redesign")
task1 = Task("Design mockups", "high")
task2 = Task("Backend API", "high")
task3 = Task("Frontend", "medium")
project.add_task(task1)
project.add_task(task2)
project.add_task(task3)
print(f"Progress: {project.get_progress()}%") # 0%
task1.complete()
print(f"Progress: {project.get_progress()}%") # 33.33%
# Задача может быть перемещена в другой проект
project.remove_task(task1)
project2 = Project("Mobile App")
project2.add_task(task1) # task1 существует независимо
Когда использовать агрегацию
- Коллекции объектов: Список сотрудников в компании, задач в проекте
- Слабые связи: Когда части могут существовать отдельно
- Переиспользование: Когда один объект может быть частью нескольких целых
- Гибкость: Когда нужна возможность добавлять/удалять части динамически
Диаграмма связи
Агрегация:
┌─────────────┐ ◇───────── ┌──────────┐
│ Department │───────────────→ │ Employee │
└─────────────┘ (0..*) └──────────┘
Композиция:
┌────────┐ ◆───────── ┌────────┐
│ Car │───────────────→ │ Engine │
└────────┘ (1..1) └────────┘
(Engine существует только как часть Car)
Выводы
Агрегация — это инструмент для создания гибких и слабо связанных систем. Она позволяет моделировать реальные отношения, где целое состоит из независимых частей. Понимание разницы между агрегацией и композицией критично для проектирования чистой архитектуры.