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

В объектно-ориентированном программировании принцип открытости/закрытости (open/closed principle) гласит: "программные объекты (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации"; то есть такая сущность может допускать расширение (extend) своего поведения без изменения исходного кода самой сущности.

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

Принцип открытости/закрытости - один из пяти принципов SOLID объектно-ориентированного проектирования.

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

Бертрану Мейеру обычно приписывают то, что он породил термин "принцип открытости/закрытости", который появился в его книге "Построение объектно-ориентированного программного обеспечения" 1988 года.

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

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

В то время, когда Мейер писал, добавление полей или функций в библиотеку неизбежно требовало внесения изменений в любые программы в зависимости от этой библиотеки. Предлагаемое Мейером решение этой дилеммы опиралось на понятие объектно-ориентированного наследования (в частности, наследования реализации):

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

Полиморфный принцип открытости/закрытости

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

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

Статья Роберта К. Мартина 1996 года "Принцип открытого доступа" была одной из основополагающих работ, использовавших этот подход. В 2001 году Крейг Ларман связал принцип открытости/закрытости с паттерном Алистера Кокберна, названного "Защищенные изменения", и с обсуждением Дэвида Парнаса о сокрытии информации.


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Хэш-таблица: разрешение коллизий

Нормальные формы, пример нормализации в базе данных