繁体   English   中英

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

[英]Difference between “Inversion of Control”, “Dependency inversion” and “Decoupling”

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

依赖性反转讨论了解耦功能组件,以便更高级别的组件不依赖于更低级别的组件。

解耦谈论同样的事情以及如何实现它。 但是我们的IoC容器会让事情变得更糟。 为什么它们不是称为依赖性反转容器或更好的依赖注入容器 ,因为它们服务于独立组件的运行时耦合?

然后我们有控制反转 这与Dependency Inversion基本相同,不是吗? 为什么有三个术语描述同一个东西? 还是我失明了?

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

解耦是一个非常普遍的原则,适用于许多领域。 依赖性反转是一种特定的解耦形式,您可以将系统的较高级别与较低级别分离,将它们分离为库并使用接口。 这使您可以在不进行重大返工的情况下更换系统的较低级别部件。

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

控制反转是框架库使用的设计原则,允许框架从应用程序中重新获得某些控制。 即,当某些用户界面事件发生时,窗口框架可以回调到应用程序代码中。 Martin Fowler使用好莱坞原则一词, 不要打电话给我们,我们会打电话给你 解耦是控制反转的重要部分。

但是有什么IoC容器可以控制反转? 引用Martin Fowler的话

控制反转过于笼统,因此人们会发现它令人困惑。 结果与各种IoC倡导者进行了大量讨论,我们选择了Dependency Injection这个名称。

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

IoC容器有助于实现依赖注入,也许更好的术语是依赖注入容器。 但是,IoC容器名称似乎坚持下去。 依赖注入是依赖性反转的一个重要组成部分,但使用IoC容器进行依赖注入可能会令人困惑,因为控制反转是一个更广泛和更通用的原则。

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

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

我发现以下解释来自DIP在 martinfowler.com上的Wild文章中直接理解(此处DI =依赖注入,DIP =依赖性反转原理,IoC =控制反转):

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

另一方面,DIP是关于从代码发送到它正在调用的东西的消息中的抽象级别。 (...)DI是关于布线,IoC是关于方向的,DIP是关于[代码所依赖的对象]的形状。

依赖倒置:取决于抽象,而不是结构。

控制反转:主要与抽象,以及主要是系统的粘合剂。

DIP和IoC

这些是一些讨论这个问题的好帖子:

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM