命名类的最佳方法是什么?

时间:2008-09-01 14:55:47

标签: naming

为类提供良好,准确的名称是非常困难的。如果做得好,它会使代码更加自我记录,并提供一个词汇表来推断更高抽象级别的代码。

实现特定设计模式的类可能会根据众所周知的模式名称(例如FooFactory,FooFacade)给出一个名称,而直接模拟域概念的类可以从问题域中获取它们的名称,但是其他类的名称呢? ?当我缺乏灵感,并且想避免使用泛型类名(如FooHandler,FooProcessor,FooUtils和FooManager)时,有什么类似程序员的词库可以转向吗?

6 个答案:

答案 0 :(得分:56)

我将引用肯特贝克Implementation Patterns的一些段落:

简单超类名称

  

“[...]名字应该简短而有力。   但是,要使名称准确   有时似乎需要几个   话。摆脱这种困境的方法是   选择一个强有力的比喻   计算。记住一个比喻,   甚至单个词带来了他们   丰富的协会网络,联系,   和影响。例如,在   HotDraw绘图框架,我的第一个   图形中对象的名称是   的 DrawingObject 即可。沃德坎宁安来了   以及排版比喻:a   绘画就像一个印刷的,布局的   页。页面上的图形项目是   数字,所以课程变得。   在比喻的背景下,   同时更短,更丰富,更好   比 DrawingObject 更精确。“

合格的子类名称

  

“子类的名称有两个作业。   他们需要沟通什么课   他们是这样的,他们是怎样的   不同。 [...]不同于   层次结构的根源,子类   几乎没有经常使用名称   谈话,所以他们可以   以存在为代价表达   简洁。 [...]

     

提供充当的子类   层次结构的根源本身就很简单   名。例如, HotDraw 有一个   类句柄,表示图 -   数字时的编辑操作   选择。简称为句柄   尽管扩展了。有   一整套手柄和他们   最合适的名字就像    StretchyHandle TransparencyHandle 。   因为句柄是它自己的根   层次结构,它应该很简单   超类名称超过合格   子类名称。

     

另一个皱纹   子类命名是多级的   层次结构。 [...]而不是盲目的   将修饰符添加到立即数   超类,想想来自的名字   读者的观点。什么级别   他需要知道这门课吗?   喜欢?使用该超类作为基础   对于子类名称。“

接口

  

两种命名界面风格取决于您对接口的看法。   作为没有实现的类的接口应该被命名为它们是类   (简单超类名称合格子类名称)。这种风格的一个问题   命名是在命名类之前用完了好名字。一个   名为文件的接口需要一个名为的实现类    ActualFile ConcreteFile ,或者(yuck!) FileImpl (后缀和后缀)   缩写)。一般来说,沟通是否正在处理具体或   抽象对象很重要,抽象对象是否实现为   接口或超类不太重要。推迟区分   接口和超类很好地受到这种命名方式的支持,让你离开   如果有必要,可以在以后随意改变主意。

     

有时候,简单地命名具体课程对于沟通而言更重要   隐藏接口的使用。在这种情况下,前缀接口名称为“I”。如果   界面称为 IFile ,该类可以简单地称为文件

有关详细讨论,请购买本书!这很值得! :)

答案 1 :(得分:37)

总是去MyClassA,MyClassB - 它允许一个不错的alpha排序..

我在开玩笑!

这是一个很好的问题,也是我不久前经历过的事情。我在工作中重组了我的代码库,并且遇到了什么问题以及把它称为什么......

真实问题?

我的课程做得太多了。如果你试图坚持single responsibility principle它会让所有东西都变得更好......而不是一个单片 PrintHandler 类,你可以把它分解成 PageHandler PageFormatter (依此类推)然后有一个主打印机类,它将所有这些组合在一起。

在我的重组中,花了我一些时间,但我最终将大量重复代码分类,让我的代码库更加合理,并且在进行思考之前学到了很多东西,然后再添加一个额外的方法class:D

我会但是建议将类似名称的内容放入类名中。类接口应该显而易见(比如隐藏单例的构造函数)。如果该类服务于通用目的,则通用名称没有任何问题。

祝你好运!

答案 2 :(得分:27)

Josh Bloch关于good API design的精彩演讲有一些很好的建议:

  • 课程应该做一件事,做得好。
  • 如果一个类很难命名或解释,那么它可能不会遵循上一个要点中的建议。
  • 班级名称应该立即传达班级的内容。
  • 好名字可以推动良好的设计。

如果您的问题是为暴露的内部类命名的话,也许您应该将它们合并为更大的类。

如果你的问题是命名一个做很多不同东西的类,你应该考虑把它分成多个类。

如果这对公共API有好的建议,那么对任何其他类都不会有任何影响。

答案 3 :(得分:12)

如果你坚持使用一个名字,有时只是给它any一半明智的名字并承诺稍后修改它是一个很好的策略。

不要命名瘫痪。是的,名字非常重要,但它们不足以浪费大量时间。如果你在10分钟内想不出一个好名字,继续前进。

答案 4 :(得分:7)

如果一个好名字不会浮现在脑海中,我可能会质疑是否存在更深层次的问题 - 这个课程是否有用?如果是,则命名它应该非常简单。

答案 5 :(得分:2)

如果你的“FooProcessor”确实处理了foos,那么就不要因为你已经拥有BarProcessor,BazProcessor等而不愿意给它这个名字。如果有疑问,显然是最好的。其他必须阅读您的代码的开发人员可能没有使用相同的同义词库。

也就是说,对于这个特定的例子,更具特异性不会受到伤害。 “过程”是一个相当广泛的词。例如,它真的是一个“FooUpdateProcessor”(可能会成为“FooUpdater”)吗?你不必对命名过于“创造性”,但是如果你编写了代码,你可能对它的作用和不做的事情有了很好的了解。

最后,请记住,裸露的类名并不是您和代码的读者必须继续进行的 - 通常还有名称空间。那些通常可以给读者提供足够的上下文,以便清楚地看到你的课程是否真的适用,即使它的名字是相当通用的。