命名子类的最佳做法


10

我经常遇到这样的情况:我有一个由接口或类表示的概念,然后我有一系列扩展它的子类/子接口。

例如: 一个通用的 “DoiGraphNode” A “DoiGraphNode” 表示资源 A “DoiGraphNode” 表示Java资源 A “DoiGraphNode” 具有相关联的路径,等等等等

我可以想到三个命名约定,并会对如何选择评论。


选项1:始终以概念的名称开头。

这样:DoiGraphNode,DoiGraphNodeResource,DoiGraphNodeJavaResource,DoiGraphNodeWithPath等

临:这是很清楚我处理,很容易看到我的全部

精读的选项:不是很自然?一切看起来都一样?


选项2:把特殊的东西放在开头。

这样:DoiGraphNode,ResourceDoiGraphNode,JavaResourceDoiGraphNode,PathBaseDoiGraphNode, 等等等等

临:这是非常清楚的,当我看到它的代码

缺点:发现它可能是困难的,尤其是如果我不记得名字了,缺乏视觉一致性


方法3:把特殊的东西,去除一些多余的文本的

这样:DoiGraphNode,ResourceNode,JavaResourceNode,GraphNodeWithPath

临:不多写入和读取 缺点:看起来像CR * P,很不一致,可以与其他的名字

4

名称它们到底是什么。

如果命名它们很困难或模棱两可,通常表明该类正在做太多(单一职责原则)。

为避免命名冲突,请适当选择您的名称空间。

Personnally,我会使用3

+1

我也选择了第三个选项。在前两种情况下,可能会出现一个“扭曲的长名字的迷宫”,所有这些都略有不同,在这里你很难阅读它们,甚至记住什么名字与什么概念相对应。 22 2月. 092009-02-22 08:52:59


5

使用任何你喜欢的冲突,这是一个主观的事情。重要的是要明确每个类代表什么,并且名称应该是这样的,继承关系是有意义的。尽管如此,我并不认为将姓名中的关系进行编码并不重要。这就是文档的用途(如果你的名字适合于这些对象,人们应该能够很好地猜测什么是继承)。

对于它的价值,我通常使用选项3,然后从我的经验看别人的代码选项2可能比选择更普遍1.


0

选择三个来自继承的概念逻辑如下。由于您正在专门研究接口或类,因此名称应该显示它不再使用基本实现(如果存在)。

有很多工具可以查看类的继承关系,所以指示类的实际功能的简洁名称将比尝试将太多类型信息打包到名称中更远。


2

你可以找到一个编码标准文档一些指导,比如有对C#here的文档■设计。

就个人而言,我更喜欢选项2.这是通常的方式在.NET Framework的名字及其对象。例如看看属性类。它们都以属性(TestMethodAttribute)结束。 EventHandlers也是如此:OnClickEventHandler是处理Click事件的事件处理程序的推荐名称。

我通常会在设计自己的代码和接口时尝试遵循这一点。因此,一个IUnitWriter产生一个StringUnitWriter和一个DataTableUnitWriter。这样我总是知道他们的基类是什么,它自然地读取更多。自行编写代码是所有敏捷开发人员的最终目标,因此它对我来说似乎很适合!


1

我通常命名类似于选项1,尤其是当类将被polymophically使用。 我的推理是,最重要的信息位列在第一位。 (即,子类基本上是祖先的事实, (通常)扩展名'添加')。 我喜欢这个选项,因为当排序类名称列表时, 相关的类将一起列出。 也就是说我通常将翻译单元(文件名)命名为与 相同的类名,因此相关的类文件自然会列在一起。 类似地,这对增量搜索很有用。

虽然我倾向于在我的编程生涯中使用选项2早些时候,我避免它现在因为你说它是“不一致的”,似乎没有很正交。

我经常使用选项3时,子类提供了大量的扩展或规格,或者如果名称将是相当长的。 例如,我的文件系统名称类是从字符串 衍生而来,但他们大大延长了String类和有显著不同 使用/含义:

Directory_entry_name从String中派生增加了丰富的功能。 从Directory_entry_name派生的File_name具有相当特殊的功能。 从Directory_entry_name派生的Directory_name也具有相当特殊的功能。

还与选项1一起,我通常是一个接口类,使用不合格的名称。 例如我可能有一个类interence链:

  • 文本(接口)
  • Text_abstract(摘要(基峰)一般化类)
  • Text_ASCII
  • Text_unicode(特异于ASCII编码的具体类) (具体类的Unicode编码)

我宁愿接口和抽象基类自动出现在排序列表中的第一个。