110

我清楚地记得,有一次,微软推动的指导方针是将“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 的Design Guidelines for Developing Class Libraries中找到了类、结构和接口的名称。奇怪的是,我找不到将“Base”添加到抽象类名称末尾的指南。并且该指南不再适用于 1.1 版框架。

那么,我会失去它吗?这个指南曾经存在吗?是不是一句话就被抛弃了?在过去的两年里,我是否一直在自己创造长的班级名称?

有人在这里扔我一根骨头。

更新 我没疯。该指南存在。Krzysztof Cwalina 在 2005 年对此表示不满。

4

6 回答 6

72

框架设计指南第 174 页中指出:

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

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

于 2009-01-09T20:02:41.033 回答
21

此外,如果抽象类有一些将要使用的静态成员,“Base”可能会变得丑陋。

于 2009-01-09T20:09:16.933 回答
15

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

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

于 2009-01-09T20:00:36.530 回答
12

有时 Base 仍然是必需的,尤其是当您同时提供一个具体类和一个抽象类以供某人扩展以创建具体实现时。
例如 Controller 和 ControllerBase(实际上 Controller 也是抽象的,但提供的功能比 ControllerBase 多得多)

在针对接口进行编程时,基本后缀很难看,所以我认为当抽象类主要像接口一样使用时,微软不使用它的指南适用。可能是公共 API 的意思。

关键是在某些情况下,使用 Base 后缀没有更好的选择。

于 2010-10-27T14:58:26.030 回答
3

我理解避免使用基本后缀的倾向,但我也理解需要一些后缀。现在,这篇文章的评论建议使用“类型”作为后缀作为不使用任何后缀的第二选择。我认为这令人困惑,但是“这样一个不明确的词往往表明它是一个不明确的课程”的想法让我印象深刻。

作为替代方案:我更喜欢使用“种类”作为后缀,将对象声明为“属于或属于特定种族或家庭”(维基词典:-kind)。

示例:DataProvider并且ReflectiveDataProvider都是DataProviderKind

受到生物学的启发,例如“犬狼疮”属于“Canoidea”家族,它非常粗略地翻译为“狗样”。

于 2018-01-25T15:58:41.857 回答
3

微软表示,在:

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

"✓ CONSIDER CONSIDER 派生类的名称以基类的名称结尾。这非常易读,并且清楚地解释了关系。代码中的一些示例是:ArgumentOutOfRangeException,这是一种 Exception,和 SerializableAttribute,这是一个kind 属性。但是,在应用此准则时使用合理的判断很重要;例如,Button 类是一种 Control 事件,尽管 Control 没有出现在其名称中。

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

于 2018-05-18T12:08:19.220 回答