永不说永不”
我不认为这一定是坏的,只有当您不好地做它并滥用它时,它才是坏的。
我们都需要工具和实用程序
首先,我们所有人都使用一些有时被认为是无处不在且必须具备的库。例如,在Java世界中,Google Guava或某些Apache Commons(Apache Commons Lang,Apache Commons Collections等)。
因此,显然需要这些。
避免硬语,重复和引入错误
如果你觉得这些都非常简单,只是一个非常大的一堆这些的Util
类,您形容,除了有人通过竭尽全力去得到他们(相对)的权利,他们一直时间 - 测试和其他严重眼揉成团。
因此,当我想编写一个Util
类的想法时,我想说的第一个经验法则是检查Util
该类是否确实不存在。
我看到的唯一反论点是当您想限制依赖项时,因为:
- 您想限制依赖项的内存占用量,
- 或者您想严格控制开发人员的使用权限(在大型团队中会发生这种情况,或者某个特定的框架因拥有奇特的超级烂类而绝对避免在某个地方使用)。
但这两种情况都可以通过使用ProGuard或等效工具重新打包lib 或自己拆解来解决(对于Maven用户,maven-shade-plugin提供了一些过滤模式以将其集成为构建的一部分)。
因此,如果它在一个库中并且与您的用例匹配,并且没有基准告诉您,请使用它。如果它与您的内容有所不同,请对其进行扩展(如果可能)或进行扩展,或者在万不得已时将其重写。
命名约定
但是,到目前为止,在这个答案中,我称他们Util
像您一样。不要这样命名。
给他们起有意义的名字。以Google Guava为例(非常非常好),然后想象一下,com.google.guava
命名空间实际上就是您的util
根。
util
在最坏的情况下调用您的包,但不要调用类。如果处理String
对象和字符串构造的操作,则将其命名为Strings
,而不是StringUtils
(抱歉,Apache Commons Lang-我仍然喜欢并使用您!)。如果它做了特定的事情,请选择一个特定的类名(如Splitter
或Joiner
)。
单元测试
如果必须使用这些实用程序,请确保对其进行单元测试。关于实用程序的好处是,它们通常是相当独立的组件,它们接受特定的输入并返回特定的输出。这就是概念。因此,没有理由不对它们进行单元测试。
此外,单元测试将允许您定义和记录其API合同。如果测试失败,则可能是您以错误的方式进行了某些更改,或者这意味着您正在尝试更改API的合同(或者您的原始测试已被废除,请从中吸取教训,不要再做)。
API设计
您可能需要很长一段时间来遵循这些API的设计决策。因此,尽管不花很多时间在编写Splitter
-clone上,但请谨慎对待问题。
问自己几个问题:
您希望这些实用程序涵盖大量用例,健壮,稳定,有据可查,遵循最少惊讶的原则并且具有独立性。理想情况下,您的utils的每个子软件包,或至少整个util软件包,都应可导出到捆绑软件中,以便于重复使用。
和往常一样,在这里向巨人学习:
- 仔细检查这些内容,然后进行分析和比较,然后经常回到它们再做一次(请注意,我对这些文件的绝对或部分好坏没有做出任何判断,重点在于分析和比较位):
- 观看Josh Bloch的“ 如何设计良好的API及其重要性”(幻灯片)。
- 阅读并观看一些其他Bloch资料:
- 阅读API设计事项。
是的,其中许多都强调集合和数据结构,但是请不要告诉我,通常您不是直接或间接实现大多数utils的地方或目的。
Util
在您的班级名称中使用。问题解决了。