Должен ли я запечатать все классы, которые, как я знаю, никогда не должны использоваться в качестве базового класса? - PullRequest
47 голосов
/ 29 января 2010

Должен ли я запечатать все классы, которые, как я знаю, никогда не должны использоваться в качестве базового класса, даже если нет никаких ощутимых проблем с производительностью или безопасностью, или это просто добавляет к делу?

Ответы [ 4 ]

48 голосов
/ 30 января 2010

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

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

Обычно у вас есть три варианта:

1) Потратьте деньги на эту функцию, чтобы вы были уверены, что она правильная, надежная, безопасная и соответствует потребностям пользователя.

2) Не делайте ничего из вышеперечисленного, но отправляйте эту функцию в любом случае и надеемся, что доставка незапланированной, быстро внедряемой, непроверенной, недокументированной, незарегистрированной функции с неизвестными рисками безопасности не нанесет вреда вам, вашему работодателю или вашим клиентам.

3) Печать класса. Распечатайте его позже, если вы обнаружите, что (1) был правильным выбором.

Я говорю, что (3) стоит своих денег. Я всегда опечатываю каждый класс, который я пишу, который не был разработан для расширяемости.

11 голосов
/ 29 января 2010

Установка класса равным sealed не является бесполезной, поскольку это устанавливает в вашем коде строгое правило: этот класс не может быть унаследован.

Код не имеет смысла, если он не нужен и запутан.

Тем не менее, одна школа мысли (и простое эмпирическое правило) заключается в том, что вы должны всегда запечатывать все классы, поскольку их легко распечатать, если это необходимо, но не наоборот. Некоторые генераторы кода делают это автоматически. (См. Вариант № 3 Эрика Липперта выше. Это в основном говорит то же самое.)

7 голосов
/ 29 января 2010

Я бы не подумал, что это добавление кавалеры вообще. Вместо этого вы четко выражаете свои намерения для класса.

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

5 голосов
/ 29 января 2010

Да. Если ничего другого, это указатель, сообщающий другим, что им не следует идти дальше по тропе.

...