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

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

PuzzleCore

Продолжаю писать на тему SOLID. И перехожу к следующему пункту OCP(open-closed principle).

Принцип открытости/закрытости.
Программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения и закрыты для изменений.

Если кратко и ясно то:

  1. Открыты для расширения - поведение модуля может быть расширено. То есть мы можем добавить модулю новое поведение в соответствии с изменившимися требованиями к приложению или для удовлетворения нужд новых приложений.
  2. Закрыты для изменений - исходный код такого модуля неприкасаем. Никто не вправе вносить в него изменения.

Казалось бы два противоположенных условия. Но! В течение 1990-х принцип открытости/закрытости стал де-факто переопределён для применения с абстрактными интерфейсами, реализации которых могут быть изменены, и могут быть созданы множественные реализации и полиморфно замещены одна на другую. Таким образом мы подходим к такому определению как - Абстракция.

Абстракции — это абстрактные базовые классы, а неограниченный набор возможных поведений представлен всеми возможными классами-наследниками. Модуль может манипулировать абстракцией. Такой модуль закрыт для изменений, так как он зависит от фиксированной абстракции. Также поведение модуля может быть расширено созданием новых наследников абстракции.

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

Report Page