Ruby on rails 围绕对象';什么课?

Ruby on rails 围绕对象';什么课?,ruby-on-rails,oop,Ruby On Rails,Oop,我目前正在从事一个Rails项目,并且已经找到了最容易实现的时间 if object.class == Foo ... else if object.class == Bar ... else ... 我开始在需要以不同方式显示不同对象的视图中这样做,但现在我发现自己在其他地方使用了它,比如在以对象为参数的函数中。我不确定为什么,但我觉得这不是一个好的做法 如果这不是好的做法,为什么 如果完全没问题的话,什么时候人们会特别想用这个呢 谢谢 我完全不知道为什么这对你有效。当您需要测试

我目前正在从事一个Rails项目,并且已经找到了最容易实现的时间

if object.class == Foo
  ...
else if object.class == Bar
  ...
else
  ...
我开始在需要以不同方式显示不同对象的视图中这样做,但现在我发现自己在其他地方使用了它,比如在以对象为参数的函数中。我不确定为什么,但我觉得这不是一个好的做法

如果这不是好的做法,为什么

如果完全没问题的话,什么时候人们会特别想用这个呢


谢谢

我完全不知道为什么这对你有效。当您需要测试
对象
是否是类
Foo
的实例时,您应该使用

object.is_a? Foo
但无论如何,这在Ruby中不是一个好的实践。只要可能,最好使用多态性。例如,如果代码中的某个地方有两个不同类的对象,并且需要以不同的方式显示它们,则可以在这两个类中定义
display
方法。之后,您可以调用
object.display
,对象将使用相应类中定义的方法显示


这种方法的优点是,当您需要添加对第三个类或一大堆新类的支持时,您所需要做的就是在每个类中定义
display
方法。但在实际使用这种方法的地方,一切都不会改变

最好使用子类型来表达特定类型的行为。 让对象知道它们是如何显示的。创建一个Display()方法,并将所需的所有内容作为参数从外部传递。让“Foo”知道如何显示Foo,“Bar”知道如何显示Bar


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

这不是一个好主意,有几个原因。其中之一是–一旦开始显式检查代码中的对象类,就不能再简单地传递与原始对象符合类似接口的不同类的实例。这使得代理、模拟和其他常见的设计技巧变得更加困难。(这一点也可以概括为破坏封装。可以说,对象的类是一个实现细节,作为消费者,您不应该对此感兴趣。破坏封装≈ 紧耦合≈ 痛苦。)

另一个原因是可扩展性。当您在对象类型上有一个巨大的切换,并且希望再添加一个case时,您必须更改切换代码。例如,如果此代码嵌入到库中,库用户就不能简单地扩展库的行为而不修改库代码。理想情况下,对象的所有行为都应该是对象本身的一部分,这样您就可以通过添加更多的对象类型来添加新的行为


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

将对从
对象返回的类名调用to
。另外,
==
将用于检查类型
object===Foo
在1.8.7和1.9.2中都尝试过:
object.class==A
可以正常工作(即使没有
===
),但是
object.class===A'
不起作用。是的,我很累,也不想加双引号。编辑后的问题供将来参考,谢谢回答!关于StackOverflow的问答谢谢,你所描述的要点正是我的疑虑!我完全同意你和KL-7的观点,制作一个显示方法是最明智的方法。