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

例如:代表资源的“ doigraphnode”的通用“ doigraphnode”一个“ doigraphnode”代表Java资源A的“ doigraphnode”,其“ doigraphnode”具有关联的路径,等等。

我可以想到三种命名约定,并且希望您能就如何选择提出意见。


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

因此:DoiGraphNode、DoiGraphNodeResource、DoiGraphNodeJavaResource、DoiGraphNodeWithPath 等

专业人士:我正在处理的事情非常清楚,很容易看到我拥有的所有选项

缺点:不是很自然吗?一切看起来都一样吗?


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

因此:doigraphnode,resourceographNode,JavaresourcedoigraphNode,PathBasedoigraphNode等

专业人士:当我在代码中看到它时很清楚

缺点:找到它可能很困难,特别是如果我不记得名字,缺乏视觉一致性


选项 3:放入特殊的东西并删除一些多余的文字

因此:DoiGraphNode、ResourceNode、JavaResourceNode、GraphNodeWithPath

专业人士:写和阅读con并不多:看起来像cr*p,非常不一致,可能与其他名称冲突

有帮助吗?

解决方案

命名它们到底是什么。

如果命名它们是硬的或模糊的,它往往是一个迹象,表明类是做太多的(单一职责原则)。

要避免命名冲突,适当地选择自己的命名空间。

Personnally,我会使用3

其他提示

使用任何你喜欢的,这是一个主观的东西。最重要的是明确了每个类代表,以及它们的名称应该是这样的:继承关系是有意义的。我真的不认为编码的名字的关系,虽然它是那么重要;这就是文档是(如果你的名字是适合的对象,人们应该能够很好地猜测,从什么什么继承)。

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

您可以找到在编码标准文档的一些指导,比如有对C#的此处

就个人而言,我更喜欢选项2.这是一般的方式在.NET Framework名称其对象。比如看看属性类。他们都结束属性(TestMethodAttribute)。这同样适用于事件处理器:OnClickEventHandler是处理该Click事件的事件处理程序的推荐名称

我通常会尽量按照这个设计我自己的代码和接口。因此,一个IUnitWriter产生StringUnitWriter和DataTableUnitWriter。这样,我总是知道他们的基类,它更自然地读。自记录代码是所有敏捷开发者的最终目标,所以它似乎很适合我的工作!

我通常命名类似于选项 1,特别是当类以多态方式使用时。我的理由是,最重要的信息应该首先列出。(IE。子类基本上是祖先的事实,通常(通常)扩展为“添加”)。我也喜欢此选项,因为在对类名称的列表进行排序时,相关类将被列出。IE。我通常将翻译单元(文件名)命名与类名称相同,因此自然会一起列出相关的类文件。同样,这对于增量搜索很有用。

尽管我在编程生涯的早期倾向于使用选项 2,但我现在避免使用它,因为正如您所说,它“不一致”并且看起来不太正交。

当子类提供大量扩展或规范,或者名称相当长时,我经常使用选项 3。例如,我的文件系统名称类是从字符串派生的,但它们大大扩展了字符串类,并且具有明显不同的使用/含义:

从 String 派生的 Directory_entry_name 添加了广泛的功能。从 Directory_entry_name 派生的 File_name 具有相当专门的功能。从 Directory_entry_name 派生的 Directory_name 也具有相当专门的功能。

另外,与选项 1 一起,我通常对接口类使用非限定名称。例如,我可能有一个类接口链:

  • 文本(界面)
  • Text_abstract(抽象(基)泛化类)
  • Text_ASCII(特定于 ASCII 编码的具体类)
  • Text_unicode(特定于 unicode 编码的具体类)

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

选项三个逻辑从继承的概念如下。既然你是专业的接口或类,名称应表明它不再使用基本实现(如果存在的话)。

有多种工具,看看什么是类从继承,这样一个简洁的名字指示类的真正功能会走得更远,比试图收拾太多类型的信息到名称。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top