实用程序类和方法的命名约定和结构

时间:2009-08-13 10:49:43

标签: naming-conventions

您对如何组织和命名实用程序类有任何意见吗?

每当我遇到一些代码复制时,可能只是几个代码行,我将它们移动到实用程序类。

过了一段时间,我倾向于得到很多小的静态类,通常只有一个方法,我通常把它放在utility命名空间中,这个命名空间会因为类而膨胀。

示例:

ParseCommaSeparatedIntegersFromString( string )
CreateCommaSeparatedStringFromIntegers( int[] )
CleanHtmlTags( string )
GetListOfIdsFromCollectionOfX( CollectionX )
CompressByteData( byte[] )

通常,命名约定会告诉您将类命名为名词。我经常会遇到很多类,例如HtmlHelperCompressHelper,但它们的信息量不大。我也尝试过像HtmlTagCleaner这样的特定内容,通常每个实用程序方法都会有一个类。

您对如何命名和分组这些辅助方法有任何想法吗?

2 个答案:

答案 0 :(得分:17)

我相信存在一系列复杂性,因此相应的组织。示例如下,根据项目和实用程序的复杂程度进行选择,并适应其他约束:

  1. 一个类(称为Helper),有几个方法
  2. 一个包(称为帮助程序),有几个类(称为XXXHelper),每个类都有几个方法。  或者,如果类适合,则可以将这些类分成几个非辅助包。
  3. 一个项目(称为助手),带有一些包(称为XXX),每个包含...  或者,如果包装适合,可以将它们分成几个非辅助包。
  4. 几个帮助项目(按层次划分,按使用中的库或其他方式划分)......
  5. 在每个分组级别(包,类):

    • 含义的通用部分是分组名称的名称
    • 内部代码不再需要那个含义(所以他们的名字更短,更集中,不需要缩写,它使用全名)。

    对于项目,我通常在超级包名称中重复常见含义。虽然在理论上不是我的首选,但我没有在我的IDE(Eclipse)中看到从哪个项目导入类,所以我需要重复这些信息。该项目实际上仅用作:

    • 运输单位:一些可交付物或产品将有罐子,那些不需要它的罐子,
    • 表示依赖关系:例如,业务项目不依赖于Web层帮助程序;表示在项目依赖性方面,我们对表观复杂性进行了改进,对我们有益;或者发现这种依赖,我们知道出了什么问题,并开始调查......;另外,通过减少依赖关系,我们可以加快编译和构建....
    • 对代码进行分类,以便更快地找到它:只有当它很庞大时,我才会谈论项目中的数千个类
      

    请注意,以上所有内容也适用于动态方法,不仅适用于静态方法。   这实际上是我们所有代码的良好实践。


      

    既然我试图回答你的问题(尽管有广泛的话),让我再添加一个想法   (我知道你没有要求)。

    静态方法(使用静态类成员除外)在没有上下文的情况下工作,所有数据都必须作为参数传递。我们都知道,在OO代码中,这不是首选方式。理论上,我们应该寻找与该方法最相关的对象,并在该对象上移动该方法。请记住,代码共享不必是静态的,它只需要公开(或以其他方式可见)。

    移动静态方法的示例:

    1. 如果参数只有一个参数。
    2. 如果有多个参数,请选择移动方法:
      • 最常用的参数:使用多个字段或方法的参数,或条件语句使用的参数(理想情况下,子类覆盖会删除某些条件)...
      • 一个已经很好地访问了几个参数的现有对象。
      • 为此需要构建一个新类
    3. 虽然这种方法可能看起来像OO-purist,但我们发现从长远来看这实际上对我们有所帮助(当我们想要子类化它来改变算法时它证明是无价的)。 Eclipse在不到一分钟的时间内(通过所有验证)移动一个方法,当我们查找一些代码时,或者当我们不再编码已编码的方法时,我们获得的时间超过一分钟。

        

      限制:某些类无法扩展,通常是因为它们失控(JDK,库......)。我相信这是真正的帮助理由,当你需要在一个你无法改变的类上放一个方法

           

      我们的良好做法是使用Helper后缀为要使用要扩展的类的名称命名助手。 (StringHelper,DateHelper)。我们希望代码所在的类与Helper之间的这种紧密匹配有助于我们在几秒钟内找到这些方法,即使我们的项目中有其他人写过该方法也不知道。

答案 1 :(得分:8)

Helper后缀是良好约定,因为它用于其他语言(至少在Java中,IIRC rails使用它)。

您的帮助程序的意图应该通过方法名称传输,并仅将该类用作占位符。例如,ParseCommaSeparatedIntegersFromString是一个糟糕的名称,原因有两个:

  • 太长了,真的
  • 这是多余的,在静态类型语言中,您可以删除FromString后缀,因为它是从签名中推断的

您如何看待:

CSVHelper.parse(String)
CSVHelper.create(int[])
HTMLHelper.clean(String)
...