在你的软件项目中有“Utils”类是不是很好?

通常,在软件开发期间,我需要各种各样的实用function。 像压缩文件,提取压缩文件,启动网页浏览器,获得缩放图像…

我所做的是,我将所有这些实用function作为静态函数放在名为“Utils”的单个类中

https://github.com/yccheok/jstock/blob/master/src/org/yccheok/jstock/gui/Utils.java

这是一个很好的做法吗? 当function数量越来越大时,事情会不可收拾吗?

它绝对是最好的做法! 您不希望将所有这些实用程序function与其他应用程序业务逻辑混合在一起。 但是,随着utils文件和/或类的增长,build议根据它们提供的function对它们进行分组。

例如,在一个Web应用程序中,你可能会得到一个像这样的包结构。

 org.sample.web.model org.sample.web.utils org.sample.web.validators org.sample.web.validators.utils 

是的,实用程序类是一个好主意,但是像所有面向对象的编程一样,您应该瞄准最大的内聚性,最小的耦合性。

最大的凝聚力意味着一个class里的每一件事都应该是彼此密切相关的 最小耦合意味着类之间不应该有不必要的依赖关系

换句话说,将图像压缩与image processing或者在一个类中引入外部过程是一个坏主意。 通过一切手段有一个压缩工具类和image processing工具类,但不要把它们放在一起。

这样做类似于使用单身模式作为上帝的对象,一个贫民窟,你只是倾倒你的垃圾,应该更好地组织。 我会说在开发过程中使用超级实用程序类是可以的,但要确保您的代码在发货前组织得更好。 维护将会容易很多。

这是一个很好的做法吗?

不,从长远来看,虽然暂时完成有用。

当function数量越来越大时,事情会不可收拾吗?

是的,毫无疑问。

不,我不认为公用事业是好的做法。 在心理学上,“Utilities”这个词太宽泛了,即使你把它分成了多个类。Util只会成为“难以适应”正确的课堂devise的东西的倾倒地。

举一个伪虚拟的StringUtils类为例。 你可以有数百种不同scheme的编码/解码方法,大小写转换,处理空白等等。我认为更好的方法是使用策略模式来处理这些转换,这可能甚至允许客户端的可能性代码引入新的变换,而不需要编辑/重新编译原始代码。 你得到一个更强大,更灵活,更可维护的系统。

如果它至less是静态的 ,那么在一个Util类中是有意义的。 这很容易! 凝聚力和耦合力是为了让你的生活更轻松 ,这是一个明确的情况,他们不会这样做,所以我build议你继续保持自己的想法。

这是一个很好的做法吗?

在大多数情况下,我使用这种方式。

就像所有的面向对象的编程一样,你应该把目标定为最大的凝聚力,最小的耦合。

不要严格按照这些规则来杀死你的生产力,你可以看到许多很棒的框架在那里被打破。

实际上, UtilsHelper类的概念来自于无法在每个函数都需要由类拥有的环境中编写自由函数(无论是因为语言还是项目限制)。 只有静态函数的Utils类最终扮演了一个具有自由function的包的angular色。

因为在许多软件项目中这是一个反复出现的现象,所以我认为它是面向对象devise的一个成语,因此是一个良好实践,因为人们与它相关。 正如其他答复指出的,一个有益的增强将是将你的Utils类分解到一个单独的项目,以便于重用和维护。

我同意Mike的评论。 我使用C#,但类似的实现。 我有一个秘密维护的util项目,然后把这个DLL放到新的项目中。 这样,因为错误/变化发生,我可以更新项目只需更换DLL。

Mike在他的评论中build议,我会为应用程序的不同领域单独开设一个课程。

一个util类(或类的包)是非常有用的。 我通常倾向于将function分成类,所以我可能有FileUtils,DatabaseUtils等。

然而,我强烈build议,在一个单独的jar或项目中维护你的utils(使用Eclipse很容易)。 如果最终有多个项目使用相同的实用程序,避免代码复制是一个好主意。 有一个项目或jar子包括是无价的。

我的做法是同时拥有*Utils clases和*Helper类。 前者包含与应用程序无关的可重用静态函数(对于Java和PHP),其中后者是可重用的应用程序/域逻辑 – 非静态方法,通常与其他服务/ bean /pipe理器有依赖关系。

这些是我在创build方法或*Utils类之前应用的一些规则:

  1. 语言本身是否已经支持它?
  2. Apache Commons是否支持它? (或其他一些常见的图书馆 – 因为有人可能写了比你更好的东西)
  3. 我怎样才能使它可重用(项目/应用程序中立),使我的其他项目可以使用它?
  4. 我该如何命名呢? (是的,它总是被分类和分离,因为这些类最终会增长,当更多的开发者增加更多的方法时,你可能会失去对它们的控制。)

实用程序类通常倾向于生成过程样式代码。 反对纯粹的OO公约。 然而,他们简化你的生活,所以使用它们。 但是,每个人都要做自己的事情,否则你最终会得到一个上帝的阶级,这个阶级将会成为一种不太适合他们应该居住的对象的方法。

打破水电是一个很好的方法。 一般来说,你想避免把你的类变成blob。

http://sourcemaking.com/antipatterns/the-blob