C#类命名约定:是BaseClass还是ClassBase或AbstractClass


117

建议的命名基类的方法是什么?它是在类型名称前面加上“ Base ”还是“ Abstract ”,还是只是在其后缀“ Base”?

考虑以下:

类型:ViewModel例如MainViewModelReportViewModel

基类:BaseViewModelViewModelBaseAbstractViewModel

同时考虑:

类型:Product例如VirtualProductExpiringProduct

基类:BaseProductProductBaseAbstractProduct

您认为哪个更标准?

class Entity : EntityBase
{
}

要么

class Entity : BaseEntity
{
}


Answers:


90

该框架中有带有基本后​​缀的示例,例如System.Configuration.Provider.ProviderBaseSystem.Web.SessionState.SessionStateStoreProviderBase

但是,绝不是Framework中的所有抽象基类都遵循此约定(例如System.Data.Common.DbParameterSystem.Data.Common.DbCommand)。

我个人将避免使用后缀,除非我想强调一下它是一个抽象类的事实,并认为否则该类的用户可能希望该名称指示具体的实现。


“ 如果要在公共API中使用Avoid基类,请给基类加上Base后缀。” 框架设计指南,第174页
Yousha Aleayoub

47

以上都不是。考虑一下基类提供什么目的;如此命名。例如,“汽车”和“自行车”的基类可以是“车辆”。

如果创建基类只是为了使一个基类具有一个类,而没有其他目的或原因,则可能是在做错什么。


15
并非总是如此,您会在框架中找到许多Base *类。CollectionBase,DictionaryBase ....等
乍得·格兰特

1
好的一点是,现实世界中的对象应该完全适合工件。公用的抽象应该像车辆一样,具体细节必须紧随其后。
鲁斯兰德

45
值得注意的是,.NET Framework中带有“ Base”后缀的某些类是在版本1.0之前命名的,Microsoft不再遵循这些约定....但是它们现在不能更改名称。Microsoft的Framework Design Guidelines手册的6.2节(涵盖基础类)特别建议不要使用“ Base”后缀。
沃伦·鲁马克

5
在许多公司中,我所见到的最常见的做法是在许多OO语言中使用“ Base”来指定仅可继承的基类,而不能直接使用。以您的示例为例,一个名为“ Vehicle”的类听起来像是可以使用和“驱动”的东西,它声称自己是车辆。但是,如果基类被命名为“车辆部件”或“车辆基本要素”或“车辆套件”,则我们知道它不是直接可用的东西,而是各种车辆的基础。
Slipp D. Thompson 2014年

4
正如沃伦(Warren)在Microsoft Framework Design Guidelines书中有关基本类的第6.2节所述:msdn.microsoft.com/zh-cn/library/ms229003(v=vs.110).aspx 他们说,要避免使用基本后缀:“避免命名”如果要在公共API中使用该基类,则后缀为“ Base”。
cwills

5

如果您在谈论虚拟基类,则Microsoft的标准是ClassnameBase(例如CollectionBase)。


3

我认为这是一个选择的问题。我想说的是,如果您要创建很多基类,那么最好始终使用BaseClassname,因为这样一来,您始终可以通过键入Base并从中获得其余帮助来找出可以开始使用的基类。智能感知。如果您有20个基类,并且添加了Base作为后缀,却忘记了基类的名称该怎么办?您是否要首先从VS创建一个类图并找出可用的基类?当它们只是一两个类时,可以将它们命名为ClassBase。

GetItems和ItemsGet函数之间的决定也一样。出于可读性考虑,我至少会说-选择GetItems。遵循约定:)


1
“基础”类是一个面向对象的黑客,请参阅Paul的评论。它们通常是有帮助的,有时是必要的,但仍然是hack。如果您需要查找所有可用的基类,那为什么呢?他们分享了什么,这使您需要一起看到他们?答案可以帮助您找到更好的命名。
伊恩(Iain)2012年

1
@Abhishek:的类比无效:GetItems“获取”仅是一个动词,因此只能使英语语法意义作为前缀,而“基础”既可以用作形容词(前缀)也可以用作名词(后缀)。
斯利普·汤普森

1
@Iain:人们在类名称中使用“ Base”的原因不是要能够找到所有的基类,其理由是相反的。这样一来,许多相关类的基类就从它们中脱颖而出,在很大程度上,“ I”前缀是用来将接口与采用该接口的类区分开的。我已经看到,当基类本身不起作用时,“ Base”前缀/后缀最常使用-通过预期用途抽象,无论是否强制执行abstract
Slipp D. Thompson 2014年

@ SlippD.Thompson是的,“找到所有班级”是对Abhishek的回应。我回答了保罗的回答。
伊恩

2

我们使用BaseEntity,但我认为这是您自己的偏好。我经常看到另一个。

在您的上下文中保持一致,无论是您的项目,名称空间,还是团队(如果可能)。不同的约定比不好的约定恕我直言。


2

就我个人而言,我建议完全不要添加词库。您永远都不知道何时需要更改代码,并且它不再是基础对象。话虽如此,我们过去已经做到了,我们在前面加了“ Base”一词。似乎更好。


-1

BaseEntity看起来很像驼峰大小写-strName,bseEntity。我会选择EntityBase,因为它首先定义了主题,这将帮助您更快地确定其功能。


10
您是在说匈牙利符号,而不是骆驼套。匈牙利符号刚好是驼峰式的,但它们是完全不同的东西。
Sliderhouserules 2010年

-5

命名内容时,请始终考虑按字母顺序排列。我真的不喜欢查看SQL Server,每个存储过程都命名为usp [something]。同样,不要过度使用Get和Set作为函数的前导名称。考虑将它们命名为ItemsGet或OrderPlace,而不是GetItems或PlaceOrder。

因此,一般而言,ClassnameBase / EntityBase是更好的选择。


9
不同意; 可读性。GetItems比ItemsGet有意义得多。
内森·里德利

2
不同意...与上述相同的原因..但是无法投票... :(
Mugunth

与其他评论相反,marcc还没有建议诸如itemgsGet()之类的东西。他写了items()。
Hontvári利文特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.