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

intro

  • SRP: Single Responsibility Principle (Принцип единой ответственности)
  • OCP: Open-Closed Principle (Принцип открытости-закрытости)
  • LSP: Liskov Substitution Principle (Принцип подстановки Барбары Лисков)
  • ISP: Interface Segregation Principle (Принцип разделения интерфейса)
  • DIP: Dependency Inversion Principle (Принцип инверсии зависимостей)
Уточнение

Здесь и далее модуль это класс или функция. Модуль реализует только один функционал.

Принцип единственной ответственности

  1. Модуль должен реализовывать один и только один функционал.
  2. Должна быть одна и только одна причина (actor) изменения этого функционала.
  3. Причины (акторы), это по сути пользователи этого функционала.
Внимание кодерам!

Если в обычном языке добавить новое слово, то ничего не поломается, а вот если изменить имеющееся слово (по сути его смысл), то это может привести к весьма печальным последствиям. В программах слова это классы и функции. Их нельзя изменять!

Принцип открытости-закрытости

  1. Модули должны быть открыты для расширения, но закрыты для изменения.
  2. Изменение это редактирование кода модуля. Редактировать нельзя, устранять дефекты можно.
  3. Расширение это добавление нового функционала.
Пояснение

Иными словами, имеющийся код нельзя редактировать. Можно только исправлять дефекты. Имеющийся код можно пополнять новым функционалом (расширять) только путем добавления новых модулей. В этом случае добавление нового функционала не будет сопровождаться кучей правок, а будет выглядеть так: добавили новый модуль и где-то его подключили.

Принцип подстановки Барбары Лисков

  1. Квадрат это не частный случай Прямоугольника.
  2. Интерфейс потомков не должен менять интерфейс предка.
  3. Перечисления запрещаем (enum, switch, catch, if/else и т.п.).
  4. Перечисления можно использовать, если есть гарантии что они конечные.

Принцип разделения интерфейса

  1. Наследуемые классы не должны содержать не реализованный интерфейс
Пример

Например Бесплатная парковка, если она наследуется от Парковки, вынуждена реализовать методы оплаты (несмотря на то, что она бесплатная). Решение: сделать два интерфейса Почасовая оплата и Парковка. И сделать классы Бесплатная парковка (реализует Парковку) и Платная парковка (реализует оба интерфейса).

Принцип инверсии зависимостей

  1. Классы должны зависеть от интерфейсов или абстрактных классов.
  2. Класс нельзя наследовать от конкретного класса.

Ссылки

Принцип Разделения Интерфейса от Сергея Немчинского

Курсы

https://www.udemy.com/course/solid-connascence/
https://futurio.ru/
https://proglib.academy/