Осмысление открытого закрытого принципа

Я пытаюсь осмыслить принцип открытого закрытого:

Модули должны быть открыты для расширения и закрыты для модификации

С точки зрения java это расширение конкретно наследование или оно включает наследование, а также добавление новых методов или свойств?

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

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

За последние 24 часа я прочитал много постов и статей и до сих пор не совсем уверен, что этот принцип пытается донести.

Любое простое объяснение было бы очень полезно.

2 ответа

Решение

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

Подумайте об этом таким образом, когда вы строите дом, лучше попытаться удвоить размер вашей ванной комнаты (переместить туалет и перевернуть пол, новые стены... и т. Д.) Или проще построить солярий перед домом с новым подъездом?

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

Открыть для продления

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

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

Закрыто для модификации

Расширения модуля не должны быть в состоянии нарушить внутреннюю работу модуля / заявленную функциональность. Если модуль не защищает его внутреннюю работу от изменения, будет намного сложнее обеспечить (или даже рассмотреть) правильность модуля. По сути, позволяя пользователям модифицировать ваш модуль, вы добавляете в контракт вашего модуля требование о том, чтобы расширения не изменяли ваш модуль таким образом, чтобы это нарушало его - требование, которое часто недокументировано и невозможно выполнить без подробного знание модуля его пользователями.

Другие вопросы по тегам