Является ли хорошей практикой делать конкретные классы окончательными?

#inheritance #final #open-closed-principle

#наследование #Финал #принцип open-closed

Вопрос:

Принцип «Открыто-закрыто» является одним из пяти ОСНОВНЫХ принципов объектно-ориентированного проектирования. В нем говорится, что «программные объекты (классы, модули, функции и т.д.) Должны быть открыты для расширения, но закрыты для модификации».

Но в последнее время большинство языков программирования предоставляют способ завершения классов таким образом, чтобы они не наследовались в будущем, предоставляя такие ключевые слова, как final . Некоторые языки, такие как Kotlin, имеют свои классы по умолчанию final (он же opt-in open).

Я также прочитал несколько статей, в которых говорится, что наследование интерфейса должно быть предпочтительнее наследования реализации с обоснованными рассуждениями, такими как проблема хрупкого базового класса. Но OCP сообщает, что классы должны быть открыты для расширения. Итак, я должен рассмотреть возможность объявления моих классов открытыми? или окончательный? Какая вообще хорошая практика?

Ответ №1:

Я думаю, что нет!

Основная причина этого изложена ниже.

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

Таким образом, мы можем сказать, что это структурный формат для любого кода!

Ответ №2:

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