В объектно-ориентированном программировании принцип открытости–закрытости (OCP) гласит: « сущности программного обеспечения (классы, модули, функции и т. д.) должны быть открыты для расширения, но закрыты для модификации » [1] ; то есть такая сущность может позволить расширять свое поведение без изменения ее исходного кода .
Название принципа открытости–закрытости использовалось двумя способами. Оба способа используют обобщения (например, наследование или делегирование функций) для разрешения кажущейся дилеммы, но цели, методы и результаты различны.
Принцип открытости-закрытости является одним из пяти принципов SOLID объектно-ориентированного проектирования.
Бертрану Мейеру обычно приписывают создание термина « принцип открытости–закрытости» [ 2] , который появился в его книге 1988 года «Конструирование объектно-ориентированного программного обеспечения » [1] : 23
- Модуль будет считаться открытым, если он все еще доступен для расширения. Например, должна быть возможность добавлять поля к структурам данных, которые он содержит, или новые элементы к набору функций, которые он выполняет.
- Модуль будет считаться закрытым, если [он] доступен для использования другими модулями. Это предполагает, что модулю было дано четко определенное, стабильное описание (интерфейс в смысле сокрытия информации).
В то время, когда Мейер писал, добавление полей или функций в библиотеку неизбежно требовало внесения изменений в любые программы, зависящие от этой библиотеки. [ требуется ссылка ] Предложенное Мейером решение этой проблемы основывалось на идее объектно-ориентированного наследования (в частности, наследования реализации ): [1] : 229
Класс закрыт, так как он может быть скомпилирован, сохранен в библиотеке, базирован и использован клиентскими классами. Но он также открыт, так как любой новый класс может использовать его как родительский, добавляя новые возможности. Когда определяется класс-потомок, нет необходимости изменять исходный или беспокоить его клиентов.
В 1990-х годах принцип открытости-закрытости стал широко использоваться для обозначения использования абстрактных интерфейсов, где реализации могут быть изменены, а также могут быть созданы и полиморфно заменены друг другом несколько реализаций.
В отличие от использования Мейером, это определение пропагандирует наследование от абстрактных базовых классов . Спецификации интерфейсов могут быть повторно использованы посредством наследования, но реализация не обязательно должна быть. Существующий интерфейс закрыт для модификаций, и новые реализации должны, как минимум, реализовывать этот интерфейс.
Статья Роберта К. Мартина 1996 года «Принцип открытости-закрытости» [2] была одним из основополагающих трудов, в которых использовался этот подход. В 2001 году Крейг Ларман связал принцип открытости-закрытости с моделью Алистера Кокберна под названием «Защищенные вариации » и с обсуждением Дэвида Парнаса сокрытия информации . [3]