【问题标题】:Naming conventions for abstract classes抽象类的命名约定
【发布时间】:2010-09-30 13:51:45
【问题描述】:

我清楚地记得,有一次,微软推动的指导方针是将“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

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

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

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

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

【问题讨论】:

  • 如果您阅读了那篇文章,Krzysztof 只是抱怨收到“一组建议”——不一定这些建议是 Microsoft 官方的。我记得阅读了 MS 指南并看到他们建议不要这样做。
  • 我确实读过它,虽然这是我记得第一次看到那篇特别的文章。事实上,这是一种解脱。我从来没有真正喜欢过这个建议。从现在开始,它会为我节省很多咆哮。 :)

标签: .net naming-conventions abstract-class


【解决方案1】:

Framework Design Guidelines p 174 状态:

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

还有:http://blogs.msdn.com/kcwalina/archive/2005/12/16/BaseSuffix.aspx

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 我同意。我正在一个解析来自不同来源的内容的提要系统中工作。我们在公共 API 中使用一个名为 IFeedParser 的接口,在内部我们使用一个包含通用功能的基本抽象类,名为 BaseFeedParser
        【解决方案5】:

        我理解避免使用 Base-Suffix 的倾向,但我也理解对 some Suffix 的需求。现在,评论of this article 建议使用“类型”作为后缀作为不使用任何后缀的第二选择。我认为这令人困惑,但“这样一个不明确的词往往表明它是一个不明确的类”的想法让我印象深刻。

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

        例如:DataProviderReflectiveDataProvider 都是 DataProviderKind

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

        【讨论】:

          【解决方案6】:

          微软声明,在:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-12-21
            • 2023-03-17
            • 1970-01-01
            • 2014-08-07
            • 1970-01-01
            • 1970-01-01
            • 2016-03-25
            相关资源
            最近更新 更多