Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 依赖倒置设计选择问题_Java_Oop_Solid Principles_Design Principles_Dependency Inversion - Fatal编程技术网

Java 依赖倒置设计选择问题

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

我目前正在阅读一本关于依赖倒置原理的优秀教程

还有一件事,尽管思考了相当长的时间,我还是无法解释

DIP定义的相关部分:“高级模块不应该依赖于低级模块,两者都应该依赖于抽象。”

在第3.1点“设计选择和DIP”中,作者通过一个示例介绍了这一原理,其中
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规定


“也许有人有更深的理论知识……”我认为这是一个普遍存在的误解