[英]Should I pass parameters or inject them to the place where they are needed?
我的應用程序中有兩個組件。 組件 1 是“模型構建器”。 它每隔幾毫秒接收一次數據並返回一個復雜的模型,該模型被傳遞給組件 2。組件 2 分析模型並基於它做出決策。 我不確定應該如何向組件 2 提供模型的新狀態。
解決方案 1 :將模型傳遞給組件 2 並在組件的入口點“更新”所有依賴項。 例如,Component2 的嵌套非常深的對象可能注入了“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);
}
}
有什么好的理由讓我更喜歡一種解決方案而不是另一種? 是否有任何解決方案嚴重違反任何設計實踐?
是的,您應該通過堆棧向下傳遞模型。
我們都有過這樣的例子,我們試圖通過隱藏信息傳遞來人為地保持我們的代碼“干凈”。 通過副作用進行通信使得一些最難追蹤錯誤。 此外,通過不向下傳遞對象,您會使多線程處理等事情變得異常困難。 保持你的代碼簡單,它會給你帶來可測試性、可擴展性和可維護性。 開始隱藏信息,它最終會由內而外腐爛。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.