Это, наверное, самый сложный из твердых принципов, чтобы объяснить. Дай мне попробовать. Представьте, что вы написали класс Invoice, который отлично работает и не содержит ошибок. Это делает PDF счета-фактуры.
Затем кто-то говорит, что хочет получить HTML-счет со ссылками. Вы не изменяете какой-либо код в инвойсе для удовлетворения этого запроса. Вместо этого вы создаете другой класс, HTMLInvoice, который делает то, что они сейчас хотят. Вы используете наследование, чтобы вам не пришлось писать много повторяющегося кода в HTMLInvoice.
Старый код, который использовал старую Invoice, не поврежден и не затронут. Новый код может использовать HTMLInvoice. (Если вы также делаете лисковскую заменяемость , L твердого тела, вы можете передать экземпляры HTMLInvoice существующему коду, ожидающему экземпляры Invoice.) Все живут долго и счастливо.
Счет закрыт для модификации, открыт для расширения. И вы должны написать счет заранее, чтобы это работало, кстати.
Вы читали статью « Принцип открытых дверей» от приятелей дяди Боба в ObjectMentor? Я думаю, что это одно из лучших объяснений.
источник
Ответ Кейт Грегори очень хорошо, но рассмотрим другую ситуацию , когда новое требование может быть удовлетворено сравнительно небольшое изменение в существующем
Invoice
классе. Например, допустим, новое поле должно быть добавлено в PDF-файл счета. Согласно OCP, мы все равно должны создать новый подкласс, даже если новое поле можно добавить в существующую реализацию, изменив несколько строк кода.В моем понимании, OCP отражает реальность 80-х и начала 90-х годов, когда в проектах часто даже не использовался контроль версий, тем более автоматизированные регрессионные тесты или преимущества сложных инструментов рефакторинга. OCP была попыткой избежать риска взлома кода, который был вручную протестирован и запущен в производство. Сегодня у нас есть более эффективные способы управления риском взлома работающего программного обеспечения (а именно, системы контроля версий, TDD и автоматизированное тестирование, а также инструменты рефакторинга).
источник
Лично я думаю, что этот принцип должен быть взят с щепоткой соли. Кодекс органичен, предприятия меняются и код меняется в зависимости от потребностей бизнеса с течением времени.
Мне очень трудно осознать тот факт, что абстракция является ключевой. Что если абстракция изначально была неправильной? Что если бизнес-функция значительно изменилась?
Этот принцип по существу гарантирует, что ОРИГИНАЛЬНЫЕ намерения и поведение проекта никогда не должны изменяться. Это, вероятно, работает для тех, у кого есть общедоступные API, и у их клиентов возникают проблемы с тем, чтобы не отставать от новых выпусков и некоторых других крайних случаев. Однако, если компания владеет ВСЕМ кодом, я оспариваю этот принцип.
Наличие хорошего тестового покрытия вашего кода должно сделать рефакторинг вашей кодовой базы легким. Это означает, что можно ошибиться - ваши тесты помогут вам улучшить дизайн.
Сказав это, если нет никаких тестов, то этот принцип является здравым.
источник