Соглашения об именах для абстрактных классов


103

Я отчетливо помню, что одно время 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 году.


Если вы читаете эту статью, Кшиштоф просто жалуется на получение «набора рекомендаций» - не обязательно, что эти рекомендации были официальными Microsoft. Я помню, как читал руководства по РС и видел, что они не рекомендуют этого.
Джон Руди,

1
Я прочитал ее, хотя помню, что впервые видел эту статью. Вообще-то, это облегчение. Мне никогда не нравилась эта рекомендация. Это избавит меня от рычания. :)
Майк Хофер

Ответы:



20

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


14

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

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


11

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

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

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


4
Я согласен. Я работаю в системе каналов, которая анализирует контент из разных источников. Мы используем в общедоступном API интерфейс с именем IFeedParser , а внутри мы используем базовый абстрактный класс, содержащий общие функции с именем BaseFeedParser
Руи Джаримба

1

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

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

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

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


1

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

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

«✓ РАССМАТРИВАЙТЕ окончание имени производных классов именем базового класса. Это легко читается и ясно объясняет взаимосвязь. Вот некоторые примеры этого в коде: ArgumentOutOfRangeException, который является разновидностью исключения, и SerializableAttribute, который является вид атрибута. Тем не менее, важно использовать разумное суждение при применении этого правила; например, класс Button является своего рода событием Control, хотя Control не отображается в его имени ».

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.