我正在阅读关于依赖反转和解耦的理论,但我看不出两者之间的区别。
依赖反转讲述了如何解耦功能组件,使得高层次的组件不依赖于低层次的组件。
解耦也在讲同样的事情以及如何实现它。但是,我们有 IoC容器 进一步混淆了问题。为什么它们不被称为 依赖反转容器 ,甚至更好的是 依赖注入容器 ,因为它们提供了独立组件的运行时耦合?
接下来是控制反转。它基本上与依赖反转相同,不是吗?为什么有三个描述同一事物的术语?还是我眼瞎?
- 这三者之间有什么不同?
- IoC容器中的IoC是什么意思?
我正在阅读关于依赖反转和解耦的理论,但我看不出两者之间的区别。
依赖反转讲述了如何解耦功能组件,使得高层次的组件不依赖于低层次的组件。
解耦也在讲同样的事情以及如何实现它。但是,我们有 IoC容器 进一步混淆了问题。为什么它们不被称为 依赖反转容器 ,甚至更好的是 依赖注入容器 ,因为它们提供了独立组件的运行时耦合?
接下来是控制反转。它基本上与依赖反转相同,不是吗?为什么有三个描述同一事物的术语?还是我眼瞎?
解耦是适用于许多领域的普遍原则。 依赖倒置 是解耦的一种具体形式,它通过将系统的高层次与低层次分离成库并使用接口来解除它们之间的联系。这允许您替换系统的低级部分而不需要进行重大改动。
例如,高层次的系统部分可以使用IoC容器而不是创建低层次类的具体实例,以解耦对象的创建方式。
控制反转是框架库使用的一种设计原则,它允许框架从应用程序中重新获得一些控制权。例如,窗口框架可能在发生某些用户界面事件时回调应用程序代码。Martin Fowler使用术语Hollywood Principle,即“不要打电话给我们,我们会打电话给你”。解耦是控制反转的重要组成部分。
但是,IoC容器与控制反转有什么关系?引用Martin Fowler的话:
控制反转是一个过于通用的术语,因此人们会感到困惑。因此,经过与各种IoC倡导者的大量讨论,我们选择了名称“依赖注入”。
(请注意,Martin Fowler谈论的是依赖注入而不是依赖倒置。)
IoC容器有助于实现依赖注入,也许更好的术语应该是依赖注入容器。但是,IoC容器的名称似乎很有说服力。依赖注入是依赖倒置的重要组成部分,但是使用IoC容器进行依赖注入可能会令人困惑,因为控制反转是一个更广泛和通用的原则。
您指出命名不太一致,但这并不是一个大问题,因为这些术语已经被独立发明和使用,即使它们重叠。
依赖注入通过使用控制反转实现解耦合。
依赖倒置: 依赖于抽象而不是细节。
控制反转: Main vs Abstraction,以及Main是系统的粘合剂。
以下是一些关于此主题的好文章:
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/
这些文章讲解得很好。