Ответ
SOLID — это акроним для пяти основных принципов объектно-ориентированного проектирования, которые помогают создавать гибкие, масштабируемые и поддерживаемые программные системы.
Цель применения: Уменьшить зависимости между компонентами системы, чтобы изменения в одной части кода не приводили к непредсказуемым сбоям в другой.
Принципы SOLID:
-
S - Single Responsibility Principle (Принцип единственной ответственности)
- Суть: Класс должен иметь только одну причину для изменения. Он должен отвечать за одну конкретную задачу.
-
O - Open/Closed Principle (Принцип открытости/закрытости)
- Суть: Программные сущности (классы, модули) должны быть открыты для расширения, но закрыты для модификации. Новая функциональность добавляется путем создания нового кода, а не изменения старого.
-
L - Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
- Суть: Объекты производных классов должны иметь возможность заменять объекты базовых классов без изменения корректности программы.
-
I - Interface Segregation Principle (Принцип разделения интерфейса)
- Суть: Лучше иметь много специализированных интерфейсов, чем один универсальный. Клиенты не должны зависеть от методов, которые они не используют.
-
D - Dependency Inversion Principle (Принцип инверсии зависимостей)
- Суть: Модули верхних уровней не должны зависеть от модулей нижних уровней. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей.
Пример на Python (Принцип единственной ответственности):
# ПЛОХО: Класс нарушает SRP, так как отвечает и за данные, и за их сохранение
class Report:
def __init__(self, title, content):
self.title = title
self.content = content
def save_to_file(self, filename):
with open(filename, 'w') as f:
f.write(f"{self.title}n{self.content}")
# ХОРОШО: Обязанности разделены
class Report:
"""Отвечает только за хранение данных отчета."""
def __init__(self, title, content):
self.title = title
self.content = content
class ReportSaver:
"""Отвечает только за сохранение отчета."""
def save_to_file(self, report, filename):
with open(filename, 'w') as f:
f.write(f"{report.title}n{report.content}")