我正在嘗試編寫使用依賴注入的代碼,以允許嘲笑並擁有更清晰,更明確的設計。OOP - 嵌套對象依賴關係的長鏈是否爲反模式?
我經常發現自己遇到了一個我認爲很常見的問題,但我還沒有找到任何幫助我克服它的問題。
問題是對象A依賴於B,B依賴於C,C依賴於D等等,因此鏈中可能有很多很多鏈接。
看來,要在這裏實施依賴注入,A必須在它的構造函數(或BFactory,CFactory等)中請求一個B,一個C,一個D等,以創建它們所依賴的實例)。我認爲,爲了論證,依賴關係不是可選的或者不適用於特定的方法,使得setter注入或方法參數注入不合適。
這表明對我來說,依賴對象的長鏈是反模式。從抽象意義上講,它與箭頭反模式有一些共同之處。從屬對象的長鍊形成一個箭頭形的序列圖。或許,那麼我應該避免這種做法,並遵循「扁平化比嵌套更好」的「Python的禪」中的建議。這表明一種設計,其中主程序創建兩個或三個對象,它們協作併產生返回到主程序的結果,然後再創建另外兩三個對象來完成下一個工作階段,等等。
我感覺這種代碼很容易理解和調試,也很容易進行依賴注入。但它似乎違背了Tell Do not Ask原則,並使主程序太胖。我喜歡主體非常小而明顯的想法,它不需要單元測試。告訴別別問我說,如果一切以A開頭並以A結尾,那麼這是A的責任。假設A是一位客戶,並且客戶擁有開始結算流程所需的數據以及最終發票需要發送到的電子郵件地址。那麼看起來A應該自己完成工作(主要可以調用Customer.billYourself()),而不是通過給主要的一系列發票和電子郵件地址將可靠性返回給main。
因此,我應該避免依賴鏈,讓DI更容易,或者因爲Tell Do not Ask而擁抱它們嗎?
這是一個有趣但很難回答的問題,沒有一個具體的例子來談論。由於設計哲學非常不同,可能會比事實多一點意見。 –
您的評論讓我意識到我正在使用的所有示例都在遺留代碼中,我正在重構可測試性。如果我發佈它們,一般糟糕的設計會導致更多的分心而不是澄清。我會嘗試去思考一個問題O' – naomi
好的,所以我試圖想到一種情況,我會試圖在一個新的應用程序中使用這樣的長鏈,我想不出一個。這可能是因爲它們是反模式,只會出現在有其他問題的應用程序中。 – naomi