在类层次结构中间有空类是否代码有问题?

时间:2009-09-28 09:28:33

标签: language-agnostic oop coding-style

我有时会得到一个类层次结构,其中我有一个具有一些常用功能的抽象基类和一些属于两个(很少更多)组的实现类,在某些情况下我想要区别对待。一个例子是抽象树节点类和不同的分支和叶实现,我想在某些点区分分支和叶子。

然后,这些中间类仅用于流控制中的“is-a”语句,并且它们不包含任何代码,尽管我已经遇到了稍后“增长”某些代码的情况。

这对你来说有点臭吗?在我的树示例中,一种替代方法是将isLeaf() / isBranch()抽象方法添加到基类并在中间类上实现,但这对我来说似乎没有任何好处,真的,除非我的意思是要同时提供多个课程。

6 个答案:

答案 0 :(得分:4)

对我来说,在流量控制中使用“is-a”测试就像使用switch / case一样臭。在良好的OO设计中,两者都不需要。

答案 1 :(得分:2)

是的,深层继承层次结构无论如何都是代码味道。

答案 2 :(得分:2)

是的,绝对是代码味道 - 除非你准备将代码写入其中,否则不要对这些空类进行编码。想想YAGNI(你不需要它) - 除非你已经需要它,否则不要这样做。

另外,您是否考虑过这些类只提供抽象方法,或根据方法或属性的能力对它们进行分组的情况?

如果是这种情况,也许您真正需要的是接口,而不是其他抽象类?

答案 3 :(得分:1)

一般来说,空类是代码气味。

我同意您的isLeafisBranch方法是正确的选择。 他们添加有关对象的信息,这很有帮助。 (这是因为,在超类中,你无法表达子类是“叶子或分支”)。


具有相反结果的两种方法也可视为代码重复

您只能使用一个......但我建议您返回枚举值LEAF或BRANCH。

答案 4 :(得分:0)

不包含任何代码的类绝对是代码味道......

答案 5 :(得分:0)

如果您稍后要提供新功能,那么对我来说似乎没问题。

但如果没有,这里通常使用枚举。

- 编辑

虽然我必须同意Ber,但你通常不应该使用'is-a'。