Java 依赖倒置设计选择问题
我目前正在阅读一本关于依赖倒置原理的优秀教程 还有一件事,尽管思考了相当长的时间,我还是无法解释 DIP定义的相关部分:“高级模块不应该依赖于低级模块,两者都应该依赖于抽象。” 在第3.1点“设计选择和DIP”中,作者通过一个示例介绍了这一原理,其中Java 依赖倒置设计选择问题,java,oop,solid-principles,design-principles,dependency-inversion,Java,Oop,Solid Principles,Design Principles,Dependency Inversion,我目前正在阅读一本关于依赖倒置原理的优秀教程 还有一件事,尽管思考了相当长的时间,我还是无法解释 DIP定义的相关部分:“高级模块不应该依赖于低级模块,两者都应该依赖于抽象。” 在第3.1点“设计选择和DIP”中,作者通过一个示例介绍了这一原理,其中StringProcessor类使用StringReader和StringWriter组件,并使用接口/类和包给出了多种设计选择。我的问题是选择2,它是 “StringReader和StringWriter是与实现放在同一个包中的接口。String
StringProcessor
类使用StringReader
和StringWriter
组件,并使用接口/类和包给出了多种设计选择。我的问题是选择2,它是
“StringReader
和StringWriter
是与实现放在同一个包中的接口。StringProcessor
现在依赖于抽象,但底层组件不依赖于抽象。我们还没有实现依赖关系的反转。”
StringProcessor
是“高级组件”,它依赖于“抽象”,即StringReader
和StringWriter
接口,从而从一侧实现DIP定义,这一点很清楚。现在,考虑到整篇文章中使用的术语,第一句中提到的“实现”,例如ConcreteStringReader
和ConcreteStringWriter
类将是这里的“低级组件”,我只是无法理解它们如何不依赖于“抽象”也就是说,在它们实现的接口上,不管包含哪些包
显然,从代码组织的角度来看,将实现与它们的接口放在同一个包中可能不是最好的,但这如何违反上面wrt根据抽象定义的逐字DIP,目前我无法理解
也许有人对这一主题有更深入的理论知识,可以在这里帮助我所隐含的一般概念是,一个包等同于一个抽象级别。因此,在第3.1.2节中,具体实现由于在同一个包中而“拥有”其抽象;因为无论包发布在哪里,这些实现都是免费的。共享包的类之间的耦合在一定程度上体现在语法上,甚至在Java8中也是如此。例如,
import
语句是不必要的,带有默认访问修饰符的类和方法是可见的
尽管如此,根据JPMS的特性,在第3.1.2节中更容易看到该缺陷。模块是在包级别定义的,形式化了包是单个抽象级别的概念。在DIP方面,依赖性也在包级别考虑。如果一个包包含具体的实现,那么它被认为是低级的,不应该有传入的依赖项
深入探讨这一主题的整本书是。其中隐含的一般概念是,一个包等同于一个抽象层次。因此,在第3.1.2节中,具体实现由于在同一个包中而“拥有”其抽象;因为无论包发布在哪里,这些实现都是免费的。共享包的类之间的耦合在一定程度上体现在语法上,甚至在Java8中也是如此。例如,
import
语句是不必要的,带有默认访问修饰符的类和方法是可见的
尽管如此,根据JPMS的特性,在第3.1.2节中更容易看到该缺陷。模块是在包级别定义的,形式化了包是单个抽象级别的概念。在DIP方面,依赖性也在包级别考虑。如果一个包包含具体的实现,那么它被认为是低级的,不应该有传入的依赖项
一整本深入探讨这个话题的书是
“StringReader和StringWriter是放置在同一位置的接口
StringProcessor现在依赖于
抽象,但底层组件没有。我们还没有实现
“依赖关系倒置”
虽然它确实不是DIP,但在我看来,这种解释是错误的。问题是作者没有认识到类/组件和层/包/模块之间的区别。
DIP原则只适用于模块之间的关系,当存在单个模块时,这显然不适用
至于第四点
同样,第4项是一个更加解耦的DIP实现。在这个
模式的变体,既不是高级组件,也不是
低级别的拥有抽象的所有权
我们在这里需要非常小心,因为“所有权”不仅仅是“在同一个包中”
e、 g.这将违反DIP规定
“StringReader和StringWriter是放置在同一位置的接口
StringProcessor现在依赖于
抽象,但底层组件没有。我们还没有实现
“依赖关系倒置”
虽然它确实不是DIP,但在我看来,这种解释是错误的。问题是作者没有认识到类/组件和层/包/模块之间的区别。
DIP原则只适用于模块之间的关系,当存在单个模块时,这显然不适用
至于第四点
同样,第4项是一个更加解耦的DIP实现。在这个
模式的变体,既不是高级组件,也不是
低级别的拥有抽象的所有权
我们在这里需要非常小心,因为“所有权”不仅仅是“在同一个包中”
e、 g.这将违反DIP规定
“也许有人有更深的理论知识……”我认为这是一个普遍存在的误解