【问题标题】:Prefixing abstract classes with "A" like interfaces are prefixed with "I"?用“A”作为前缀的抽象类像接口一样以“I”为前缀?
【发布时间】:2009-04-07 01:53:01
【问题描述】:

在我看来,一眼就能看出一个类是抽象的,而不是直接实例化的,就像能够轻松识别接口一样有用。

我的问题是,为什么“AFourLeggedAnimal : IAnimal”没有流行起来?是否仅仅是因为可能的混淆(我在写这篇文章时才注意到),例如将其混淆为“四足动物”而不是“抽象类 FourLeggedAnimal”?还是更多?

从学校的 Java 到工作中的 C#,我发现“I”前缀命名约定在浏览类列表时非常有用,而且在我看来,能够方便区分具体和非具体类一目了然,无需看代码。

【问题讨论】:

  • 为什么不将“A”扩展为“抽象”?使用较长的表格并没有以任何可衡量的方式降低您的工作效率。不要这样缩写,这会导致潜在的混淆而没有任何实质性的好处。
  • 我绝对更喜欢分类的后缀。我还记得 MFC 参考中的索引。几乎没有条目,除了字母 C 部分包含大量的类条目:CDocument、CView、CWindow 等。

标签: .net naming-conventions


【解决方案1】:

使用 Joel 提到的后缀“Base”。一旦您的项目中有很多内容,就很容易区分:

public abstract AnimalBase
{
  public AnimalType AnimalType { get; set; }
}

public abstract HorseBase : AnimalBase
{
  public HoovesManufacturer HoovesManufacturer { get; set; }
}

public class Pony : HorseBase
{
  public Pony()
  {
  }
}

【讨论】:

  • 大声笑,我想这是那些“duh”时刻之一。我完全忘记了 Base 后缀,尽管我在某些时候知道它。标记为已接受,因为您举了一个很好的例子。
  • 蹄制造商?那会是母亲和父亲吗?
  • @tvanfosson:哈哈,我是在 Opera Mobile 上写的,没有拼写检查。
【解决方案2】:

我更喜欢用“Base”作为后缀。

【讨论】:

  • 因为几乎每个人都使用术语中的“基础”类来教授 OOP。其他程序员会理解的。
  • 但是如果它不是基类呢?就像有一个接口,一个实现该接口的类,以及该类的一个子类。你还在用 Base 做前缀吗?
  • 抽象类不能是其他类的基类,可以吗?基础并不意味着根。
【解决方案3】:

因为,坦率地说,已经设置了命名抽象类的公认模式 ;-) 它带有“Base”后缀,例如 MyControlBase 或 FooBase。

-奥辛

【讨论】:

  • 他的问题中暗示了这一点。他在问 C#:“从 java 到 c#……”
【解决方案4】:

在 Java 中,许多“抽象”类都以“抽象”为前缀,例如 - AbstractList 等。

到底为什么仅仅通过阅读一个类的名称就知道一个类是否是抽象的很重要。在类名变得很长之前,只能塞进这么多细节。

我个人发现接口的“I”前缀也很丑陋。我相信人们不应该尝试在类名中编码这些细节。我相信通过将实现细节与接口名称相结合,可以得出真正有意义但又短的名称。一个完美的例子是 Java 的 Map、HashMap 等都非常具有描述性和简洁性。

【讨论】:

  • 我发现它使代码组织更容易遵循。在您使用 Map 的示例中,没有查看代码或咨询 JavaDocs,我无法判断 Map somemap = new Map() 无效,我应该寻找一个实现 Map 的类
  • 我发现它在尝试理解不熟悉的代码库时特别有用,更容易了解事物如何组合在一起。
  • 从名称(例如“Map”)可以明显看出它是在描述一个接口而不是具体的。 HashMap 中的“hash”清楚地展示了实现 Map 的策略。通过在命名接口时使用组合策略,其名称比具体类短。这是完美的......
  • 兼容在所有引用、方法签名等中使用接口类型的最佳实践。任何具有组合名称的东西都是一个具体的类,它的额外好处是了解接口是如何实现的一些/有限的细节。
  • 在命名时,我们应该尝试给事物赋予有意义的名称,而不是通过摆弄字符等来编码细节。这似乎非常计算机化,几乎相当于位操作。
【解决方案5】:

I 前缀很难看,但不幸的是这是微软的惯例。 在一个理想的世界里,我们都应该为接口编程。具体的类会有一个后缀 Impl 或其他东西来将它们与接口或抽象类区分开来(我们不在乎,因为我们的 IoC 容器会为我们处理这些!)

例如Book 将是一个接口或抽象类,这并不重要。 大多数时候,我们都会编写漂亮干净的名字。要使用的实际实现很容易从配置文件中插入。

但是很可惜,我们并不是生活在这样一个理想的世界里。

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多