我已阅读有关依赖性倒置(SOLID中的“D”)并查看了一些示例here。
然而,我看不出依赖性如何完全摆脱!
根据文章关系消费者 - >可以将实用程序更改为Utility - >通过在消费者包中引入合同/接口来消费者。
此外,通过将合同/接口移动到像Consumer这样的单独包中,可以完全解除相反的依赖关系。合同< - 实用。
现在,采用上述布局;消费者使用该实用程序不应该有工厂吗?然后,它将原始依赖关系恢复如下:
消费者 - >工厂 - >效用
答案 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的情况下将是一场噩梦 - 你基本上必须有两个不同版本的功能。