2011-11-21 56 views
3

我目前工作的一个Rails项目,并且已经发现时间它是最容易做的围绕对象的类来控制流/条件是否糟糕?

if object.class == Foo 
    ... 
else if object.class == Bar 
    ... 
else 
    ... 

我开始在我需要不同的方式显示不同的对象的意见这样做,但发现自己使用它在现在的其他地方,比如在以对象作为参数的函数中。我不确定为什么,但我觉得这不是好习惯。

如果不是很好的做法,为什么这样呢?

如果这完全没问题,那么有人可能想要特别使用它的时候?

谢谢!

回答

3

不知道为什么这对你有用。当你需要测试object是否Foo类的实例,你应该使用

object.is_a? Foo 

但无论如何它不是在Ruby中一个很好的做法。只要有可能,使用多态就会好得多。例如,如果代码中的某处可以有两个不同类的对象,并且需要以不同的方式显示它们,则可以在两个类中定义display方法。之后,您可以拨打object.display并使用相应课程中定义的方法显示对象。

该方法的优点是,当您需要添加对第三类或一大堆新类的支持时,您需要做的就是在每个类中定义display方法。但是在实际使用此方法的地方没有任何变化。

+0

''to_s''将会从'object.class'返回的类名上被调用,以尝试使类型兼容,所以它应该工作。另外'==='将用于检查类型。'object === Foo' –

+0

在1.8.7和1.9.2中试过它:'object.class == A'工作正常(甚至没有'==='),但是'object.class =='A' '不起作用。 –

+0

是的,我很累,并不意味着把双引号。编辑问题以供将来参考,谢谢你的回答! –

2

使用子类型表示类型特定行为更好。 让物体知道它们是如何显示的。创建一个方法Display()并将所有需要的外部参数作为参数传递。让“Foo”知道显示foo和“Bar”知道如何显示栏。

有很多关于用多态性替换条件的文章。

+0

一些示例文章:http://www.artima.com/interfacedesign/PreferPoly.html –

+0

StackOverflow问答http://stackoverflow.com/questions/4192837/how-does-one-use-polymorphism-instead-of- instanceof-and-why –

+0

感谢您的链接!我一定会阅读他们。 –

2

由于几个原因,这不是一个好主意。其中之一是duck typing - 一旦开始在代码中明确检查对象类,就不能再简单地传递与原始对象相似的不同类的实例。这使代理,嘲笑和其他常见的设计技巧更难。 (该点也可以概括为破坏了封装,它可以说,对象的类是一个实现细节,你作为消费者应该没兴趣。残破的封装≈紧耦合≈痛苦。)

另一个理由是可扩展性。当你有一个巨大的对象类型切换并且想要添加一个事例时,你必须改变切换代码。例如,如果此代码嵌入到库中,则库用户不能简单地扩展库的行为而不更改库代码。理想情况下,对象的所有行为都应该是对象本身的一部分,以便通过添加更多对象类型来添加新行为。

如果您需要以不同方式显示不同的对象,难道您不能简单地将绘图代码作为对象的一部分吗?

+0

谢谢,你描述的观点完全是我的疑虑!我绝对同意你和KL-7的看法,即制作显示方法是最明智的方法。 –

相关问题