簡體   English   中英

我應該傳遞參數還是將它們注入需要它們的地方?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM