抽象类的命名约定

时间:2009-01-09 19:56:13

标签: .net naming-conventions abstract-class

我清楚地记得,有一次,微软推动的指南是将“Base”后缀添加到抽象类中,以避免它是抽象的事实。因此,我们有System.Web.Hosting.VirtualFileBaseSystem.Configuration.ConfigurationValidatorBaseSystem.Windows.Forms.ButtonBase等课程,当然还有System.Collections.CollectionBase

但是我注意到,最近,框架中的很多抽象类似乎没有遵循这个约定。例如,以下类都是抽象的,但不遵循此约定:

  • System.DirectoryServices.ActiveDirectory.DirectoryServer

  • System.Configuration.ConfigurationElement

  • System.Drawing.Brush

  • System.Windows.Forms.CommonDialog

这就是我能在几秒钟内鼓起来的东西。所以我去查看官方文档说的内容,以确保我没有疯狂。我在Names of Classes, Structs, and Interfaces的MSDN上找到了Design Guidelines for Developing Class Libraries。奇怪的是,我没有提到将“Base”添加到抽象类名称末尾的准则。并且该指南不再适用于框架1.1版。

所以,我输了吗?该指南是否存在?是不是一言不发就被遗弃了?过去两年我一直在为自己创造长篇名字吗?

有人在这里给我一块骨头。

更新 我没疯。该指南已存在。 Krzysztof Cwalina gripes about it in 2005.

6 个答案:

答案 0 :(得分:63)

Framework Design Guidelines p 174州:

  

如果要在公共API中使用该类,请避免使用“Base”后缀命名基类。

另外:http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx

答案 1 :(得分:19)

此外,如果抽象类有一些静态成员将被使用,'Base'可能会变得难看。

答案 2 :(得分:14)

我不记得这样的指导方针。我相信你应该使用有意义的命名。有时抽象类只是为某些类(作为工具)提供通用功能,我认为应该有后缀。但是,在某些情况下,您希望将其用作多态性层次结构的基础,而这种层次结构本身并不完整。在这些情况下,我建议像普通班级一样命名。

如您所见,您可能不会声明一个接受ButtonBase作为参数的方法。它旨在为子类提供最小的功能。但是,您可以将ConfigurationElement视为具有不同形式的实体,但它本身并不完整(因此它是抽象的)

答案 3 :(得分:10)

有时Base仍然是必要的,特别是当你提供具体类和抽象类以供某人扩展以创建具体实现时。 例如控制器和ControllerBase (实际上Controller也是抽象的,但提供比ControllerBase更多的功能)

对接口进行编程时,基本后缀很难看,所以我认为不使用它的Microsoft指南适用于抽象类主要像接口一样使用的情况。可能是Public API的含义。

关键是有些情况下没有更好的替代方法来使用Base后缀。

答案 4 :(得分:1)

我理解避免Base-Suffix的倾向,但我也理解某些后缀的必要性。现在,评论of this article建议使用" Type"作为后缀作为不使用任何的第二选择。我认为这是令人困惑的,但是这个非承诺词的想法往往表明它是一个非承诺的类"坚持我。

作为替代选择:我更喜欢使用" Kind"作为后缀将对象声明为“属于或属于指定的种族或家庭”(Wiktionary: -kind)。

示例:DataProviderReflectiveDataProvider都是DataProviderKind

受生物学启发,例如: " canis lupus"属于家庭" Canoidea",非常粗略地翻译为" dog-ish"。

答案 5 :(得分:1)

Microsoft声明:

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces

"✓考虑使用基类的名称结束派生类的名称。这是非常易读的,并清楚地解释了这种关系。代码中的一些示例是:ArgumentOutOfRangeException,它是一种Exception,以及SerializableAttribute,它是一种Attribute。但是,在应用本指南时使用合理的判断非常重要;例如,Button类是一种Control事件,虽然Control不会出现在其名称中。"

一般来说,这隐含地排除了使用" Base"在名称中。