【问题标题】:How can I refactor a constructor so its real dependencies are clear?如何重构构造函数,使其真正的依赖关系清晰?
【发布时间】:2017-01-24 03:53:41
【问题描述】:

假设类PersonList 有方法AddNewPerson(),它创建一个新的Person 并将其添加到内部列表中。但是,Person 的构造函数需要几个参数(主要是它所依赖的接口)。这意味着PersonList 还需要将这些参数传递给 构造函数(或以某种方式使其可用)。

这种安排似乎有点代码味道,因为PersonList 不直接使用任何这些依赖项。它只是将它们传递给另一个构造函数。我如何重构这些类,以便清楚每个类的真正依赖关系是什么?

【问题讨论】:

  • 请显示一些代码(至少概述类的外观)。 PersonList 听起来像 DTO 或模型,而不是服务,所以听起来它不应该有依赖关系(这意味着你在正确的轨道上)。但是,当我们真的不知道我们在处理什么时,不太可能有人告诉你“如何重构它”。
  • @NightOwl888 我简化了问题以达到问题的本质,但我可能过于简化了。在我的实际案例中,这些类是 MVVM 应用程序的视图模型。 PersonListViewModel 有一个 AddCommand,该 AddCommand 被中继到创建和添加新 PersonViewModel 的方法。

标签: oop dependency-injection constructor refactoring


【解决方案1】:

"这意味着 PersonList 也需要具有这些参数 传递给它的构造函数(或以某种方式使其可用)。”

为什么会这样? PersonList 不必是 Person 对象的工厂,您可以将 Persons 直接传递给 AddNewPerson

例如

public void AddNewPerson(Person person);

但是,如果你们都希望使客户端代码免于创建 Person 实例,同时又希望避免 PersonList 依赖于创建 Persons 所需的内容,那么您可以引入 @ 987654329@ 将封装创建逻辑以及所需的依赖项。

在这种情况下,客户端可以使用PersonFactory 创建Persons 并将它们添加到列表中,或者PersonList 可以依赖于PersonFactory

【讨论】:

  • 由于我的应用程序的架构,AddNewPerson 方法不能有任何参数,所以工厂类是一个可行的选择。
  • @redcurry 在这种情况下,使用列表中的工厂可能是个好主意,或者您也可以直接在 PersonList 中获取依赖项...
猜你喜欢
  • 2017-03-03
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多