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

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


person Daniel Coffman    schedule 29.01.2010    source источник
comment
Сомон сказал, и я прочитал: не никогда запечатывайте класс, если вы < я> знаю, что у вас возникнут проблемы со службой поддержки ваших клиентов.   -  person cregox    schedule 04.09.2013


Ответы (4)


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

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

По сути, у вас есть три варианта:

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

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

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

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

person Eric Lippert    schedule 29.01.2010
comment
Эрик, вот вам вопрос. Так же, как вы должны объявить метод «виртуальным», прежде чем вы сможете его переопределить, почему C # не принял нечто подобное, чтобы указать, что класс может быть унаследован, и запечатать его по умолчанию. Просто любопытно. - person SolutionYogi; 30.01.2010
comment
Я куплю это. Считаете ли вы, что классы C # должны быть запечатаны по умолчанию? - person Daniel Coffman; 30.01.2010
comment
@Daniel, @SolutionYogi: Как бы я хотел, чтобы мы это сделали. Однако на самом деле я в меньшинстве; Есть очень много людей, которые считают, что вам следует закрывать классы только тогда, когда у вас есть для этого причина. Я не согласен; Я думаю, что вы должны открывать классы только тогда, когда у вас есть причина для этого. - person Eric Lippert; 30.01.2010
comment
Кроме того, я согласен с Этвудом; почему фиолетовый текст? - person Daniel Coffman; 30.01.2010
comment
@ Даниэль: Потому что я считаю, что это круто. (Если вы читаете блог с помощью RSS-ридера, вы получите его в неформатированном виде.) - person Eric Lippert; 30.01.2010
comment
Вроде есть удаленные комментарии. На какой пост в блоге вы, ребята, имеете в виду? А что сказал Этвуд? - person Sunny Milenov; 05.09.2013
comment
@SunnyMilenov: Моя запись в блоге, на которую они ссылаются: blogs.msdn.com/b/ericlippert/archive/2004/01/22/61803.aspx. Сообщение в блоге Джеффа Этвуда, о котором идет речь: codinghorror. ru / blog / 2006/12 / eric-lipperts-purple-crayon.html. Мой ответ Джеффу здесь: blogs.msdn.com/b/ericlippert/archive/2007/01/08/. К сожалению, ответ больше не в фиолетовой люциде. Разве это не иронично, не правда ли? - person Eric Lippert; 05.09.2013

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

Код бесполезен только в том случае, если он не нужен и сбивает с толку.

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

person Paul Sasik    schedule 29.01.2010
comment
Как и почти каждый ответ о том, как что-то делать, это зависит. Есть некоторые оптимизации, которые можно получить, запечатывая классы по умолчанию и распечатывая только при необходимости. Взгляните на: msdn.microsoft.com/en-us/library/ms998547 .aspx dotnetperls.com/sealed-1 - person Firestrand; 29.01.2010

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

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

person Brian Rasmussen    schedule 29.01.2010

да. По крайней мере, это указатель, дающий другим понять, что они не должны идти дальше по тропе.

person NotMe    schedule 29.01.2010