Принцип открытости-закрытости

ТВЕРДЫЙ |
---|
Принципы |
В объектно-ориентированном программировании принцип открытости-закрытости (OCP) гласит: « Программные объекты (классы, модули, функции и т. д.) должны быть открыты для расширения, но закрыты для модификации »; [1] то есть такая сущность может позволить расширить свое поведение без изменения исходного кода .
Название «принцип открытости-закрытости» использовалось двояко. Оба способа используют обобщения (например, наследование или функции делегирования) для решения очевидной дилеммы, но цели, методы и результаты различны.
Принцип открытости-закрытости — один из пяти SOLID принципов объектно-ориентированного проектирования .
Принцип открытости-закрытости Мейера
[ редактировать ]Бертрану Мейеру обычно приписывают создание термина « принцип открытости-закрытости» . [2] который появился в его книге 1988 года «Объектно-ориентированное построение программного обеспечения» . [1] : 23
- Модуль будет называться открытым, если он все еще доступен для расширения. Например, должна быть возможность добавлять поля к содержащимся в нем структурам данных или новые элементы к набору выполняемых им функций.
- Говорят, что модуль закрыт, если [он] доступен для использования другими модулями. Это предполагает, что модулю дано четко определенное, стабильное описание (интерфейс в смысле сокрытия информации).
В то время, когда Мейер писал, добавление полей или функций в библиотеку неизбежно требовало внесения изменений в любые программы, зависящие от этой библиотеки. [ нужна ссылка ] Предложенное Мейером решение этой проблемы основывалось на понятии объектно-ориентированного наследования (в частности, наследования реализации ): [1] : 229
Класс является закрытым, поскольку он может быть скомпилирован, сохранен в библиотеке, базирован и использован клиентскими классами. Но он также открыт, поскольку любой новый класс может использовать его в качестве родительского, добавляя новые возможности. Когда класс-потомок определен, нет необходимости изменять исходный класс или беспокоить его клиентов.
Полиморфный принцип открытости-закрытости
[ редактировать ]В 1990-х годах принцип открытости-закрытости стал широко переопределен и стал относиться к использованию абстрактных интерфейсов, где реализации могут быть изменены и могут быть созданы несколько реализаций и полиморфно заменены друг другом.
В отличие от использования Мейера, это определение поддерживает наследование от абстрактных базовых классов . Спецификации интерфейса можно повторно использовать посредством наследования, но реализация не обязательна. Существующий интерфейс закрыт для модификаций, и новые реализации должны, как минимум, реализовывать этот интерфейс.
Статья Роберта К. Мартина 1996 года «Принцип открытости-закрытости» [2] была одной из основополагающих работ, применивших этот подход. В 2001 году Крейг Ларман связал принцип открытости-закрытости с паттерном Алистера Кокберна под названием «Защищенные вариации» и с Дэвидом Парнасом обсуждением сокрытия информации . [3]
См. также
[ редактировать ]- SOLID – буква «O» в слове «SOLID» представляет принцип открытия-закрытия.
- Принцип надежности
Ссылки
[ редактировать ]- ^ Jump up to: а б с Мейер, Бертран (1988). Объектно-ориентированное построение программного обеспечения . Прентис Холл. ISBN 0-13-629049-3 .
- ^ Jump up to: а б Роберт К. Мартин «Принцип открытости-закрытости», отчет C ++ , январь 1996 г. Архивировано 22 августа 2006 г. в Wayback Machine.
- ^ Ларман, Крейг (май – июнь 2001 г.). «Защищенный вариант: важность закрытости» (PDF) . Программное обеспечение IEEE . 18 (2). ИИЭР: 89–91. дои : 10.1109/52.922731 .