我有时会得到一个类层次结构,其中我有一个具有一些常用功能的抽象基类和一些属于两个(很少更多)组的实现类,在某些情况下我想要区别对待。一个例子是抽象树节点类和不同的分支和叶实现,我想在某些点区分分支和叶子。
然后,这些中间类仅用于流控制中的“is-a”语句,并且它们不包含任何代码,尽管我已经遇到了稍后“增长”某些代码的情况。
这对你来说有点臭吗?在我的树示例中,一种替代方法是将isLeaf()
/ isBranch()
抽象方法添加到基类并在中间类上实现,但这对我来说似乎没有任何好处,真的,除非我的意思是要同时提供多个课程。
答案 0 :(得分:4)
对我来说,在流量控制中使用“is-a”测试就像使用switch / case一样臭。在良好的OO设计中,两者都不需要。
答案 1 :(得分:2)
是的,深层继承层次结构无论如何都是代码味道。
答案 2 :(得分:2)
是的,绝对是代码味道 - 除非你准备将代码写入其中,否则不要对这些空类进行编码。想想YAGNI(你不需要它) - 除非你已经需要它,否则不要这样做。
另外,您是否考虑过这些类只提供抽象方法,或根据方法或属性的能力对它们进行分组的情况?
如果是这种情况,也许您真正需要的是接口,而不是其他抽象类?
答案 3 :(得分:1)
一般来说,空类是代码气味。
我同意您的isLeaf
或isBranch
方法是正确的选择。
他们添加有关对象的信息,这很有帮助。
(这是因为,在超类中,你无法表达子类是“叶子或分支”)。
具有相反结果的两种方法也可视为代码重复。
您只能使用一个......但我建议您返回枚举值LEAF或BRANCH。
答案 4 :(得分:0)
不包含任何代码的类绝对是代码味道......
答案 5 :(得分:0)