2017-08-01 28 views
0

我已閱讀關於依賴性反轉(SOLID中的'D')並查看了幾個例子here確實依賴倒置工作嗎?

但是,我看不出如何徹底擺脫依賴關係!

根據文章,消費者 - >效用關係可以通過在消費者套餐中引入合同/界面來更改爲效用 - >消費者。

此外,通過將合同/接口移動到單獨的程序包(如消費者 - >合同< - 實用程序),可以完全分離反向依賴關係。

現在,隨着上述佈局;消費者使用工具不應該有工廠嗎?然後帶回原來的依賴性如下:

消費 - >廠 - >工具

+0

是的它的工作原理!有關更多信息,請閱讀Martin Fowler的[依賴注入](https://en.wikipedia.org/wiki/Dependency_injection)和本文[https://martinfowler.com/articles/injection.html]。 – rafaelim

回答

0

如果有幫助,我將介紹其中依賴倒置原則來對我工作的地方的地方。

我使用內容管理系統 - 一種存儲圖像並讓人們檢索它們的系統。

嗯,這裏是我們目前的(壞)C++代碼如下所示:

Retrieve() 
    // code to initialize a vendor's API 
    // code to pass in system credentials 
    // code to clear the vendor's "current workitem list" 
    // code to pull the document to the current workitem list 
    // code to get content files from that document 
    // code to format those files for passing back to the user 

基本上,掛鉤到供應商的左右。這只是一個功能 - 整個代碼都是一樣的。

現在,想象一下你被告知:

「Sumith,我們正在以一種新的成像系統 - 我們從供應商ABC移動到供應商XYZ上開始改變代碼與合作工作。新系統「。

......呃......恩......是啊......你將不得不重做所有代碼。在每一個功能中,在與該供應商接口的程序的每個部分。這個依賴倒置的笑話基本上是這樣寫的:「你不會直接將你的燈直接插入電線,是嗎?」那麼,我們的團隊呢。

現在,這是依賴性倒置如何處理它。

Retrieve() 
    // Code that initializes an Interface we coded up 
    // Code that uses that interface, to pull up a doc (which, again, is an interface) 
    // Code that returns that doc interface's data 

...和那個接口?

Interface SimpleExample 
    void Initialize(); 
    DocExample GetDoc(); 
Interface DocExample 
    byte[] GetFileData(); 

所以,當經理說,「嘿,我們正在向供應商XYZ ......」

...所有你需要考慮到自己是,「好吧,我需要編寫一個實現我的'SimpleExample'接口的新類,然後我可以將它直接插入到我現有的代碼中,而無需更改該程序的任何代碼!「

現在,我正在重寫整個事情,讓我告訴你,依賴倒置原則已經爲我節省了大量的時間。我編寫了一個「ContentManagement」接口(當然,我使用的是抽象類,但它的功能類似),而我所要做的就是編寫一個實現ContentManagement接口的類。然後,我能有這樣的代碼:

ContentManagement vendorToUse; 
if (some criteria or such) 
    vendorToUse = instanceOfNewVendor; 
else 
    vendorToUse = instanceOfOldVendor; 
vendor.Initialize(); 
Document doc = vendor.Retrieve(...); 
... etc 

...嘗試這樣做,不直噴式將是一場噩夢 - 你基本上必須有兩個獨立版本的功能。