Принцип открытости/закрытости — это самый основной принцип проектирования в мире разработки программного обеспечения. Он помогает нам построить стабильную и гибкую систему.
Определение:
Программная сущность, такая как класс, модуль и функция, должна быть открыта для расширения и закрыта для модификации.
Смысл принципа открытия и закрытия заключается в том, что программный объект должен быть расширен для достижения изменений, а не путем модификации существующего кода для достижения изменений.
Принцип открытия и закрытия — это принцип, который ограничивает текущую разработку и проектирование будущих вещей программного объекта.
Примечание. Принцип открытия и закрытия открыт для расширения и закрыт для модификации. Это не означает, что никаких модификаций не будет. Изменения в низкоуровневых модулях должны быть сопряжены с высокоуровневыми модулями, иначе это будет изолированный и бессмысленный фрагмент кода.
Важность принципа открытия и закрытия:
- Влияние принципов открытия и закрытия на тестирование
Принцип открытия и закрытия заключается в том, чтобы исходный тестовый код все еще мог нормально работать, нам нужно только протестировать расширенный код.
- Принцип открытия и закрытия может улучшить возможность повторного использования
В объектно-ориентированном дизайне вся логика объединяется из атомарной логики, вместо того, чтобы реализовывать бизнес-логику в классе независимо. Только таким образом можно повторно использовать код. Чем меньше степень детализации, тем больше вероятность повторного использования.
- Открытый и закрытый принцип может улучшить ремонтопригодность
- Требования к объектно-ориентированной разработке
Как использовать принцип открытия и закрытия:
Во- первых , ограничьте расширение через интерфейс или абстрактный класс, ограничьте расширение границы и не допускайте общедоступных методов, которых нет в интерфейсе или абстрактном классе;
Во- вторых , попробуйте использовать интерфейсы или абстрактные классы для типов параметров и ссылочных объектов вместо классов реализации;
В- третьих , уровень абстракции должен быть максимально стабильным, после его подтверждения никакие модификации не допускаются.
Инкапсуляция изменений имеет два значения:
Во-первых, инкапсулируйте те же изменения в интерфейс или абстрактный класс;
Во-вторых, инкапсулируйте различные изменения в разные интерфейсы или абстрактные классы. Два разных изменения не должны появляться в одном и том же интерфейсе или абстрактном классе.
Примеры
Например, открытие и закрытие дверей вручную.

Если есть новый спрос, необходимо увеличить функцию открытия и закрытия ящика вручную. Для кода вам нужно добавить класс Drawer и одновременно изменить класс Hand.

Следуя примеру принципа открытия и закрытия OCP, открытие и закрытие двери вручную зависит от интерфейса, и конкретный класс реализации реализует этот интерфейс.

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

Дополнительные ресурсы по объектно-ориентированному стилю
Эта статья также доступна на Deutsch, English, Español, فارسی, Français, Bahasa Indonesia, 日本語, Polski, Portuguese, Việt Nam, 简体中文 and 繁體中文