“控制反转”,“依赖反转”和“解耦”之间的区别


78

我正在阅读有关依赖倒置解耦的理论,但看不到两者之间的区别。

依赖倒置讨论了将功能组件去耦的问题,以便更高级别的组件不依赖于更低级别的组件。

去耦讨论了同一件事以及如何实现。但是随后我们有了IoC容器,使事情变得更加混乱。为什么它们不叫Dependency Inversion Containers或更好的Dependency Injection Containers,因为它们为独立组件的运行时耦合提供服务?

然后我们有控制反转。这和依赖倒置基本上是一样的,不是吗?为什么有三个描述同一事物的术语?还是我瞎了?

  1. 两者之间有什么区别?
  2. IoC在IoC容器中必须做什么?

@Anton Gogolev:解耦用多余的“ o”拼写:en.wikipedia.org/wiki/Decoupling#Software_Development
Robert Koritnik 2010年

Answers:


78

去耦是适用于许多领域的非常普遍的原则。依赖关系反转 是一种特殊的解耦形式,您可以通过将系统的较高级别与较低级别分离开来,方法是将它们分离为库并使用接口。这使您无需进行大量返工即可替换系统的较低层部分。

例如,可以使用IoC容器解耦如何创建对象,而不是使用系统的高层部分来创建较低层类的具体实例。

控制反转是框架库使用的一种设计原理,它允许框架从应用程序中重新获得某些控制权。即,当某些用户界面事件发生时,窗口框架可以回调应用程序代码。马丁·福勒(Martin Fowler)使用好莱坞原则一词,因为“不要打电话给我们,我们会打电话给您”。去耦是控制反转的重要部分。

但是,IoC容器与控制反转有什么关系?引用马丁·福勒Martin Fowler)的话

控制反转是一个过于笼统的术语,因此人们会感到困惑。经过与各种IoC倡导者的大量讨论,我们决定使用依赖注入这个名称。

(请注意,Martin Fowler谈论的是依赖注入,而不是依赖反转。)

IoC容器有助于实现依赖项注入,也许更好的术语是依赖项注入容器。但是,IoC容器名称似乎很固定。依赖注入是依赖关系反转中的重要组成部分,但是将IoC容器用于依赖关系注入会造成混淆,因为控制反转是更广泛,更通用的原理。

您指出命名并不十分一致,但这应该不足为奇,因为这些术语是相互独立发明和使用的,即使它们相互重叠。


我同意,尽管我不会使用术语IoC容器,因为正如您所说的那样,它并不是很正确。我认为在这里遵循(不正确的)流行命名方案并不重要,因为任何了解DI容器原理的人都应该能够理解正确的命名。
Andrey Shchekin 2010年

49

依赖注入实现解耦使用控制反转


4
控制反转还是依赖反转?我会说是后者。
罗伯特·科里特尼克

1
-1这其实夫妻术语“依赖注入”到“控制反转”。依赖注入本身就是一种解耦技术。
Mauricio Scheffer

2
@Mauricio:我根本不认为依赖注入去耦或去耦技术。DI提供了耦合去耦组件的方法。并非相反。
罗伯特·科里特尼克

4
嗯...依赖注入是控制反转的一种形式,但不一定实现很多解耦。依赖关系反转是实现解耦的方法,并且可以通过将依赖关系注入与控制容器的反转一起使用来实现。有用或什至更令人困惑?
2014年

jeez够多的说:((鲍里斯写得很好。做事情的方法太多了。重要的是团队内部的信任和尊重。从最纯粹的观点来看,软件设计原则是没有用的。并且对他们的书,如果没有配合优化和信念在自己的工作中存在。
迈克·索查III

24

我在martinfowler.com上的Wild文章中从DIP中找到以下解释很容易理解(此处DI =依赖注入,DIP =依赖反转原理,IoC =控制反转):

DI与一个对象如何获取依赖关系有关。当从外部提供依赖项时,则系统正在使用DI。IoC与谁发起呼叫有关。如果您的代码发起了调用,则不是IoC,如果容器/系统/库回调回您提供的代码,则为IoC。

另一方面,DIP大约是从代码发送到它所调用的事物的消息中的抽象级别。(...)DI与布线有关,IoC与方向有关,DIP与[代码所依赖的对象的形状]有关。


5
“ DI是关于布线,IoC是关于方向,DIP是关于(代码所依赖的对象的)形状。” 这是一个很好的句子;)
Amir Ziarati

我发现最后一句话中的形状一词令人困惑。除了已经说明的内容外,它似乎没有添加任何其他内容:DIP与抽象有关。我想说IoC是关于谁的,DIP是关于什么的,DI是关于如何的谁来控制依赖项?什么正在由依赖抽象?依赖性如何传递?
jaco0646

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.