Определение: Программная организация, такая как классы, модули и функции, должна быть открыта для расширений и закрыта для модификаций.
Происхождение проблемы: в течение жизненного цикла программного обеспечения, когда оригинальный код программного обеспечения должен быть изменен из -за изменений, обновлений и обслуживания, в старый код могут быть введены ошибки, и это также может заставить нас рефакторировать всю функцию, и исходный код должен быть повторный.
Решение: когда программное обеспечение должно измениться, постарайтесь достичь изменения, расширив поведение программного предприятия, а не изменяя существующий код.
Принцип открытия и закрытия является самым основным принципом дизайна в объектно-ориентированном дизайне, который направляет нас, как создать стабильную и гибкую систему. Принцип открытия и закрытия может быть самым расплывчатым определением шести принципов схемы проектирования. Это только говорит нам открыть и закрывать модификации, но как мы можем быть открыты и закрываться и не сказать нам четко. В прошлом, если кто -то говорил мне: «Вы должны соблюдать принцип открытия и закрытия при разработке», я бы чувствовал, что он ничего не сказал, но казалось, что он сказал все. Потому что принцип открытия и закрытия действительно слишком пуст.
После тщательного задуматься и прочитав множество статей о моделях дизайна, я наконец -то получил немного понимания принципа открытия и закрытия. Фактически, мы следуем первыми пятью принципами дизайна шаблонов, и цель использования 23 шаблонов проектирования состоит в том, чтобы следовать принципам открытия и закрытия. Другими словами, до тех пор, пока мы соблюдаем первые пять принципов, разработанное программное обеспечение, естественным образом соответствовать принципам открытия и закрытия. Этот принцип открытия и закрытия больше похож на «средний балл» степени соблюдения первых пяти принципов. Если предыдущие пять принципов хорошо следовали, средний балл, естественно, будет выше, что означает, что принципы открытия и закрытия проектирования программного обеспечения хорошо соблюдаются; Если предыдущие пять принципов не соблюдаются, это означает, что принципы открытия и закрытия не соблюдаются.
Фактически, автор считает, что принцип открытия и закрытия - это не что иное, как выражать значение: создать структуру с абстракцией и расширить детали с помощью реализации. Из -за гибкости и широкой адаптивности абстракции, до тех пор, пока абстракция является разумной, в основном можно поддерживать стабильность архитектуры программного обеспечения. Для деталей переменной в программном обеспечении мы используем класс реализации, полученный из реферата для расширения. Когда программное обеспечение должно измениться, нам нужно только повторно заработать класс реализации в соответствии с потребностями расширения. Конечно, предпосылка заключается в том, что наша абстракция должна быть разумной, и мы должны быть вперед и предвидеть изменения в спросе.
В определении принципа открытия и закрытия программная организация может ссылаться на программный модуль, локальную структуру, состоящую из нескольких классов, или независимый класс.
Любое программное обеспечение должно столкнуться с важной проблемой, то есть их потребности со временем изменятся. Когда система программного обеспечения необходимо удовлетворить новые потребности, мы должны стараться изо всех сил, чтобы обеспечить стабильную структуру проектирования системы. Если дизайн программного обеспечения соответствует принципу открытия и закрытия, может быть очень удобно расширить систему, и нет необходимости изменять существующий код при расширении, так что программная система обладает лучшей стабильностью и непрерывностью при адаптации и гибкости. По мере того, как программная шкала становится больше и больше, срок службы программного обеспечения становится все более длительным, а затраты на обслуживание программного обеспечения становятся выше и выше, а проектирование программных систем, которые соответствуют принципам открытия и закрытия, становится все более важным.
Чтобы соответствовать принципу открытия и закрытия, необходимо абстрактно разработать систему, а абстракция является ключом к принципу открытия и закрытия. В языках программирования, таких как Java и C#, для системы можно определить относительно стабильный уровень абстракции, а для завершения конкретного уровня реализации можно перенести различные поведения реализации. Во многих объектно-ориентированных языках программирования предоставляются такие механизмы, как интерфейсы и абстрактные классы, с помощью которых можно определить слой абстракции системы, а затем расширяться через бетонные классы. Если вам нужно изменить поведение системы, нет необходимости вносить какие -либо изменения в слое абстракции. Вам нужно только добавить новые конкретные классы для реализации новых бизнес -функций, чтобы расширить функции системы без изменения существующих кодов и соответствовать требованиям принципа открытия и закрытия.
Система CRM, разработанная Sunny Software, может отображать различные типы диаграмм, таких как круговые диаграммы и гистограммы. Чтобы поддержать несколько методов отображения диаграмм, оригинальный план проектирования показан на рисунке ниже:
Следующий фрагмент кода существует в методе Display () класса ChartDisplay:
...... if (type.equals ("pie")) {pieChart chart = new PieChart (); chart.display (); } else if (type.equals ("bar")) {barchart chart = new Barchart (); chart.display (); } ...... В этом коде, если вам нужно добавить новый класс диаграммы, такой как Linechart, вам необходимо изменить исходный код метода Display () класса chartdisplay и добавить новую логику суждения, которая нарушает принцип открытия и закрытия.
Система теперь перенастроена, чтобы соответствовать принципу открытия и закрытия.
В этом примере, поскольку каждый класс диаграммы запрограммирован в методе Display () класса chartdisplay, добавление нового класса диаграммы должен изменить исходный код. Система может быть отражена абстрактной способом, чтобы при добавлении новых классов диаграмм не нужно изменять исходный код, который удовлетворяет принципу открытия и закрытия. Конкретные методы следующие:
(1) Добавьте абстрактную диаграмму класса AbstractChart и используйте различные конкретные классы диаграммы в качестве их подклассов;
(2) Класс Chartdisplay запрограммирован для классов абстрактных диаграмм, и клиент решает, какую специфическую диаграмму использовать.
Структура после реконструкции показана на рисунке ниже:
На рисунке 2 мы вводим абстрактную диаграмму класса AbstractChart, а ChartDisplay запрограммирована для класса абстрактной диаграммы, и клиент устанавливает созданный конкретный объект диаграммы с помощью метода setCart (). В методе Display () chartDisplay метод Display () объекта диаграммы вызывается для отображения диаграммы. Если вам нужно добавить новый диаграмму, такой как LineChart, вам нужно использовать LineChart только в качестве подкласса AbstractChart и ввести объект LineChart в chartDisplay на клиенту, без изменения исходного кода существующей библиотеки классов.
Примечание. Поскольку файлы конфигурации в таких форматах, как XML и свойства, являются простыми текстовыми файлами, их можно отредактировать непосредственно через VI -редактор или блокнот без компиляции, в разработке программного обеспечения изменение файлов конфигурации, как правило, не считается изменением исходного кода системы. Если система включает в себя изменение файла конфигурации только при расширении, а исходный код Java или C# код не внесли никаких изменений, система может считаться системой, которая соответствует принципу открытия и закрытия.