Соглашения об именах для абстрактных классов - PullRequest
94 голосов
/ 09 января 2009

Я отчетливо помню, что когда-то Microsoft руководствовалась указанием добавить суффикс «Base» к абстрактному классу, чтобы исключить тот факт, что он был абстрактным. Следовательно, у нас есть классы типа System.Web.Hosting.VirtualFileBase, System.Configuration.ConfigurationValidatorBase, System.Windows.Forms.ButtonBase и, конечно, System.Collections.CollectionBase.

Но я заметил, что в последнее время многие абстрактные классы в Framework, похоже, не следуют этому соглашению. Например, следующие классы являются абстрактными, но не следуют этому соглашению:

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

И это только то, что я мог бы набросить за несколько секунд. Поэтому я посмотрел, что должна была сказать официальная документация, чтобы убедиться, что я не сумасшедший. Я нашел Имена классов, структур и интерфейсов в MSDN на Руководство по разработке для разработки библиотек классов . Как ни странно, я не могу найти упоминания о директиве по добавлению «Base» в конец имени абстрактного класса. И рекомендации больше не доступны для версии 1.1 Framework.

Итак, я теряю это? Существовало ли когда-либо это руководство? Это было просто брошено без слов? Разве я создавал длинные имена классов один за последние два года даром?

Кто-то бросает мне кость здесь.

Обновление Я не сумасшедший. Руководство существовало. Кшиштоф Квалина жалуется на это в 2005 году.

Ответы [ 6 ]

63 голосов
/ 09 января 2009

In Руководство по разработке структуры p 174 состояния:

Избегайте именования базовых классов с суффиксом "Base", если класс предназначен для использования в публичных API.

Также: http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx

19 голосов
/ 09 января 2009

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

14 голосов
/ 09 января 2009

Я не помню такого руководства. Я считаю, что вы должны использовать наименование, которое имеет смысл. Иногда абстрактный класс предназначен только для обеспечения общей функциональности некоторых классов (в качестве инструмента), который, я думаю, должен иметь суффикс. Однако в некоторых случаях вы хотите использовать его в качестве основы для иерархии полиморфизма, которая сама по себе не является полной. В этих случаях я предлагаю именовать как обычный класс.

Как вы видите, вы, вероятно, не будете объявлять метод, который принимает ButtonBase в качестве параметра. Он предназначен для обеспечения минимальной функциональности для подклассов. Тем не менее, вы можете рассматривать ConfigurationElement как сущность, которая имеет различные формы, но она не завершена сама по себе (и, следовательно, она абстрактна)

10 голосов
/ 27 октября 2010

Иногда Base все еще необходим, особенно когда вы предоставляете и конкретный класс, и абстрактный класс, который кто-то может расширить для создания конкретной реализации.
например Controller и ControllerBase (на самом деле Controller также является абстрактным, но обеспечивает значительно большую функциональность, чем ControllerBase)

Базовый суффикс некрасив при программировании на интерфейсе, поэтому я думаю, что рекомендация Microsoft не использовать его применяется, когда абстрактный класс преимущественно используется как интерфейс. Вероятно, что они имеют в виду под публичным API.

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

1 голос
/ 18 мая 2018

Microsoft заявляет по адресу:

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces

"✓ РАССМОТРЕТЬ, заканчивая имя производных классов именем базового класса. Это очень читабельно и четко объясняет взаимосвязь. Некоторыми примерами этого в коде являются: ArgumentOutOfRangeException, который является разновидностью Exception, и SerializableAttribute, это своего рода атрибут. Однако при применении этого руководства важно использовать разумное суждение, например, класс Button является своего рода событием Control, хотя Control не отображается в его названии. "

Вообще говоря, это неявно исключает использование "Base" в имени.

1 голос
/ 25 января 2018

Я понимаю склонность избегать базового суффикса, но я также понимаю необходимость некоторого суффикса. Теперь комментарий к этой статье предлагает использовать «Тип» в качестве суффикса в качестве второго варианта, чтобы не использовать его. Я считаю, что это сбивает с толку, но идея о том, что «такое необязательное слово будет означать, что это не совершенный класс» застряла у меня.

В качестве альтернативы: Я бы предпочел использовать «Вид» в качестве суффикса, чтобы указать объект как «принадлежащий к определенной расе или семье» ( Викисловарь: -kind ).

Пример: DataProvider и ReflectiveDataProvider оба DataProviderKind

Вдохновленный биологией, где, например, "canis lupus" принадлежит к семейству "Canoidea", что очень грубо переводится как "собака".

...