Конвенція про іменування класів 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.

Але аж ніяк не всі абстрактні базові класи в Рамці дотримуються цієї конвенції (наприклад System.Data.Common.DbParameter, System.Data.Common.DbCommand).

Особисто я б уникнув використання суфікса, якщо б не хотів підкреслити той факт, що це абстрактний клас, і я вважаю, що в іншому випадку користувачі класу можуть очікувати, що ім'я вкаже на конкретну реалізацію.


" Avoidіменування базових класів із Baseсуфіксом, якщо клас призначений для використання в загальнодоступних API." Рамкові рекомендації щодо дизайну, стор. 174
Yousha Aleayoub

47

Жоден з вищевказаних. Поміркуйте, яку мету забезпечує ваш базовий клас; назвіть це. Наприклад, базовим класом автомобілів та велосипедів може бути транспортний засіб.

Якщо ви створюєте базові класи просто для того, щоб мати базовий клас одного класу, і без будь-якої іншої мети чи причин, крім цього, ви, ймовірно, робите щось не так.


15
Це не завжди так, і ви знайдете багато базових класів * у рамках. CollectionBase, DictionaryBase .... тощо
Чад Грант

1
Добре вказуйте, що предмети реального світу повинні вписуватися саме в артефакти. Абстракція об'єднань повинна базуватися на транспортному засобі, специфіка повинна відповідати, але також точно.
русланд

45
Варто зазначити, що деякі класи в .NET Framework з суфіксом "Base" були названі до версії 1.0, і Microsoft більше не дотримується цих конвенцій .... але тепер вони не можуть змінювати імена. Книга керівних принципів Microsoft Design Design, розділ 6.2 (яка охоплює базові класи), спеціально не рекомендує використовувати суфікс "Base".
Воррен Румак

5
Практика, яку я бачив найчастіше в ряді мов OO в ряді компаній, полягає в тому, що "Base" позначає базові класи, які мають бути успадковані - не використовуватися безпосередньо. З вашого прикладу, клас під назвою "Транспортний засіб" звучить як щось, що можна використовувати і "керувати" - він вважає себе транспортним засобом. Однак, якщо базовий клас отримав назву "Запчастини для автомобіля" або "Основи для автомобіля" або "Комплект для автомобіля" - ми знаємо, що це не щось, що можна використовувати прямо, а базу для різних транспортних засобів.
Сліпп Д. Томпсон,

4
Як згадував Уоррен, Книга керівних принципів Microsoft Framework Design, розділ 6.2 про базові класи: msdn.microsoft.com/en-us/library/ms229003(v=vs.110).aspx Вони кажуть уникати суфіксу Base: "AVOID іменування базові класи з суфіксом "Base", якщо клас призначений для використання в загальнодоступних API. "
cwills

5

Якщо ви говорите про віртуальні базові класи, стандартом Microsoft є ClassnameBase (наприклад, CollectionBase.)


3

Я думаю, що це питання вибору. Я б сказав, що якщо ви створюєте багато базових класів, то, можливо, краще переходити з BaseClassname завжди, тому що ви завжди можете дізнатися, які базові класи ви можете почати використовувати, просто набравши Base та отримавши іншу допомогу від Intellisense. Що робити, якщо у вас було 20 базових класів, і ви додали Base як суфікс, і ви забули, як називали базовий клас? Ви хочете спершу створити діаграму класів із VS та дізнатись, які базові класи доступні? Добре називати їх ClassBase, коли це лише один або два класи.

Те ж саме стосується рішення GetItems та функції ItemGet. Я б сказав, щонайменше, для читабельності - йдіть на GetItems. Дотримуйтесь конвенцій :)


1
"Базові" класи - це зловживання, дивіться коментар Павла . Вони часто корисні, а іноді і потрібні, але все-таки вони хакі. Якщо ви відчуваєте потребу шукати всі доступні базові класи, чому це так? Що вони поділяють, що створює вашу потребу бачити їх усіх разом? Відповідь може допомогти вам знайти кращу назву.
Iain

1
@Abhishek: Аналогія GetItemsне працює - "Get" - це лише дієслово і, таким чином, має лише англійський граматичний сенс як префікс, тоді як "Base" працює як прикметник (префікс), так і іменник (суфікс).
Сліпп Д. Томпсон,

1
@Iain: причина, по якій люди використовують «Base» у назвах класів, не в змозі знайти всі базові класи - обгрунтування ближче до протилежного. Це так, що базовий клас ряду споріднених класів виділяється з них, набагато так, як префікс "Я" має на меті відрізняти інтерфейс від класів, які його приймають. Я бачив префікс / суфікс "Base", який використовується найчастіше, коли базовий клас сам по собі не функціональний - абстрактний за призначенням, незалежно від примусового виконання abstract.
Сліпп Д. Томпсон

@ SlippD.Thompson так, "знайти всі класи" було відповіддю Абхішеку. Я відповів на відповідь Павла.
Іен

2

Ми використовуємо BaseEntity, але я вважаю це вашим власним уподобанням. Я часто бачу іншого.

Просто будьте послідовними у своєму контексті, будь то ваш проект, простір імен або, якщо можливо, ваша команда. Різні конвенції гірші, ніж погана конвенція ІМХО.


2

Особисто я б рекомендував взагалі не додавати базу слів. Ви ніколи не знаєте, коли вам доведеться змінювати код навколо, і він більше не буде базовим об'єктом. Коли ми говорили, ми це робили в минулому, ми вказували слово Base на передній частині. Здається, тече краще.


-1

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


10
Ви говорите про угорську нотацію, а не про кожух верблюда. Угорські позначення просто траплялися на верблюдах, але вони зовсім інші речі.
sliderhouserules

-5

Завжди думайте про буквене позначення, коли ви називаєте речі. Мені дуже не подобається дивитися на SQL-сервер, і кожна збережена процедура називається usp [щось]. У той же самий рядок не перевтомлюйтесь Get і Set як провідні імена функції. Замість GetItems або PlaceOrder, подумайте про те, щоб назвати їх як ItemsGet або OrderPlace.

Таким чином, загалом, ClassnameBase / EntityBase був би кращим вибором.


9
Не згоден; Читабельність. GetItems має набагато більше сенсу, ніж ItemGet.
Натан Рідлі

2
Не погоджуюся ... з тієї ж причини, що і вище .. але неможливо проголосувати проти: :(
вересня

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