[英]What is the difference between Inversion of Control and Dependency injection in C++?
[英]Difference between “Inversion of Control”, “Dependency inversion” and “Decoupling”
我正在阅读关于依赖倒置和解耦的理论,我看不出两者之间的区别。
依赖性反转讨论了解耦功能组件,以便更高级别的组件不依赖于更低级别的组件。
解耦谈论同样的事情以及如何实现它。 但是我们的IoC容器会让事情变得更糟。 为什么它们不是称为依赖性反转容器或更好的依赖注入容器 ,因为它们服务于独立组件的运行时耦合?
然后我们有控制反转 。 这与Dependency Inversion基本相同,不是吗? 为什么有三个术语描述同一个东西? 还是我失明了?
解耦是一个非常普遍的原则,适用于许多领域。 依赖性反转是一种特定的解耦形式,您可以将系统的较高级别与较低级别分离,将它们分离为库并使用接口。 这使您可以在不进行重大返工的情况下更换系统的较低级别部件。
例如,不是系统的更高级别部分创建更低级别类的具体实例,而是可以使用IoC容器来分离对象的创建方式。
控制反转是框架库使用的设计原则,允许框架从应用程序中重新获得某些控制。 即,当某些用户界面事件发生时,窗口框架可以回调到应用程序代码中。 Martin Fowler使用好莱坞原则一词, 不要打电话给我们,我们会打电话给你 。 解耦是控制反转的重要部分。
但是有什么IoC容器可以控制反转? 引用Martin Fowler的话 :
控制反转过于笼统,因此人们会发现它令人困惑。 结果与各种IoC倡导者进行了大量讨论,我们选择了Dependency Injection这个名称。
(请注意,Martin Fowler讨论了依赖注入 ,而不是依赖反转 。)
IoC容器有助于实现依赖注入,也许更好的术语是依赖注入容器。 但是,IoC容器名称似乎坚持下去。 依赖注入是依赖性反转的一个重要组成部分,但使用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.