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

Что такое агрегация в контексте ООП?

1.8 Middle🔥 161 комментариев
#Python Core#Архитектура и паттерны

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

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

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

Агрегация в контексте ООП

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

Основные характеристики агрегации

Слабая связь: Составной объект (целое) содержит ссылки на другие объекты (части), но не отвечает за их жизненный цикл. Части могут существовать и использоваться независимо от целого.

Переиспользуемость: Объект-часть может принадлежать нескольким объектам-целым одновременно.

Независимость жизненного цикла: Удаление объекта-целого не означает удаление объектов-частей.

Пример агрегации на 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)

Выводы

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

Что такое агрегация в контексте ООП? | PrepBro