我目前正在阅读一本关于依赖性反转原理的优秀教程
https://www.baeldung.com/java-dependency-inversion-principle
尽管思考了很长一段时间,但有些东西我还是无法解释
相关部分从dip的定义出发:“高级模块不应依赖于低级模块。两者都应该依赖于抽象。”
在第3.1点“设计选择和倾角”中,作者通过一个例子介绍了原理,其中 StringProcessor
类使用 StringReader
和一个 StringWriter
组件,并使用接口/类和包提供多种设计选择。我的问题是选择2
" StringReader
以及 StringWriter
接口与实现放在同一个包中。 StringProcessor
现在依赖于抽象,但底层组件不依赖于抽象。“我们还没有实现依赖的反转” StringProcessor
是依赖于“抽象”的“高级组件”,即。 StringReader
以及 StringWriter
接口,从而从一个侧面实现dip定义,这是清楚的。现在给出整篇文章中使用的术语,第一句话中提到的“实现”,例如 ConcreteStringReader
和一个 ConcreteStringWriter
类将是这里的“低级组件”,我只是无法理解它们如何不依赖于“抽象”,即它们实现的接口,而不管包含哪些包
显然,从代码组织的Angular 来看,将实现与它们的接口放在同一个包中可能不是最好的,但是这如何违反上面wrt的逐字dip定义(取决于抽象),目前我无法理解
也许有人对这个主题有更深入的理论知识可以帮助我
2条答案
按热度按时间bn31dyow1#
“stringreader和stringwriter是与实现放在同一个包中的接口。stringprocessor现在依赖于抽象,但底层组件不依赖于抽象。“我们还没有实现依赖的反转”
虽然它确实不是dip,但imo的解释是错误的,问题是作者没有认识到类/组件和层/包/模块之间的区别。dip是一个只适用于模块之间关系的原则,这显然不适用于只有一个模块的情况。
至于第四点,
同样,第4项是一个更加解耦的dip实现。在这个模式变体中,无论是高级组件还是低级组件都没有抽象的所有权。
我们在这里需要非常小心,因为“所有权”不仅仅是“在同一个包中”。
e、 g.这将违反dip规定
6qfn3psc2#
隐含的一般概念是,一个包等同于一个抽象级别。因此,在第3.1.2节中,具体实现通过在同一个包中“拥有”它们的抽象;因为无论包在哪里发布,这些实现都是顺其自然的。共享包的类之间的耦合在某种程度上体现在语法上,甚至在Java8中也是如此。例如,
import
语句是不必要的,带有默认访问修饰符的类和方法是可见的。尽管如此,从jpms的特性来看,第3.1.2节中的缺陷还是比较容易看到的。模块是在包级别定义的,形式化了包是单个抽象级别的概念。在dip方面,依赖性也在包级别考虑。如果包包含具体的实现,则认为它是低级别的,不应具有传入的依赖项。
深入研究这个主题的整本书是java应用程序体系结构:模块化模式。