
- SRP: Single Responsibility Principle (Принцип единой ответственности)
- OCP: Open-Closed Principle (Принцип открытости-закрытости)
- LSP: Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
- ISP: Interface Segregation Principle (Принцип разделения интерфейса)
- DIP: Dependency Inversion Principle (Принцип инверсии зависимостей)
Здесь и далее модуль это класс или функция. Модуль реализует только один функционал.
Принцип единственной ответственности
- Модуль должен реализовывать один и только один функционал.
- Должна быть одна и только одна причина (actor) изменения этого функционала.
- Причины (акторы), это по сути пользователи этого функционала.
Если в обычном языке добавить новое слово, то ничего не поломается, а вот если изменить имеющееся слово (по сути его смысл), то это может привести к весьма печальным последствиям. В программах слова это классы и функции. Их нельзя изменять!
Принцип открытости-закрытости
- Модули должны быть открыты для расширения, но закрыты для изменения.
- Изменение это редактирование кода модуля. Редактировать нельзя, устранять дефекты можно.
- Расширение это добавление нового функционала.
Иными словами, имеющийся код нельзя редактировать. Можно только исправлять дефекты. Имеющийся код можно пополнять новым функционалом (расширять) только путем добавления новых модулей. В этом случае добавление нового функционала не будет сопровождаться кучей правок, а будет выглядеть так: добавили новый модуль и где-то его подключили.
Принцип подстановки Барбары Лисков
- Квадрат это не частный случай Прямоугольника.
- Интерфейс потомков не должен менять интерфейс предка.
- Перечисления запрещаем (enum, switch, catch, if/else и т.п.).
- Перечисления можно использовать, если есть гарантии что они конечные.
Принцип разделения интерфейса
- Наследуемые классы не должны содержать не реализованный интерфейс
Например Бесплатная парковка, если она наследуется от Парковки, вынуждена реализовать методы оплаты (несмотря на то, что она бесплатная). Решение: сделать два интерфейса Почасовая оплата и Парковка. И сделать классы Бесплатная парковка (реализует Парковку) и Платная парковка (реализует оба интерфейса).
Принцип инверсии зависимостей
- Классы должны зависеть от интерфейсов или абстрактных классов.
- Класс нельзя наследовать от конкретного класса.
Ссылки
Принцип Разделения Интерфейса от Сергея Немчинского
Курсы
https://www.udemy.com/course/solid-connascence/
https://futurio.ru/
https://proglib.academy/