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

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

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

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

Обновление Я не сумасшедший. Данное руководство существует. Krzysztof Cwalina об этом говорит в 2005 году.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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