Оформить заказ по Принципу единой ответственности здесь, если вы еще этого не сделали,

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

Модуль должен быть открыт для расширения и закрыт для модификации.

Неформально не должно быть никаких изменений в существующем коде для новых требований.

Для любой системы всегда будет больше изменений в соответствии с бизнес-требованиями, которые необходимо интегрировать в существующую кодовую базу. Если модуль не следует OCP, то изменение в одном модуле может привести к каскадному сбою в других модулях, чтобы избежать этого.

Разрабатывайте свои классы, интерфейсы и методы таким образом, чтобы они,

Открыто для расширения: будущие требования должны быть удовлетворены путем ДОБАВЛЕНИЯ новых классов, интерфейсов или функций, которые могут расширять или реализовывать существующие.

Закрыто для модификации: БЕЗ изменения существующих классов, интерфейсов или функций.

Как это сделать?

Абстракция — это ключ.

Во-первых, давайте рассмотрим популярный пример, нарушающий OCP.

Существует класс ShapeDrawer, который рисует все поддерживаемые типы фигур.

Теперь, в будущем, если мы хотим поддерживать форму треугольника, мы должны добавить класс Triangle, но нам потребуются изменения в существующем перечислении ShapeType и drawAllShapes. () класса ShapeDrawer, это нарушение принципа OCP. ShapeDrawer не закрыт для модификации.

Давайте посмотрим, как мы можем избежать этого, используя абстракции,

  1. В приведенном выше коде для поддержки треугольника нам просто нужно добавить класс Triangle с методом draw() без изменения класса ShapeDrawer и, следовательно, он соответствует OCP.
  2. Интерфейс shape открыт для расширения, а ShapeDrawer закрыт для модификации для рисования новых фигур.
  3. Это не означает, что она закрыта для всех будущих требований, но если вы сможете разобраться с динамическими компонентами системы и иметь для них соответствующие абстракции, система будет жесткой.

ОКП,

  1. Гарантирует, что будущие изменения не приведут к непредвиденным побочным эффектам.
  2. Обеспечивает гибкость, возможность повторного использования и ремонтопригодность кода.

Но как нам использовать абстракционные конструкции, такие как наследование и полиморфизм, чтобы соответствовать OCP? есть ли какой-то принцип для этого?

Да, далее Принцип замещения Лискова помогает в этом