1
104
实用程序类并不完全是邪恶的,但它们可能会违反构成良好的面向对象设计的原则。在一个好的面向对象的设计中,大多数类应该表示一个单独的东西以及它的所有属性和操作。如果您正在操作某个对象,则该方法可能是该对象的成员。
但是,有时您可以使用实用程序类将许多方法组合在一起,例如
实际上,您需要做的是考虑您的设计,并确定将这些方法放在哪里最有意义。通常,它是类内部的操作。然而,有时,它确实是一个实用程序类。但是,当您确实使用实用程序类时,不要只向其中抛出随机方法,而是按目的和功能来组织这些方法。 |
2
47
我认为普遍的共识是效用类不是邪恶的 本身 . 你只需要明智地使用它们:
另一种看待这个问题的方法是观察在引用的问题中, 如果实用程序类是“邪恶的” 是一个strawman参数。就像我问的:
在上面的问题中,我并不是说猪能飞…或者我同意他们 能够 飞。 典型 “XYZ是邪恶的” 陈述是一种修辞手段,旨在通过提出一个极端的观点来让你思考。它们很少(如果有的话)被用作文字事实的陈述。 |
3
12
实用程序类是有问题的,因为它们无法用支持它们的数据对职责进行分组。 然而,它们非常有用,在更彻底的重构过程中,我一直把它们作为永久性结构或垫脚石来构建。 从A Clean Code 透视实用程序类违反了单一责任和开放-关闭原则。它们有很多改变的原因,并且设计上是不可扩展的。它们实际上只应该作为中间代码在重构期间存在。 |
4
7
我想当
1)
它变得太大了
(在本例中,只需将它们分组为有意义的类别)。
但只要不满足这些条件,我认为它们是非常有用的。 |
5
4
经验法则您可以从两个角度来看待这个问题:
|
6
3
实用程序类是坏的,因为它们意味着你太懒了,无法为类想出更好的名称:) 正因为如此,我才懒惰。有时候你只需要把工作做完,你的脑子一片空白。这就是“实用程序”类开始出现的时候。 |
7
3
现在回顾这个问题,我想说C扩展方法完全破坏了对实用程序类的需求。但并非所有的语言都有这样的天才构造。 您还可以使用javascript,只需向现有对象添加一个新的函数即可。 但我不确定是否真的有一种优雅的方式来解决这个问题在一个更古老的语言,如C++… 好的OO代码有点难以编写,而且很难找到,因为编写好的OO比编写好的功能代码需要更多的时间/知识。 当你有预算的时候,你的老板并不总是很高兴看到你花了一整天的时间写了很多课程… |
8
3
我并不完全同意效用类是邪恶的。 虽然实用程序类可能在某些方面违反OO原则,但它们并不总是坏的。
例如,假设您想要一个函数,它将清除所有匹配值的子字符串
STL C++(现在)不能直接支持这一点。
你可以创建一个
但问题是,您真的希望项目中使用的每个字符串都是扩展字符串类吗?
有时OO真的没有意义,这就是其中之一。我们希望我们的程序与其他程序兼容,因此我们将坚持
我想说,最好每堂课坚持一次。我想说,为所有类使用一个实用程序,或者为一个类使用多个实用程序是很愚蠢的。 |
9
2
仅仅因为设计师想不出一个合适的地方来放置代码,就很容易给某个实用程序打上商标。通常很少有真正的“实用程序”。 作为经验法则,我通常将代码保存在第一次使用它的包中,然后只有在稍后发现它确实在其他地方需要时才重构到更通用的地方。唯一的例外是,如果我已经有了一个执行类似/相关功能的包,并且代码最适合这个包。 |
10
2
包含无状态静态方法的实用程序类可能很有用。这些通常很容易进行单元测试。 |
11
1
使用Java 8,可以在接口中使用静态方法…问题解决了。 |
12
1
大多数Util类都是坏的,因为:
静态库和动态库有一些类似之处。 |
13
0
效用类并不总是邪恶的。但是它们应该只包含在广泛的功能范围内通用的方法。如果只有有限数量的类才能使用方法,请考虑创建一个抽象类作为公共父类,并将这些方法放入其中。 |
14
-1
当我无法向类中添加方法时(例如,
|
Joseph Garnier · 责任链模式在机器学习中的应用 6 年前 |
Hosam Abdelnaser · 过去和现在的调试 6 年前 |
Thypari · 检查日志记录是否启用的最干净的方法是什么? 7 年前 |
jakob · 足球/足球软件设计模式 7 年前 |
AbdulAziz Nurov · 创建多类别项目数据库结构的最佳方法 7 年前 |