Подтвердить что ты не робот

В чем смысл и аргументы Открытого/Закрытого Принципа?

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

4b9b3361

Ответ 1

В частности, речь идет о "Святом Граале" дизайна в ООП, позволяющем сделать объект достаточно расширяемым (посредством индивидуального дизайна или посредством его участия в архитектуре) для поддержки будущих непредвиденных изменений без переписывания его кода (а иногда даже без повторная компиляция **).

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

** См. 6 "принципы пакета", REP, CCP, CRP, ADP, SDP, SAP

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Другим действительно важным принципом объектно-ориентированного проектирования является свободная связь через интерфейс метода. Если изменение, которое вы хотите сделать, не влияет на существующий интерфейс, это действительно безопасно изменить. Например, чтобы сделать алгоритм более эффективным. Объектно-ориентированные принципы также должны быть смягчены здравым смыслом:)

Ответ 5

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

Часто полиморфизм, например, использование интерфейсов, является хорошим инструментом для достижения этого.

Ответ 6

Программные объекты должны быть открыты для расширения, но закрыты для модификации

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

Плохой пример в Javascript

var juiceTypes = ['Mango','Apple','Lemon'];
function juiceMaker(type){
    if(juiceTypes.indexOf(type)!=-1)
        console.log('Here is your juice, Have a nice day');
    else
        console.log('sorry, Error happned');
}

exports.makeJuice = juiceMaker;

Теперь, если вы хотите добавить другой тип Juice, вам нужно отредактировать сам модуль. Таким образом, мы нарушаем OCP.

Хороший пример в Javascript

var juiceTypes = [];
function juiceMaker(type){
    if(juiceTypes.indexOf(type)!=-1)
        console.log('Here is your juice, Have a nice day');
    else
        console.log('sorry, Error happned');
}
function addType(typeName){
    if(juiceTypes.indexOf(typeName)==-1)
        juiceTypes.push(typeName);
}
function removeType(typeName){
    if (juiceTypes.indexOf(typeName)==-1)
        juiceTypes.splice(typeName,1);
}

exports.makeJuice = juiceMaker;
exports.addType = addType;
exports.removeType = removeType;

Теперь вы можете добавлять новые типы соков извне модуля без редактирования того же модуля.

Ответ 7

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

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

Ответ 8

Я просто хочу подчеркнуть, что "Open/Closed", хотя он явно полезен при программировании OO, - это здоровый метод для использования во всех аспектах развития. Например, по моему собственному опыту, больной обезболивающий использовать как можно больше "Open/Closed" при работе с простым C.

/Роберт

Ответ 9

Это означает, что программное обеспечение OO должно строиться, но не меняться по существу. Это хорошо, потому что он обеспечивает надежную, предсказуемую производительность базовых классов.

Ответ 10

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

Мне нравится думать, что Open/Closed разделены на две тесно связанные части:

  • Код Открыть для изменения может либо изменить его поведение, чтобы правильно обрабатывать его входные данные, либо требует минимальной модификации для обеспечения новых сценариев использования.
  • Код Закрыт для модификации не требует многого, если какое-либо вмешательство человека для обработки новых сценариев использования. Потребности просто не существует.

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

Что касается реализации? Я считаю, что общепринятая интерпретация: "Open/Closed означает, что код является полиморфным!" быть в лучшем случае неполным выражением. Полиморфизм в коде - один из способов достижения такого рода поведения; Наследование, реализация... действительно, каждый объектно-ориентированный принцип проектирования необходим для написания кода, который является устойчивым в том смысле, который подразумевается в этом принципе.

Ответ 11

В Принципе дизайна SOLID - "O" в "SOLID" означает принцип открытия/закрытия.

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

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

Преимущества открытого закрытого принципа дизайна:

  • Приложение будет более надежным, потому что мы не меняем уже тестируемый класс.
  • Гибкость, потому что мы можем легко вместить новые требования.
  • Простота тестирования и снижение вероятности ошибок.

Мое сообщение в блоге об этом:

http://javaexplorer03.blogspot.in/2016/12/open-closed-design-principle.html