我一直在读到,通过在代码中使用静态类/单例来创建依赖项是一种不好的形式,并且会产生问题。紧密耦合和单元测试。

我遇到的情况是,我有一组没有与之关联的状态的 url 解析方法,并且仅使用该方法的输入参数执行操作。我相信你对这种方法很熟悉。

在过去,我会继续创建一个类并添加这些方法并直接从我的代码中调用它们,例如。

UrlParser.ParseUrl(url);

但是等一下,这是引入对另一个类的依赖。我不确定这些“实用”类是否不好,因为它们是无状态的,这最大限度地减少了所述静态类和单例的一些问题。有人可以澄清这一点吗?

我是否应该将方法移至调用类,即只有调用类才会使用该方法。这可能违反“单一责任原则”。

有帮助吗?

解决方案

从理论设计的角度来看,我觉得实用工具类的东西尽量避免。它们基本上是不超过静态类不同(尽管略有更好,因为它们不具有状态)。

从实际情况来看,但是,我确实创造了这些,并鼓励其使用的在适当的时候的。试图避免的实用工具类往往是繁琐,并导致少维护的代码。不过,我会尽力鼓励我的开发商在公共API,以避免这些可能的情况下。

例如,你的情况,我觉得UrlParser.ParseUrl(...)可能是更好的为一类处理。看看的System.Uri 在BCL - 这一个处理干净,易于使用的界面,统一资源Indentifiers,行之有效,并保持实际状态。我喜欢这种方式,以该对字符串工程实用方法,并强迫用户绕过一个字符串,记得要验证它,等等。

其他提示

工具类都ok .....只要他们不违反设计原则。用它们作为快乐地如你所使用的核心框架类。

的类应当很好命名和逻辑。实际上他们没有那么多的“效用”,而是一个新兴framwework的本地类不提供的部分。

使用之类的东西扩展方法可以是有用的,以及以对准的功能到“右”类。但是,他们可以是一些混乱的原因作为扩展不与他们通常扩展类,这是不理想的包装,但,仍可以是非常有用的,并产生更干净的代码。

您总是可以创建一个接口和依赖注入使用与实现该接口,而不是静态类的类的实例。

现在的问题变成,是它真的值得去努力?在一些系统中,在肯定的答案,但在其他国家,尤其是较小的,答案很可能是否定的。

我与一些其他反应的同意这里,它是典型的单一种保持状态的对象,其是要避免的,而不一定实用工具类,没有状态是恶的单个实例。我也同意里德,如果可能的话,把这些实用方法在一类的地方是有道理这样做,其中一个逻辑上怀疑这种方法会存在。我想补充,往往这些静态的工具方法可能是扩展方法很好的候选人。

我真的,真的尽量避免他们,但谁是我们在开玩笑......他们潜入每个系统。然而,在给定的I,就可以使用URL对象这将随后暴露URL的各种属性(协议,域名,路径和查询字符串参数)的例子。 的我想创建一个实用工具类静态的每一次,我可以通过创建一个对象,做这样的工作获得更大的价值。

在以类似的方式我已经创造了很多有内置的验证的东西像百分比,货币,电话号码等的自定义控件。在此之前这样做我有一个分析器工具类,它拥有所有的这些规则,但它使这么多的吸尘器刚落已经知道的基本规则(因而页上的控件只需要的业务逻辑要添加验证)。

我仍然保持分析器工具类的这些控件的隐藏的静态类,但大量使用它(保持所有的分析在一个容易找到的地方)。在这方面,我认为这是可以接受的实用程序类,因为它可以让我去申请“不要重复自己”,而我得到的实例化类,但使用的实用程序的控件或其他对象的利益。

这实际上取决于上下文以及我们如何使用它。

实用程序类本身也不错。然而,如果我们用坏的方式,它就会变得很糟糕。每个设计模式(特别是单例模式)都可以很容易地变成反模式,实用程序类也是如此。

在软件设计中,我们需要在灵活性和简单性之间取得平衡。如果我们要创建一个仅负责字符串操作的 StringUtils:

  • 是否违反SRP(单一责任原则)?-> 不,是开发人员在实用程序类中投入了过多的责任,从而违反了 SRP。
  • “无法使用 DI 框架注入”-> StringUtils 实现会有所不同吗?我们要在运行时切换它的实现吗?我们要嘲笑它吗?当然不是。

=> 实用程序类本身也不错。造成这种情况的原因是开发商的错。

这一切都取决于具体情况。如果您只是要创建一个仅包含单一职责的实用程序类,并且仅在模块或层内私有使用。那么你还是很擅长的。

他们只要设计得好(也就是说,你没有自己的签名从不时更改)都很好。

因为他们做的只有一件事这些实用方法不会经常变化。当你想紧更复杂的对象到另一个问题就来了。如果他们中的一个需要改变或更换,将变得更加困难,如果你有他们高度耦合到。

由于这些实用方法不会经常变化的,我会说这是没有太大问题的。

我想,如果你复制/一遍又一遍贴上相同的效用方法这将是最糟糕的。

此视频如何设计一个好的API以及为什么它由Joshua布洛赫重要解释几个概念设计API(这将是您的工具库)时,要牢记。虽然他是一个公认的Java架构师的内容适用于所有的编程语言。

使用它们谨慎,想要把尽可能多的逻辑,你可以到你的类,使他们不成为单纯的数据容器。

但是,在同一时间你真的不能避免UTILITES,他们有时需要。

在这种情况下,我认为这是确定

FYI有其中包括一个常见的http公用事业其中很多可能有用的system.web.httputility类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top