我已阅读关于依赖性反转(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