Названня конвенцій для абстрактних класів


102

Я виразно пам’ятаю, що свого часу Microsoft, спрямована на керівництво, полягала в тому, щоб додати абстрактний клас суфіксу «Base», щоб усунути той факт, що він був абстрактним. Таким чином, у нас є класи , як System.Web.Hosting.VirtualFileBase, System.Configuration.ConfigurationValidatorBase, System.Windows.Forms.ButtonBase, і, звичайно ж , System.Collections.CollectionBase.

Але я помітив, що, пізно, багато абстрактних класів у Рамці, схоже, не дотримуються цієї конвенції. Наприклад, такі класи є абстрактними, але не дотримуються цієї конвенції:

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

І це саме те, що я міг би заграти за кілька секунд. Тож я пішов шукати, що має сказати офіційна документація, щоб переконатися, що я не збожеволів. Я знайшов назви класів, структур та інтерфейсів на MSDN в керівництві по розробці бібліотек класів . Як не дивно, я не можу знайти жодної згадки про керівництво щодо додавання "Бази" до кінця назви абстрактного класу. А вказівки більше не доступні для версії 1.1 Рамок.

Отже, я це втрачаю? Чи існувала ця настанова? Чи просто покинуто це без слова? Чи я створював власні імена довгих класів усі за останні два роки?

Хтось кине мені тут кістку.

Оновлення Я не божевільний. Настанова існувала. Кшиштоф Кваліна захопився цим у 2005 році.


Якщо ви читаєте цей твір, Кшиштоф просто скаржиться на отримання "набору рекомендацій" - не обов'язково, щоб ці рекомендації були офіційними Microsoft. Я пригадую, як читав рекомендації щодо MS та бачив, як вони рекомендують проти цього.
Джон Руді

1
Я читав це, хоча я вперше згадую, коли-небудь бачив цю конкретну статтю. Насправді це полегшення. Я ніколи насправді не любив рекомендацію. Це врятує мене від гарного гарчання. :)
Майк Хофер

Відповіді:



19

Крім того, якщо в абстрактному класі є кілька статичних членів, які будуть використовуватися, 'Base' може стати некрасивим.


14

Я не пам’ятаю такого керівництва. Я вважаю, ви повинні використовувати найменування, яке має сенс. Іноді абстрактний клас призначений лише для надання загальної функціональності деяким класам (як інструменту), які, на мою думку, повинні мати суфікс. Однак у деяких випадках ви хочете використовувати його як основу ієрархії поліморфізму, яку вона не є повною. У цих випадках я пропоную назвати звичайний клас.

Як бачите, ви, ймовірно, не оголосите метод, який приймає ButtonBase як параметр. Він створений для забезпечення мінімальної функціональності для підкласів. Однак ви можете трактувати ConfigurationElementяк сутність, яка має різні форми, але вона сама по собі не є повною (і, отже, абстрактною)


11

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

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

Справа в тому, що є випадки, коли немає кращої альтернативи використанню суфіксу Base.


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

1

Я розумію схильність уникати Base-Suffix, але я також розумію необхідність деяких суфіксів. Тепер у коментарі до цієї статті пропонується використовувати "Тип" як суфікс як другий вибір, а не використовувати жоден. Я вважаю це заплутаним, але ідея про те, що "таке неприхильне слово, як правило, вказує на те, що це незайнятий клас", приклеюється до мене.

Як альтернатива: я вважаю за краще використовувати "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

"✓ CONSIDER, що закінчує ім'я похідних класів іменем базового класу. Це дуже читабельно і пояснює взаємозв'язок. Деякі приклади цього в коді: ArgumentOutOfRangeException, який є своєрідним винятком, і SerializableAttribute, який є тип атрибута. Однак важливо використовувати розумне судження при застосуванні цього керівництва; наприклад, клас Button є своєрідною подією Control, хоча Control не відображається в його імені. "

Взагалі це неявно виключає використання "Base" у назві.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.