【发布时间】:2011-08-11 06:14:11
【问题描述】:
作为最佳实践,高级包中的接口/类是否可以依赖于低级包中的接口/类?
例如
com.company.core.SomeClass可以依赖com.company.core.apackage.AnotherClass
或者依赖项应该以其他方式流动?我正在尝试消除包之间的循环。
【问题讨论】:
作为最佳实践,高级包中的接口/类是否可以依赖于低级包中的接口/类?
例如
com.company.core.SomeClass可以依赖com.company.core.apackage.AnotherClass
或者依赖项应该以其他方式流动?我正在尝试消除包之间的循环。
【问题讨论】:
通常,包的用户可能对com.company.functionality.MainUse 感兴趣,它是使用com.company.functionality.implementationdetail.FiddleWithStuff 实现的,所以我想说你必须接受那个方向的依赖。
但另一个方向可能也是必要的,因为实现细节类可能需要实现作为功能接口一部分的接口。
所以,不幸的是,我认为像这样严格的方向性并不是避免循环的可行方法。
【讨论】:
它们通常以另一种方式流动。 com.mycompany.myproduct.Widget 是一个接口,com.mycompany.myproduct.fancy.Button 实现了它。
然而,这条一般规则有很大的例外,没有理由让它成为规则。
包本身就是简单的文件夹,除了方法和字段的原始访问规则。
更重要的是捆绑包之间的依赖关系,即(以它们的基本形式)jars。让 jar A 依赖于 jar B 依赖于 jar C 又依赖于 jar A 是一个真正的问题。如果您在同一个 jar 中的包之间有相同的圆圈,这可能会导致阅读或调试您的代码的人或阅读它的精英人士感到沮丧,但这不是一个大问题。
【讨论】:
即使在 Java API 本身中,这种依赖也很常见。
看:http://download.oracle.com/javase/6/docs/api/java/awt/image/renderable/package-use.html
你可以看到java.awt中的类使用java.awt.image.renderable中的类。
(ADDENDUM) 底线:两个方向都在实践中使用。恕我直言,一个不一定比另一个更好。
【讨论】:
当然,您使用的是所谓的自顶向下方法,一个包依赖于它的子包,反之则不然。
自下而上的方法是相反的,一个包将依赖于它的父包,但反之则不然。
只要您能够保持一致性,任何一种方式都可以,但自上而下的方法更容易且更常见。
【讨论】: