java - 我应该传递参数还是将它们注入(inject)到需要它们的地方?

标签 java design-patterns dependency-injection architecture dependencies

我的应用程序中有两个组件。组件 1 是“模型构建器”。它每隔几毫秒提供一次数据,并返回一个复杂的模型,该模型被传递给组件 2。组件 2 分析该模型并根据该模型做出决策。我不确定应该如何向组件 2 提供模型的新状态。

解决方案 1:将模型传递给组件 2,并在组件的入口点“更新”所有依赖项。例如,Component2 的嵌套非常深的对象可能已注入(inject)“holder”和“holder2”。通过在顶层用新信息更新持有者,那些叶子对象将获得信息。这种方法真的感觉就像我在通过副作用进行交流,很难找出变化来自哪里。

 public class Component2 {

 SomeInformationHolder holder; //these holders are requested for information deep down the object graph
 SomeOtherInformationHolder holder2;
 Subcomponent1 sub1;
 Subcomponent2 sub2;

 @Inject
 public Component2(Subcomponent1 sub1,Subcomponent2 sub2, 
                     SomeInformationHolder holder,  SomeOtherInformationHolder holder2) {
    super();
    ...
    ...
 }

 public void analyzModel(TaModel taModel) {
    holder.update(taModel.getInformation());
    holder2.update(taModel.getSomeOtherInformation());
    sub1.analyze();
    sub2.analyze();
 }
}

解决方案 2:我通过方法调用将整个模型传递到 Component2 的对象图深处。这使得新信息的来源非常清楚。然而,我讨厌传递所有信息,只是因为深度嵌套的对象需要它。这确实污染了我的代码:

 public class Component2 {

 Subcomponent1 sub1;
 Subcomponent2 sub2;

 @Inject
 public Component2(Subcomponent1 sub1,Subcomponent2 sub2) {
    super();
    ...
    ...
 }

 public void analyzModel(TaModel taModel) {
    this.sub1.analyze(taModel); //from hereon the "taModel" is passed down deeply where it will be used in some leafs of the object graph
    this.sub2.analyze(taModel);
 }
}

是否有任何充分的理由说明我应该选择一种解决方案而不是另一种?是否有任何解决方案严重违反任何设计实践?

最佳答案

是的,您应该通过堆栈向下传递模型。

我们都遇到过这样的情况,我们很想通过隐藏信息传递来人为地保持代码“干净”。通过副作用进行通信使得一些最难追踪的错误。此外,如果不向下传递对象,就会使多线程处理等事情变得异常困难。保持代码简单,它将为您带来可测试性、可扩展性和可维护性的返回。开始隐藏信息,它最终会从内到外腐烂。

关于java - 我应该传递参数还是将它们注入(inject)到需要它们的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59255969/

相关文章:

java - 为要上传到 Web 主机的 jsp 页面提供安全性

java - 我应该使用哪种基于 JVM 的语言将一种类型映射到另一种类型?

java - 如何 Hook 到内部 Eclipse 浏览器?

design-patterns - 策略设计模式与状态设计模式

Angular 2 : Property injection instead of constructor injection

android - Roboguice 2.0 @Inject 单例到 POJO

java - Android XzingScanner : How to customise ZxingScanner layout ?(添加按钮)

objective-c - 如何重用 UIView 和方法 - iOS 中的 DRY 代码

Python 设计模式 : using class attributes to store data vs. 局部函数变量

c# - 如何在责任链中注入(inject)下一个处理程序的依赖?