Перейти к основному содержимому

SOLID

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

SOLID и ООП: в чём разница?

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

Принципы SOLID

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

Каждый класс должен решать одну задачу. Делай модули меньше.
Пример: класс "Order" отвечает только за управление заказом, а уведомления отправляются другим классом.
Связь с ООП: связан с инкапсуляцией — каждый объект скрывает детали своей реализации и выполняет только одну функцию.

2. Open/Closed Principle (Принцип открытости/закрытости)

Класс должен быть открыт для расширений, но закрыт для изменений. Делай модули расширяемыми.
Пример: чтобы добавить новый тип отчёта, создаём новый класс, не изменяя существующий код.
Связь с ООП: использует наследование — создание новых классов на основе существующих; и полиморфизм — способность объектов разных типов использовать общий интерфейс для выполнения различных действий.

3. Liskov Substitution Principle (Принцип подстановки Барбары Лисков)

Подклассы должны заменять родительские классы без ошибок. Наследуйся правильно.
Пример: если класс "Bird" имеет метод "fly", класс "Penguin" не должен его наследовать, так как пингвины не летают.
Связь с ООП: связан с принципом наследования. Подклассы должны правильно реализовывать поведение родительских классов, не нарушать полиморфизм.

4. Interface Segregation Principle (Принцип разделения интерфейса)

Узкие специализированные интерфейсы лучше, чем один общий. Дроби интерфейсы.
Пример: вместо общего интерфейса "Animal" создаём отдельные интерфейсы "Flyable", "Swimmable", "Runnable".
Связь с ООП: поддерживает полиморфизм и инкапсуляцию. Это делает классы более гибкими и позволяет зависеть только от нужных методов.

5. Dependency Inversion Principle (Принцип инверсии зависимостей)

Модули должны зависеть от абстракций, а не от конкретных реализаций. Используй интерфейсы.
Пример: класс "UserService" зависит от интерфейса "Database", а не от конкретной реализации БД.
Связь с ООП: использование абстракций (отделение концепции от её реализации) и полиморфизма для уменьшения зависимости между модулями.

SOLID и TDD

Применение SOLID упрощает тестирование, т.к. классы становятся независимыми и легче заменяются в тестах.
Полезно при написании модульных тестов, где каждый модуль можно тестировать изолированно.

Когда неприменим?

  • В простых / небольших проектах, где соблюдение всех принципов излишне
  • Когда проект в стадии создания прототипа и архитектура ещё не устоялась
  • Когда производительность важнее читаемости кода (например, в проектах с ограниченными ресурсами)

Нарушение SOLID приводит к антипаттернам, таким как:

Зачем аналитику SOLID?

  • Поможет оценить архитектуру на этапе проектирования
    Пример: при добавлении новых способов оплаты система не должна требовать переписывания основного кода (принцип 1)

  • Для составления требований к разработке и задач рефакторинга
    Пример: если каждая функция изолирована, то изменения не затронут другие модули (принцип 1)

  • Для согласования архитектуры с разработкой
    Пример: корректное использование интерфейсов предотвратит сложную интеграцию с новыми системами в будущем (принцип 4)

Подборка материалов по теме SOLID

  1. Принципы SOLID в программировании — что это такое
  2. Принципы SOLID, только понятно
  3. SOLID
  4. Простое объяснение принципов SOLID
  5. SOLID принципы: что это такое и зачем они нужны?
  6. Понятнее о S.O.L.I.D
  7. Принципы SOLID, о которых должен знать каждый разработчик
  8. SOLID — это несложно. С примерами на Python
  9. SOLID == ООП?
  10. Лучшие практики применения принципов SOLID в React
  11. SOLID in React
  12. SOLID в Swift. Простое объяснение с примерами для начинающих
  13. Это классика, это знать надо: DRY, KISS, SOLID, YAGNI и другие полезные сокращения
  14. Шпаргалка по SOLID-принципам с примерами на PHP
  15. Зачем системному аналитику читать «Чистую архитектуру» Роберта Мартина
  16. Должен ли аналитик уметь в код и архитектуру: 5 причин, почему да

Посты из нашего канала

  1. Основы ООП
  2. Антипаттерны проектирования ПО
  3. GRASP: краткий обзор

Видео

  1. Принципы SOLID / С Примерами На Python
  2. Просто о SOLID (Принципы SOLID)
  3. SOLID за 2 минуты
  4. SOLID принципы простым языком (много примеров)
  5. Простой рабочий алгоритм использования SOLID на практике
  6. SOLID - ный Реакт!
  7. Просто об ООП и SOLID: Путь к Программированию для Новичков! Наследование и Классы для Начинающих

Книги

  1. Чистая архитектура — Роберт Мартин
  2. Объектно-ориентированный анализ и проектирование с примерами приложений - Грэди Буч
  3. Объектно-ориентированное мышление - Мэтт Вайсфельд
  4. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Хелм Ричард, Влиссидес Джон
  5. UML 2 и Унифицированный процесс, практический объектно-ориентированный анализ и проектирование - Арлоу Джим, Нейштадт Айла