Соглашение об именах классов C #: это BaseClass, ClassBase или AbstractClass

117

Каков рекомендуемый подход к именованию базовых классов? Добавляет ли он к имени типа префикс « Base » или « Abstract », или мы просто добавляем к нему суффикс «Base»?

Учтите следующее:

тип: ViewModelнапример, MainViewModel , ReportViewModel

базовый класс: BaseViewModelили ViewModelBaseилиAbstractViewModel

Также учтите:

тип: Productнапример, VirtualProduct , ExpiringProduct

базовый класс: BaseProductили ProductBaseилиAbstractProduct

Как вы думаете, что более стандартно?

class Entity : EntityBase
{
}

или

class Entity : BaseEntity
{
}
Сони Али
источник

Ответы:

90

Есть примеры в рамках с базовым суффиксом, например System.Configuration.Provider.ProviderBase, System.Web.SessionState.SessionStateStoreProviderBase.

Но далеко не все абстрактные базовые классы в Framework следуют этому соглашению (например System.Data.Common.DbParameter, System.Data.Common.DbCommand).

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

Джо
источник
« Avoidименование базовых классов с Baseсуффиксом, если класс предназначен для использования в общедоступных API». Рекомендации по
проектированию каркаса
47

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

Если вы создаете базовые классы только для того, чтобы иметь базовый класс одного класса и без какой-либо другой цели или причины, вы, вероятно, делаете что-то неправильно.

Поль Сонье
источник
15
Это не всегда так, и вы найдете множество классов Base * в структуре. CollectionBase, DictionaryBase .... и т. Д.
Чад Грант
1
Хороший момент: объекты реального мира должны точно помещаться в артефакты. Абстракция общих ресурсов должна быть основана на принципе Vehicle, но не только в деталях, но и в деталях.
ruslander
45
Стоит отметить, что некоторые классы в .NET Framework с суффиксом «Base» были названы до версии 1.0, и Microsoft больше не следует этим соглашениям ... но теперь они не могут изменять имена. В книге Microsoft Framework Design Guidelines, раздел 6.2 (который охватывает базовые классы), особо не рекомендуется использовать суффикс «Base».
Уоррен Румак
5
Практика, которую я видел наиболее часто используемой в ряде объектно-ориентированных языков в ряде компаний, заключается в том, что «Base» обозначает базовые классы, которые предназначены только для наследования, а не для прямого использования. В вашем примере класс с именем «Автомобиль» звучит как нечто, что можно использовать и «вести» - он утверждает, что является транспортным средством. Однако, если базовый класс был назван «Запчасти для транспортных средств», «Основные компоненты транспортного средства» или «Комплект для транспортных средств» - мы знаем, что это не что-то непосредственно используемое, а база для множества транспортных средств.
Слипп Д. Томпсон
4
Как упоминал Уоррен, книга Руководства по проектированию Microsoft Framework, раздел 6.2 о базовых классах: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Они говорят, чтобы избежать суффикса Base: "ИЗБЕГАЙТЕ именования базовые классы с суффиксом «Base», если класс предназначен для использования в общедоступных API. "
cwills
5

Если вы говорите о виртуальных базовых классах, стандартом Microsoft является ClassnameBase (например, CollectionBase).

Да, этот Джейк.
источник
3

Я думаю, это вопрос выбора. Я бы сказал, что если вы создаете много базовых классов, то, возможно, лучше всегда использовать BaseClassname, потому что таким образом вы ВСЕГДА можете узнать, какие базовые классы вы можете начать использовать, просто набрав Base и получив остальную помощь от Intellisense. Что, если бы у вас было 20 базовых классов, вы добавили базовый суффикс и забыли, как называется базовый класс? Вы хотите сначала создать диаграмму классов из VS и узнать, какие базовые классы доступны? Можно называть их ClassBase, когда это всего лишь один или два класса.

То же самое касается решения между GetItems и функцией ItemsGet. Я бы сказал, по крайней мере, для удобства чтения - перейдите на GetItems. Соблюдайте условности :)


источник
1
«Базовые» классы - это объектно-ориентированный взлом, см . Комментарий Пола . Они часто бывают полезными, а иногда и необходимыми, но все же это хитрость. Если вы чувствуете необходимость искать все доступные базовые классы, почему? Что у них общего, что вызывает у вас потребность видеть их всех вместе? Ответ может помочь вам найти лучшее название.
Iain
1
@Abhishek: Аналогия с GetItemsне работает: «Get» - это всего лишь глагол и, таким образом, имеет грамматический смысл английского языка как префикс, тогда как «Base» работает как прилагательное (префикс) или существительное (суффикс).
Слипп Д. Томпсон
1
@Iain: Причина, по которой люди используют «Base» в именах классов, не в том, чтобы найти все базовые классы - логическое обоснование ближе к противоположному. Это так, что базовый класс ряда связанных классов выделяется из них, во многом так же, как префикс «I» предназначен для отличия интерфейса от классов, которые его принимают. Я видел, как префикс / суффикс «Базовый» используется чаще всего, когда базовый класс не работает сам по себе - абстрактный по назначению, независимо от принудительного использования abstract.
Слипп Д. Томпсон
@ SlippD.Thompson: да, «найди все классы» был ответ Абхишеку. Я ответил на ответ Пола.
Iain
2

Мы используем BaseEntity, но я думаю, что это ваше личное предпочтение. Я часто вижусь с другими.

Просто будьте последовательны в своем контексте, будь то ваш проект, пространство имен или, если возможно, ваша команда. ИМХО, разные условности хуже плохого.

Gary.Ray
источник
2

Лично я бы не рекомендовал вообще добавлять словарную базу. Никогда не знаешь, когда придется поменять код, и он больше не будет базовым объектом. Тем не менее, мы делали это в прошлом, мы ставили перед словом Base префикс. Вроде течет лучше.

kemiller2002
источник
-1

BaseEntity очень похож на случай верблюда - strName, bseEntity. Я бы выбрал EntityBase, поскольку он сначала определяет тему, что поможет вам быстрее определить ее функцию.

Майк Робинсон
источник
10
Вы говорите о венгерских обозначениях, а не о верблюжьей оболочке. Венгерская нотация просто верблюжья, но это совершенно разные вещи.
sliderhouserules 01
-5

Когда вы называете что-то, всегда думайте о алфавитном порядке. Мне действительно не нравится смотреть на SQL-сервер, и каждая хранимая процедура называется usp [something]. В том же духе не злоупотребляйте Get и Set в качестве начальных имен для функции. Вместо GetItems или PlaceOrder подумайте о том, чтобы назвать их ItemsGet или OrderPlace.

Итак, в целом ClassnameBase / EntityBase будет лучшим выбором.

Marcc
источник
9
Не согласен; Читаемость. GetItems имеет гораздо больше смысла, чем ItemsGet.
Натан Ридли
2
Не согласен ... по той же причине, что и выше ... но не
могу
В отличие от других комментариев, marcc НЕ предлагал что-то вроде itemgsGet (). Он писал предметы ().
Hontvári Levente