Что такое принципы SOLID и для чего они применяются в ООП

Ответ

SOLID — это акроним для пяти основных принципов объектно-ориентированного проектирования, которые помогают создавать гибкие, масштабируемые и поддерживаемые программные системы.

Цель применения: Уменьшить зависимости между компонентами системы, чтобы изменения в одной части кода не приводили к непредсказуемым сбоям в другой.

Принципы SOLID:

  1. S - Single Responsibility Principle (Принцип единственной ответственности)

    • Суть: Класс должен иметь только одну причину для изменения. Он должен отвечать за одну конкретную задачу.
  2. O - Open/Closed Principle (Принцип открытости/закрытости)

    • Суть: Программные сущности (классы, модули) должны быть открыты для расширения, но закрыты для модификации. Новая функциональность добавляется путем создания нового кода, а не изменения старого.
  3. L - Liskov Substitution Principle (Принцип подстановки Барбары Лисков)

    • Суть: Объекты производных классов должны иметь возможность заменять объекты базовых классов без изменения корректности программы.
  4. I - Interface Segregation Principle (Принцип разделения интерфейса)

    • Суть: Лучше иметь много специализированных интерфейсов, чем один универсальный. Клиенты не должны зависеть от методов, которые они не используют.
  5. 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}")