2017-08-01 25 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 

...尝试这样做,不直喷式将是一场噩梦 - 你基本上必须有两个独立版本的功能。