“控制倒置”,“依赖倒置”与“解耦”的区别

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

依赖倒置说到解耦function组件,以便更高层的组件不依赖于更低层的组件。

脱钩谈论同样的事情,以及如何实现它。 但是,我们有IoC容器 ,更糟的是, 为什么不把它们称为依赖性反转容器,或者更好的dependency injection容器 ,因为它们提供独立组件的运行时耦合?

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

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

解耦是一个适用于很多领域的非常普遍的原理。 依赖倒置是一种特殊的解耦forms,通过将系统的较高级别与较低级别分离,并将它们分离为库和使用接口,从而将其解耦。 这使您可以更换系统中较低级别的部分,而无需大量返工。

例如,而不是创build较低级别类的具体实例的系统的较高级别部分,可以使用IoC容器来分离对象的创build方式。

控制反转是框架库使用的devise原则,它允许框架从应用程序中重新获得一些控制权。 也就是说,当某些用户界面事件发生时,窗口框架可以callback到应用程序代码中。 马丁·福勒使用“ 好莱坞原则”这个术语, 不要打电话给我们,我们会打电话给你 。 解耦是控制反转的重要组成部分。

但是,什么是IoC容器与控制反转呢? 引用Martin Fowler的话 :

控制反转是一个过于笼统的术语,因此人们感到困惑。 因此,与各种IoC倡导者进行了大量的讨论,我们决定使用Dependency Injection这个名字。

(请注意,Martin Fowler谈到dependency injection ,而不是依赖倒置 。)

一个IoC容器有助于实现dependency injection,也许更好的术语是dependency injection容器。 但是,IoC容器名称似乎坚持。 dependency injection是依赖性反转中的一个重要组成部分,但是dependency injection的IoC容器的使用可能会造成混淆,因为控制反转是一个更广泛和更通用的原则。

你指出,这个命名并不是很一致,但这不应该是一个大的惊喜,因为这些术语是独立发明和使用的,即使它们重叠。

dependency injection通过控制反转实现解耦

(在这里DI =dependency injection,DIP =依赖倒置原则,IoC =控制反转):我从martinfowler.com 的Wild文章中find以下解释:

DI是关于一个对象如何获得依赖。 当从外部提供依赖关系时,系统正在使用DI。 IoC是关于谁发起呼叫。 如果你的代码启动了一个调用,那么它不是IoC,如果容器/系统/库调用回你提供的代码,那它就是IoC。

另一方面,DIP是关于从代码发送到正在调用的消息的抽象级别的。 (…)DI是关于接线的,IoC是关于方向的,DIP是关于代码所依赖的对象的形状。