对于框架和指南的最大深度,是否有关于何时使用多级继承或在单个类中加入它们的最佳实践?
对于在Java世界中运行良好的既定实践/示例的一些引用在答案中会很好,因为这是从围绕Java的社区和框架的角度来看。
答案 0 :(得分:20)
您可能正在寻找一个很好的规则,例如“不超过5级继承”,但我真的怀疑是否存在这样的规则。对象通常模拟真实世界的实体,所有这些实体的社区从未就规则达成一致(据我所知)......
一个“最佳实践”绝对是:赞成合成优于继承。遵循本指南:定义一个没有其他超类的接口和实现。所有常见字段和方法都带有行为和strategies
另一方面,我们有时会对已经带有深层实体层次结构的现实世界实体或结构进行建模。 动物分类是一个例子或 algebraic structures 。建模这种现有结构的框架需要深层次的层次结构,因为它应该跟随现实世界才能理解。
答案 1 :(得分:6)
从我所看到的(注意:这不是官方意见,只是我的观察),3-4是合理的最大值。
另外,请记住Effective Java的一个重要部分:
赞成合成而不是继承
答案 2 :(得分:5)
在我看来,每个派生类都是“它自己的一个类”,这个类的客户端,包括子类,一般不会打扰或感兴趣,这个类和{之间有多少个类{1}}上课。
因此,我的答案是:不,让层次结构尽可能地深入,只要它有意义/似乎是合乎逻辑的。不要让层次结构深度影响是否要折叠两个类的决定。由于每个子类都是对它的基类的改进,我的经验表明,深度超过5或6个类很少有意义。
要明确:正如其他人所指出的,你应该赞成合成而不是继承。然而,对我来说,这似乎回答了一个稍微不同的问题。
根据this article,标准Java API的最大深度为9。
答案 3 :(得分:3)
我认为,从维护的角度来看,您可以管理的浅层继承层次结构是要走的路。通过多个层级跟踪错误,然后必须弄清楚它们应该在哪个级别修复可能是一个棘手的问题。
答案 4 :(得分:1)
没有关于最大继承深度的最佳实践。在java(以及任何OO语言)的继承中,这是经验法则,而不是大量查看。
1_在实现继承之前检查“是”关系是否为真。充电器是一辆车。 (所以继承很好)。如果你这样做,那么无论如何你都不会得到巨大的继承树。 (轮子不是汽车,所以这里的继承是错误的)
2_如果“是一个”关系失败或你有歧义,那么可能的继承就不是这样了。您需要确定类之间的共性并使用组合。(将公共代码重构为新类)。
3_如果你想建立一个类型层次结构,那么你应该使用Interface继承(Type)而不是类级继承。 (可能有些陈述需要更多解释,但为此你可能需要拿一些书。)
答案 5 :(得分:0)
您应该首先考虑您正在编写的代码的清晰度。具有更高级别的深度会使代码更易于阅读和维护,还是会使代码变得更难。很多,取决于你试图解决的问题。
正如其他海报所说,你可以使深度太浅或太深。这是一个金发姑娘问题恕我直言。
答案 6 :(得分:0)
最好的是每个班级都会处理一堆相似的事情 此类中的每个方法都会处理一个操作/行为。
看看DZone的这张refcard: http://refcardz.dzone.com/assets/download/refcard/54c22c8b0a53591ea9e0504fdfd4bada/rc130-010d-designing-quality_0.pdf
答案 7 :(得分:0)
一般规则是层次越深,理解特定方法和字段定义或/和重新定义的位置就越困难。
但是除了继承之外,您还需要注意其他因素,以保持代码复杂性的可管理性。
最好的方法是使用代码度量工具并尝试在不同因素(代码行,类解耦和......)之间取得平衡。
答案 8 :(得分:0)
在最佳实践方面,还应考虑性能(内存使用情况)。
当你有深层次的类(非抽象)时,它将使用更多的内存。就像创建3级继承的最后一个子节点的新对象一样,将使用LESS MEMORY而不是9级继承。 根据应用的性质,除了其他帖子之外,还可以考虑这一点。