Open/Closed
Тема дорожной карты · Software Architecture
Принцип открытости/закрытости (Open/Closed Principle, OCP) — это ключевой принцип объектно-ориентированного программирования, который подразумевает, что программные сущности должны быть открыты для расширения, но закрыты для модификации. Это означает, что код должен быть способен добавлять новые функции без изменения существующего кода. Принцип OCP крайне важен для поддержания стабильности кодовой базы и упрощения процесса разработки.
Как это работает
Принцип открытости/закрытости достигается через использование полиморфизма, плагинов и паттернов проектирования, таких как паттерн стратегии (Strategy Pattern). Вместо того чтобы добавлять новые ветки условий if (newType) { ... } в существующий код, следует извлечь интерфейс и добавить новую реализацию. Это позволяет коду расширяться без необходимости вносить изменения в существующий код.
Паттерн стратегии — это классический пример реализации OCP. Он позволяет изменять поведение объекта в зависимости от текущего контекста, добавляя новые стратегии без необходимости изменения существующих классов. Аналогично, паттерн посетителя (Visitor Pattern) используется для реализации принципа открытости/закрытости в ситуациях двойного диспатчинга, где метод вызывается в зависимости от типа обоих аргументов.
Когда применять
Принцип открытости/закрытости особенно полезен для доменной логики, которая имеет варианты, которые могут появляться со временем. Это может включать различные методы оплаты, форматы отчётов или парсеры файлов. В таких случаях использование OCP позволяет легко добавлять новые функции без необходимости вносить изменения в существующий код.
Однако, применение OCP не всегда целесообразно. Например, для однообразного кода, который не требует новых вариантов, применение OCP может привести к избыточной абстракции, что усложнит понимание кода и добавит ненужную сложность.
Типичные ошибки
- Овер-абстракция — одна из распространенных ошибок при применении принципа открытости/закрытости заключается в том, что каждый класс прячется за интерфейсом. Это может сделать навигацию по коду сложной и затруднить понимание его структуры. Вместо этого следует добавлять абстракции только тогда, когда реальные варианты появляются.
- Передовая работа над плагинами — иногда разработчики пытаются создать архитектуру, которая может быть легко расширена, даже если они не уверены, нужны ли им 5 или 50 вариантов. Это может привести к избыточной сложности и усложнить поддержку кода.
- Претензия на OCP при редактировании существующих классов — иногда разработчики могут утверждать, что они применяют принцип открытости/закрытости, даже если они редактируют существующие классы. Важно помнить, что ценность принципа заключается в реальном отсутствии правок, а не в его видимости.