What is meant by 'Inversion' in Dependency inversion
我在学春天。我了解依赖性注射。在某些地方,我也看到它被称为依赖倒置。我知道为什么它被称为注射,但"倒置"是什么意思?它实际上颠倒了哪种依赖关系?
好问题-单词
引用罗伯特·C·马丁的原始资料
One might question why I use the word"inversion". Frankly, it is because more traditional software development methods, such as Structured Analysis and Design, tend to create software structures in which high level modules depend upon low level modules, and in which abstractions depend upon details. Indeed one of the goals of these methods is to define the subprogram hierarchy that describes how the high level modules make calls to the low level modules. ... Thus, the dependency structure of a well designed object oriented program is"inverted" with respect to the dependency structure that normally results from traditional procedural methods.
阅读Uncle Bob在DIP上的论文需要注意的一点是C++没有(并且在写作的时候,仍然没有)接口,所以在C++中实现这种抽象通常是通过抽象的/纯的虚拟基类来实现的,而在Java或C语言中,抽象的解耦通常是通过ABST去耦合。从依赖项中提取接口,并将更高级别的模块耦合到接口。
编辑只是澄清一下:
"In some place I also see it called dependency inversion"
请注意,依赖注入(DI)是实现依赖反转原则(DIP)的可能实现之一,即实体设计原则中的"D",因此,
其他DIP实现包括服务定位器模式(现在通常被视为反模式)和插件。
反演:将依赖项管理从应用程序转换为容器(例如Spring)。
依赖注入:
与其编写工厂模式,不如直接将对象注入到客户类中。因此,让客户类引用接口,我们应该能够将具体类型注入到客户类中。有了这个,客户类不需要使用新的关键字,并且完全与具体的类分离。
那么控制权倒置(IOC)是怎么回事呢?
在传统编程中,业务逻辑的流程由静态分配给彼此的对象决定。通过控制反转,流程依赖于由汇编程序实例化的对象图,并通过抽象定义的对象交互实现。绑定过程是通过依赖注入实现的,尽管一些人认为使用服务定位器也提供了控制反转。
作为设计指南的控制反转可用于以下目的:
- 某个任务的执行与实施。
- 每个模块都可以专注于它的设计目的。
- 模块没有对其他系统的工作做任何假设,而是依赖于他们的合同。
- 更换模块对其他模块没有副作用。
有关更多信息,请查看:
设计模式IOC和DI。
设计模式——控制反转和依赖注入。
控制反转的实用介绍。
Spring框架中的控制反转(IOC)和依赖注入(DI)模式以及相关的访谈问题。