Должен ли я запечатать все классы, которые, как я знаю, никогда не должны использоваться в качестве базового класса, даже если нет ощутимых проблем с производительностью или безопасностью, или это просто добавляет беспорядка?
Должен ли я запечатать все классы, которые, как я знаю, никогда не должны использоваться в качестве базового класса?
Ответы (4)
Расширяемый класс реализует функцию, которая может быть расширена - эта функция, как и любая другая функция класса, должна рассматриваться как одна, ничем не отличная от метода. Все функции должны быть тщательно продуманы, чтобы гарантировать, что они соответствуют целям клиента, использующего эту функцию. Функции должны быть спроектированы, реализованы, проверены на наличие проблем безопасности, отлажены, задокументированы и поддержаны.
Все это требует усилий, а усилия обычно требуют затрат денег. На чьи деньги вы тратите? У них может быть свое мнение о том, следует ли вам использовать эту функцию или нет.
По сути, у вас есть три варианта:
1) Потратьте деньги на реализацию функции, чтобы вы были уверены, что она правильная, надежная, безопасная и соответствует потребностям пользователей.
2) Ничего из вышеперечисленного не делайте, но все равно отправьте функцию и надейтесь, что отправка непроектированной, быстро внедряемой, непроверенной, недокументированной, неподдерживаемой функции с неизвестными рисками безопасности не нанесет вреда вам, вашему работодателю или вашим клиентам.
3) Запечатайте класс. Распечатайте его позже, если обнаружите, что (1) был правильным выбором.
Я говорю, что (3) стоит своих денег. Я всегда запечатываю каждый написанный мной класс, не предназначенный для расширения.
Установить для класса значение sealed
не сложно, поскольку это устанавливает строгое правило в вашем коде: этот класс не может быть унаследован.
Код бесполезен только в том случае, если он не нужен и сбивает с толку.
Тем не менее, одна школа мысли (и простое практическое правило) заключается в том, что вы всегда должны запечатывать все классы, поскольку их легко распечатать, если необходимо, но не наоборот. Некоторые генераторы кода делают это автоматически. (См. Вариант № 3 Эрика Липперта выше. В основном он говорит то же самое.)
Я бы вообще не счел это добавлением чуши. Вместо этого вы четко выражаете свои намерения перед классом.
Классы должны быть предназначены для наследования или быть запечатанными. К сожалению, в C # классы по умолчанию не запечатаны, поэтому вам придется включить ключевое слово самостоятельно. Лично я бы предпочел ключевое слово, чтобы явно сделать классы доступными для наследования, поскольку это помешало бы людям использовать класс в качестве базового класса, если он не был явно отмечен как таковой.
да. По крайней мере, это указатель, дающий другим понять, что они не должны идти дальше по тропе.