Оформить заказ по Принципу единой ответственности здесь, если вы еще этого не сделали,
Принцип открытия-закрытия:
Модуль должен быть открыт для расширения и закрыт для модификации.
Неформально не должно быть никаких изменений в существующем коде для новых требований.
Для любой системы всегда будет больше изменений в соответствии с бизнес-требованиями, которые необходимо интегрировать в существующую кодовую базу. Если модуль не следует OCP, то изменение в одном модуле может привести к каскадному сбою в других модулях, чтобы избежать этого.
Разрабатывайте свои классы, интерфейсы и методы таким образом, чтобы они,
Открыто для расширения: будущие требования должны быть удовлетворены путем ДОБАВЛЕНИЯ новых классов, интерфейсов или функций, которые могут расширять или реализовывать существующие.
Закрыто для модификации: БЕЗ изменения существующих классов, интерфейсов или функций.
Как это сделать?
Абстракция — это ключ.
Во-первых, давайте рассмотрим популярный пример, нарушающий OCP.
Существует класс ShapeDrawer, который рисует все поддерживаемые типы фигур.
Теперь, в будущем, если мы хотим поддерживать форму треугольника, мы должны добавить класс Triangle, но нам потребуются изменения в существующем перечислении ShapeType и drawAllShapes. () класса ShapeDrawer, это нарушение принципа OCP. ShapeDrawer не закрыт для модификации.
Давайте посмотрим, как мы можем избежать этого, используя абстракции,
- В приведенном выше коде для поддержки треугольника нам просто нужно добавить класс Triangle с методом draw() без изменения класса ShapeDrawer и, следовательно, он соответствует OCP.
- Интерфейс shape открыт для расширения, а ShapeDrawer закрыт для модификации для рисования новых фигур.
- Это не означает, что она закрыта для всех будущих требований, но если вы сможете разобраться с динамическими компонентами системы и иметь для них соответствующие абстракции, система будет жесткой.
ОКП,
- Гарантирует, что будущие изменения не приведут к непредвиденным побочным эффектам.
- Обеспечивает гибкость, возможность повторного использования и ремонтопригодность кода.
Но как нам использовать абстракционные конструкции, такие как наследование и полиморфизм, чтобы соответствовать OCP? есть ли какой-то принцип для этого?
Да, далее Принцип замещения Лискова помогает в этом