2012-08-14 20 views
1

所以說我有甲級,乙級和丙級。甲級有一個單一的責任,但需要從乙類和丙級功能,所以起初我想讓甲從乙和丙繼承,然後通過遵循「繼承「原則,使AI的B和C成員可以降低設計的剛性,並使這兩個類更具可重用性。依賴注入如何幫助對象組合?

起初B和C只需要在A的構造函數中實例化,但最終他們有方法需要在兩三個其他地方調用 - 因爲我正在其他地方重用這些類,所以我忘記調用其中的一些正確的方法會產生很多不必要的缺陷和時間浪費......我的問題是依賴注入是否有助於解決這個問題,它是否有助於減少使用組合的複雜性,如果是這樣,如何呢?

public class A 
{ 
    private mB; 
    private mC; 
    public A(IB b, IC c) 
    { 
     mB = b; 
     mC = c; 
    } 
    public MethodX() 
    { 
     mB.DoWhatever(); 
    } 
    public MethodY() 
    { 
     mC.DoSomething(); 
    } 
} 

從我的理解DI會讓我配置了哪些具體類IB和IC獲得通過構造函數把這樣和處理其creation-但怎麼回事會幫助它(複雜性方面)?

我決定問基於不理解這篇文章這樣一個問題:http://lostechies.com/chadmyers/2010/02/13/composition-versus-inheritance/

對於現實生活中的例子,說我有一個包含有當國家要求註冊其事件的事件監聽類State類的Begin方法,當它調用End方法時取消註冊。

+0

這個問題可能更適合在代碼評審。 http://codereview.stackexchange.com。這聽起來像你需要使用接口以及具有虛擬方法的抽象基類,以便您可以覆蓋它們並提供默認實現。 – 2012-08-14 03:12:24

+0

[codereview.se]或[programmers.se],任一。無論如何,不​​在這裏。 – 2012-08-14 03:48:06

回答

1

你的推理是合理的,而你正處在正確的軌道上。

通過接口/抽象使用DI和組合使得它更易於構建和構建代碼。如果可以幫助您的流程,您可以在構建A時使用B和C的臨時「假」實現。

典型的解決方案是對因子的結構和A,B和C的結構伸到一個工廠類或A的一個子類

+0

因此,在工廠我會做一些分析我的狀態的構造函數,並發現它取決於一個IEventListener,然後看看我的配置,它告訴我爲它創建一個EventListener,另外配置說,包裝狀態一個IStateEventListenerDecorator裝飾器,它處理IState自己的Begin和End方法之上的事件註冊和註銷事件? – Ford 2012-08-14 12:52:12

+1

就是這樣的。或者使用框架從配置文件以正確的順序創建實例。這是另一個受歡迎的選擇。 Plus:您可以編輯文件,並且它是機器可寫的。減:您基本上必須學習另一種編程語言,而您已經在使用該編程語言。重點是將代碼工作和對象的交互方式與具體實現的使用方式以及創建方式分開。 – 2012-08-14 14:03:15

0

我認爲你對DI的理解是正確的。 通過從類A中去除類B和類C的實例化,DI使它們彼此之間更少耦合。現在A類依賴於抽象接口IB和IC,而不是它們的具體實現。這使A類代碼更加靈活(如果需要,您可以輕鬆地注入IB和IC的其他實現,只需簡單地重新配置DI容器),並且可測試(您可以注入IB和IC的模擬實現)。另外,它可以使得類A的代碼更具可讀性,因爲現在它對合作者IB和IC的依賴性由構造函數的簽名明確地表現出來。

3

依賴注入根本無法幫助對象組合。您甚至需要一定程度的組合性才能使用注射。通常依賴倒置用於反轉常規依賴關係,以便可以通過抽象來建模依賴關係,抽象可以將它們本身注入其他內容而無需直接耦合。注射是一種反向幫助解耦的形式,而不是組成。

0

依賴注入通過自動化和管理這些依賴關係的創建來處理依賴性時,可以在一定程度上抵消複雜性。 (使用Autocac或Unity等IOC容器實施時)在A,B和C的簡單示例中,可能很難看到任何真正的節省。在開始看到降低複雜性的時候,當您實施與C相關的D類時,便利您的DI的IOC容器將知道如何編寫A,B和C(使用A & B),以便您的手卷代碼不需要擔心創建對象的實例作爲依賴關係傳遞。就複雜性而言,我指的是控制依賴關係所需的代碼/保管的數量。

在IOC和DI真正發光的地方,正如Peter指出的那樣,將相互依賴關係解耦,以便代碼可以單獨進行測試。如果您想爲C類編寫單元測試,但C創建A的實例B,則無法與A & B隔離進行測試。當A或B類似於數據服務或文件服務時,可以進行單元測試痛苦。利用IOC,C接受對可被嘲笑的服務的合約接口的引用。通過這種方式,C可以通過依賴關係進行可預測的行爲測試。