我经常遇到这样的情况:我有一个由接口或类表示的概念,然后我有一系列扩展它的子类/子接口。
例如: 通用的“DoiGraphNode” 代表资源的“DoiGraphNode” 代表 Java 资源的“DoiGraphNode” 具有关联路径等的“DoiGraphNode”
我可以想到三种命名约定,并且希望您能就如何选择提供意见。
因此:
DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath,
等
Pro:我正在处理的事情非常清楚,很容易看到我拥有的所有选项
缺点:不太自然?一切看起来都一样?
因此:
DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode
等
亲:在代码中看到就很清楚了
缺点:找到它可能很困难,特别是如果我不记得名字,缺乏视觉一致性
因此:
DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath
优点:没有那么多可写和读的内容 缺点:看起来像 cr*p,非常不一致,可能与其他名称冲突
按其本来面目命名它们。
如果命名它们很困难或含糊不清,这通常表明该类做得太多(单一职责原则)。
为避免命名冲突,请适当选择名称空间。
就个人而言,我会使用3
使用你喜欢的任何东西,这是一个主观的事情。重要的是要明确每个类代表什么,并且名称应该使继承关系有意义。不过,我真的认为在名称中编码关系并不是那么重要;这就是文档的用途(如果你的名字适合这些对象,人们应该能够很好地猜测什么继承了什么)。
就其价值而言,我通常使用选项 3,根据我查看其他人代码的经验,选项 2 可能比选项 1 更普遍。
我通常命名类似于选项 1,特别是当类将被多态使用时。 我的理由是,最重要的信息应该首先列出。 (即子类基本上就是祖先的事实, (通常)“添加”扩展名)。 我喜欢这个选项还因为在对类名列表进行排序时, 相关的类将一起列出。 IE。我通常将翻译单元(文件名)命名为 类名那么相关的类文件自然会被列在一起。 同样,这对于增量搜索很有用。
虽然我在编程生涯的早期倾向于使用选项 2,但现在我避免使用它,因为正如你所说,它“不一致”并且看起来不太正交。
当子类提供大量扩展或规范,或者名称相当长时,我经常使用选项 3。 例如,我的文件系统名称类是从 String 派生的 但它们极大地扩展了 String 类并且有显着不同 用途/含义:
从 String 派生的 Directory_entry_name 添加了广泛的功能。 从 Directory_entry_name 派生的 File_name 具有相当专门的功能。 从 Directory_entry_name 派生的 Directory_name 也有相当专业的功能。
与选项 1 一样,我通常对接口类使用非限定名称。 例如,我可能有一个类接口链:
我更喜欢接口和抽象基类自动出现在排序列表中的第一个。
您可以在编码标准文档中找到一些指导,例如,这里有 C# 的 IDesign 文档。
就我个人而言,我更喜欢选项 2。这通常是 .NET Framework 命名其对象的方式。例如查看属性类。它们都以属性 (TestMethodAttribute) 结尾。 EventHandler 也是如此:OnClickEventHandler 是处理 Click 事件的事件处理程序的推荐名称。
我通常在设计自己的代码和界面时尝试遵循这一点。因此,IUnitWriter 生成 StringUnitWriter 和 DataTableUnitWriter。这样我总是知道他们的基类是什么,并且读起来更自然。自记录代码是所有敏捷开发人员的最终目标,所以它似乎对我来说很有效!
选项三更符合继承概念。由于您正在专门化接口或类,因此名称应该表明它不再使用基本实现(如果存在)。
有很多工具可以查看类继承自什么,因此一个简洁的名称表明类的真正功能比尝试将太多类型信息打包到名称中更有效。