Агрегация и композиция: основные принципы в программировании и ООП
Агрегация и композиция - два основных способа организации связей между объектами в объектно-ориентированном программировании.
Агрегация представляет собой связь "часть-целое", где объекты могут существовать независимо от своего контейнера. То есть, если контейнер уничтожается, то его составляющие объекты могут продолжать свое существование. В агрегации один объект содержит ссылки на другие объекты, и те могут быть использованы и другими объектами. Например, в случае класса "Команда" и его членов (игроков) - один объект (команда), содержащий ссылки на множество других объектов (игроки). При удалении команды игроки могут продолжать существовать и быть привязанными к другой команде.
Вот пример класса "Компания", который содержит ссылки на объекты класса "Сотрудник":
python
class Company:
def __init__(self, employees):
self.employees = employees
class Employee:
def __init__(self, name, position):
self.name = name
self.position = position
employee1 = Employee("John Doe", "Manager")
employee2 = Employee("Jane Smith", "Developer")
employee3 = Employee("Bob Johnson", "Designer")
employees = [employee1, employee2, employee3]
company = Company(employees)
Композиция, с другой стороны, представляет собой более строгую связь "часть-целое", где объекты существуют только в контексте своего контейнера. Если контейнер уничтожается, также уничтожаются и его составляющие объекты. В композиции контейнер "владеет" своими частями и контролирует их жизненный цикл. Например, класс "Учебная группа" и объекты класса "Студент" могут быть примером композиции. Если учебная группа расформировывается, все студенты также будут расформированы и уничтожены.
Вот пример класса "Учебная группа", который владеет объектами класса "Студент":
python
class StudyGroup:
def __init__(self):
self.students = []
def add_student(self, student):
self.students.append(student)
def remove_student(self, student):
self.students.remove(student)
class Student:
def __init__(self, name):
self.name = name
group = StudyGroup()
student1 = Student("John Doe")
group.add_student(student1)
student2 = Student("Jane Smith")
group.add_student(student2)
group.remove_student(student1)
В данном примере объекты класса "Студент" являются исключительно частями объекта класса "Учебная группа". И если группа удалена, все студенты также будут удалены.