我已閱讀關於依賴性反轉(SOLID中的'D')並查看了幾個例子here。確實依賴倒置工作嗎?
但是,我看不出如何徹底擺脫依賴關係!
根據文章,消費者 - >效用關係可以通過在消費者套餐中引入合同/界面來更改爲效用 - >消費者。
此外,通過將合同/接口移動到單獨的程序包(如消費者 - >合同< - 實用程序),可以完全分離反向依賴關係。
現在,隨着上述佈局;消費者使用工具不應該有工廠嗎?然後帶回原來的依賴性如下:
消費 - >廠 - >工具
我已閱讀關於依賴性反轉(SOLID中的'D')並查看了幾個例子here。確實依賴倒置工作嗎?
但是,我看不出如何徹底擺脫依賴關係!
根據文章,消費者 - >效用關係可以通過在消費者套餐中引入合同/界面來更改爲效用 - >消費者。
此外,通過將合同/接口移動到單獨的程序包(如消費者 - >合同< - 實用程序),可以完全分離反向依賴關係。
現在,隨着上述佈局;消費者使用工具不應該有工廠嗎?然後帶回原來的依賴性如下:
消費 - >廠 - >工具
如果有幫助,我將介紹其中依賴倒置原則來對我工作的地方的地方。
我使用內容管理系統 - 一種存儲圖像並讓人們檢索它們的系統。
嗯,這裏是我們目前的(壞)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
...嘗試這樣做,不直噴式將是一場噩夢 - 你基本上必須有兩個獨立版本的功能。
是的它的工作原理!有關更多信息,請閱讀Martin Fowler的[依賴注入](https://en.wikipedia.org/wiki/Dependency_injection)和本文[https://martinfowler.com/articles/injection.html]。 – rafaelim