Принцип открытости/закрытости (Open–closed principle)
13570

Принцип открытости/закрытости (Open-closed principle)


Принцип открытости/закрытости (OCP) - это один из основных принципов программной инженерии. Он гласит, что программный модуль (класс, метод и т.д.) должен быть открыт для расширения, но закрыт для модификации.

Это простая идея: если вы хотите, чтобы люди могли использовать и модифицировать ваш код, это должно быть для них легко! Но что это означает на самом деле?

Определение Мейера гласит, что класс должен быть открыт для расширения, но закрыт для модификации.

Класс открыт для расширения, если возможно добавление новых возможностей к исходному коду без изменения существующей кодовой базы. Другими словами, вы можете добавлять новые методы и поля без необходимости изменять существующие методы или классы. Вы также можете убедиться, что все модификаторы доступа являются приватными или защищенными, чтобы только определенные классы имели к ним доступ (например, при реализации наследования).

В целом идея состоит в том, что однажды разработанная реализация класса в дальнейшем требует только исправления ошибок, а новые или измененные функции требуют создания нового класса.

Класс закрыт для модификации, если добавление новых методов или полей потребует изменения других частей вашей программы (например, при использовании наследования).

Как проектировать, соблюдая принцип открытости/закрытости


При проектировании приложения вы хотите быть уверены, что ваши классы просты в использовании и легко расширяемы. Это означает, что когда вы пишете код в классе, у других программистов или пользователей этого класса должна быть возможность добавить новую функциональность без необходимости изменять существующий код, а также четко представлять все возможные side effects.

Для достижения этой цели все методы необходимо объявлять как общедоступные, за исключением тех, которые помечены как private (или protected). Делая все методы публичными, вы предоставляете доступ не только во время выполнения, но и во время компиляции, так как любой код может проверить любой метод, который был объявлен публичным, и внести соответствующие изменения. Это делает тестирование и дебаггинг кода более простым и удобным.

Желательно все переменные (поля, свойства) класса объявлять приватными. Это одна из наиболее устойчивых конвенций ООП. Переменные должны быть известны только методам класса, в котором они определены. Они не должны быть известны никаким другим классам, включая классы-наследники. Поэтому они должны быть объявлены с модификатором доступа private, а не public или protected. А использования глобальных переменных вообще стоит избегать.

Также стоит помнить об ограничивающих конструкциях final и implements – это готовые средства языка PHP для обеспечения закрытости класса.

После публикации интерфейса, контракт, который он описывает, закрывается от дальнейшей модификации. А значит и классы, которые реализуют интерфейс через implements, также закрыты от модификации контракта. При этом детали реализации этого контракта остаются открытыми для изменений.

Ключевое слово final запрещает наследование, а значит и создание дочерних классов с измененным поведением. Возможна только реализация опубликованного интерфейса. И это существенное преимущество – любое развитие архитектуры не влияет на существующий код, клиенты продолжают взаимодействовать с классом с закрытым от модификации контрактом через implements и закрытым от модификации поведением через final.

Какие шаблоны проектирования следуют принципу открытости/закрытости?

  • Адаптер
  • Мост
  • Фасад
  • Приспособленец (Flyweight) - с использованием паттерна Стратегия

Заключение


Принцип открытости/закрытости - это один из самых важных принципов проектирования, о котором вы должны знать при разработке программного обеспечения. Этот подход к проектированию программного обеспечения существует уже много лет. Но он все также полезен и сегодня. Он дает нам хороший способ обдумать наши проекты и то, как их можно расширить или изменить, не беспокоясь о том, что мы что-то сломаем в нашем приложении.

Получать оповещения о новых статьях:


Не нашли нужную статью? Предложите свою тему