依赖倒置真的有用吗?

时间:2017-08-01 10:34:05

标签: oop dependency-inversion

我已阅读有关依赖性倒置(SOLID中的“D”)并查看了一些示例here

然而,我看不出依赖性如何完全摆脱!

根据文章关系消费者 - >可以将实用程序更改为Utility - >通过在消费者包中引入合同/接口来消费者。

此外,通过将合同/接口移动到像Consumer这样的单独包中,可以完全解除相反的依赖关系。合同< - 实用。

现在,采用上述布局;消费者使用该实用程序不应该有工厂吗?然后,它将原始依赖关系恢复如下:

消费者 - >工厂 - >效用

1 个答案:

答案 0 :(得分: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 ......"

...所有你需要自己思考的是,"好的,我需要编写一个实现我的简单实例'的新课程。界面,然后我可以将其直接插入我现有的代码,而无需更改任何程序的代码!"

现在,我正在努力改写整个事情,让我告诉你,依赖倒置原则已经为我节省了大量的时间。我写了一个" ContentManagement"接口(嗯,我使用抽象类,但它的功能类似) - 而我所要做的就是编写一个实现ContentManagement接口的类。然后我可以得到这样的代码:

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

...试图在没有 D.I的情况下将是一场噩梦 - 你基本上必须有两个不同版本的功能。