【问题标题】:Call another class static method results in coupling调用另一个类的静态方法导致耦合
【发布时间】:2016-03-03 10:34:35
【问题描述】:

在 OOP 中,我们不希望类耦合。如果我想在 a 类中使用 b 类的实例,我可以使用依赖注入。

但是,如果我想在 a 类中使用 b 类的静态方法,除了在 a 类文件中“要求”或“导入”类 b 之外,我没有看到任何选项。这最终导致类之间的耦合 - 违背 OOP 原则。但是另一种方法是将b类的静态方法重写为a类中的静态方法——这违背了DRY原则。什么是正确的方法?

这个问题被标记为可能与How to use Dependency Injection with Static Methods? 重复,但我觉得我的问题是从更通用的角度询问使用另一个类的静态方法。认为可能重复中的问题和接受的答案更具体到用例,但不适用于例如外部类中的单纯实用程序静态方法。我的问题旨在从一般的 oop 角度寻求答案。

【问题讨论】:

标签: oop


【解决方案1】:

这里有多种选择,具体的用例对于决定您可能想要做什么很重要。所以,三巨头将是......

  • 将静态方法从 B 类迁移到共享库类中,该类纯粹是静态方法的持有者,并且从不实例化(在 Java 中,您将创建构造函数 private 和类 final )。那么 A 类和 B 类都可以访问该方法,互不依赖,不违反 DRY 原则,对库类的依赖并不比依赖同一个类上定义的静态方法好也不差。

  • 1234563实现只是简单地调用 B 上的静态方法。如果你真的很邪恶,那么提供者也可以被注入到 B 的实例中,但这可能是矫枉过正。
  • 可以将静态方法更改为新类的实例方法,该类依赖注入到 A 和 B 中。有时这有一个附带好处是允许您隐藏实例中的某些状态,而不是必须将参数传递给其他无状态的方法。

请注意,静态方法通常会在 OO 术语中引起问题,因此只有第三种选项才是真正的“干净”选项,它真正解耦了类并适当地允许对接口进行编码。

【讨论】:

  • 我有点不确定第二点 - “提供者实例”。这会是什么样子?这不会导致提供者实例类和 B 类之间的紧密耦合吗?
  • 是的,非常重要,提供者将与 B 类紧密耦合。您可以通过几种不同的方式反映这一点 - 例如,您可以将提供者隐藏在静态工厂方法后面.关键是要记住,目标是解耦 A 和 B,而不是解耦所有类(这基本上是不可能的)。有些地方确实需要知道你的实现涉及什么——关键是让应用程序逻辑(对象使用)与配置(对象创建)分开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多