Заключение
Что важно запомнить о OCP
-
OCP – это про направление изменений.
Класс должен быть открыт для расширения, но закрыт для изменения. Если для добавления новой фичи вы меняете существующий код – вы нарушаете OCP. Если вы можете добавить фичу, написав новый класс – вы на верном пути. -
Не путайте абстракцию и сложность.
Интерфейсы и абстрактные классы – это инструменты, а не самоцель. Иногда проще добавитьif/else, чем создавать иерархию из трёх классов. Главное – осознанность, а не фанатизм. -
Главный признак нарушения – цепочки условий.
Если вы видитеif/elseилиswitchпо типу объекта или строки – это почти всегда нарушение OCP. Замените их на полиморфизм, стратегии или конфигурацию. -
Инструменты OCP – полиморфизм и конфигурация.
Вместо жёстко зашитой логики используйте интерфейсы, стратегии, цепочки обязанностей, фабрики и конфигурацию. Это сделает код гибким без изменения существующих классов. -
OCP помогает другим принципам SOLID.
- LSP (Liskov Substitution): наследники должны быть подставляемы без изменения клиентского кода — это основа для расширения через наследование.
- ISP (Interface Segregation): узкие интерфейсы проще расширять, чем толстые.
- DIP (Dependency Inversion): абстракции позволяют подменять реализации без изменения верхних уровней.
Помните: идеальный класс – это класс, который вы можете расширить, не заглядывая в его код. Если для добавления новой фичи вам нужно открыть существующий класс – скорее всего, OCP нарушен.
Теперь, когда вы разобрали девять реальных примеров и прошли чек-лист, вы готовы применять OCP в своих проектах. Переходите к следующему принципу – Liskov Substitution (LSP).