【问题标题】:Naming convention and structure for utility classes and methods实用程序类和方法的命名约定和结构
【发布时间】:2010-11-19 06:23:23
【问题描述】:

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

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

一段时间后,我倾向于得到很多小的静态类,通常只有一个方法,我通常将它们放在一个 utility 命名空间中,而这个命名空间会因类而变得臃肿。

例子:

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

通常,命名约定告诉您将您的类命名为名词。我经常学习很多课程,例如HtmlHelperCompressHelper,但它们的信息量不是很大。我也尝试过像HtmlTagCleaner 这样非常具体,通常每个实用程序方法都有一个类。

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

【问题讨论】:

  • 如今,无论您如何命名此类实用程序类,将每个方法设为其第一个参数的Extension method 通常是个好主意。然后它可以像第一个参数类的方法一样被调用,避免显式声明实用程序类名称的混乱。
  • ... 从 C# 6.0 开始,有一个替代解决方案,using static
  • 这个问题缺少关于 OP 使用哪种语言的关键细节。很少有约定可以普遍适用于所有语言,甚至所有常见语言。

标签: naming-conventions


【解决方案1】:

我相信复杂性是连续的,因此有相应的组织。示例如下,根据您的项目和实用程序的复杂性进行选择,并适应其他限制:

  1. 一个类(称为 Helper),有几个方法
  2. 一个包(称为helper),有几个类(称为XXXHelper),每个类有几个方法。 或者,如果合适的话,可以将这些类拆分为几个非帮助程序包。
  3. 一个项目(称为 helper),有几个包(称为 XXX),每个包都有 ... 或者,如果它们适合,可以将包拆分为多个非辅助包。
  4. 几个帮助项目(按层、使用中的库或其他方式拆分)...

在每个分组级别(包、类):

  • 含义的共同部分是分组名称的名称
  • 内部代码不再需要那个含义(因此它们的名称更短、更集中,并且不需要缩写,它使用全名)。

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

  • 一个运输单位:一些交付物或产品将有罐子,那些不需要它的不会),
  • 表达依赖关系:例如,一个业务项目对Web层帮助器没有依赖关系;表达了在项目依赖项中,我们在明显的复杂性上做了改进,对我们有好处;或者找到这样的依赖,我们就知道有问题了,开始调查……;此外,通过减少依赖关系,我们可以加速编译和构建....
  • 对代码进行分类,以便更快地找到它:只有当它很大时,我才谈论项目中的数千个类

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


既然我试图回答你的问题(虽然是宽泛的),让我再补充一个想法
(我知道你没有要求那个)。

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

将静态方法移至何处的示例:

  1. 如果只有一个参数,则到那个参数。
  2. 如果有多个参数,请在移动方法之间进行选择:
    • 使用最多的参数:使用多个字段或方法的参数,或由条件使用的参数(理想情况下,某些条件会被子类覆盖删除)...
    • 一个已经可以很好地访问多个参数的现有对象。
    • 根据需要构建一个新类

虽然这种方法在 OO 纯粹主义者看来似乎是移动的,但我们发现从长远来看这实际上对我们有帮助(当我们想要对其进行子类化以改变算法时,它被证明是无价的)。 Eclipse 在不到一分钟的时间内移动了一个方法(包含所有验证),当我们寻找一些代码时,或者当我们不再对已经编码的方法进行编码时,我们获得的收益远远超过一分钟。

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

我们的好习惯是用要扩展的类的名称来命名助手,并带有助手后缀。 (字符串助手,日期助手)。我们希望代码所在的类与 Helper 之间的这种紧密匹配有助于我们在几秒钟内找到这些方法,即使不知道我们项目中的其他人是否编写了该方法。

【讨论】:

    【解决方案2】:

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

    您的助手的意图应该由方法名称传输,并且只使用类作为占位符。例如,ParseCommaSeparatedIntegersFromString 是一个坏名字,原因如下:

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

    你怎么看:

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

    【讨论】:

    • 我个人将 CSVHelper 重命名为 CommaSeparatedValues。它更长,但助手只是 sux 它的 6 个字符,而 CommaSe...s 都是有意义的。 IDE 自动完成所以谁在乎它是否有点长。
    • 根据您的示例,我将它们命名为 CSVParser、CSVBuilder
    • @mP。你还在使用这个命名约定吗? IE。 JavaScriptObjectNotationSerializer?
    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多