2015-02-24 55 views
2

在Ruby中传递一个类或字符串化的类名是否更好?传递一个类或字符串化的类名?

例如,我有一个解析器/构建器,可以确定解析记录的类的类型。我将其传递给一个进口商类,但我可以将该类的名称作为字符串或常量传递。有没有理由不这样做?

x = ParsedRecord.new(value: 1, type: MyClass) 

VS

x = ParsedRecord.new(value: 2, type: 'MyClass') 

与进口商要么:

x.type.new 

VS

x.type.constantize.new 

薪火类似乎更容易但我不看到它很多(即。 Rails使您可以将关联的类名称串联起来)。也许它与加载顺序/自动加载有关?

回答

1

除非需要延迟加载类名称,否则最好直接传递常量。

原因是因为将字符串转换为相应的类名常量是一个额外的步骤,并会增加执行的开销。如果您已经拥有课程名称,只需通过它。将它转换为一个字符串并返回到一个常量中没有任何优势。

原因是因为您看到字符串在其他库中传递,是因为要通过MyClass作为参数,必须加载类定义。在某些情况下,例如在Rails中,您引用了一个将被延迟加载的类的类名(这是rescue_from宏的典型情况)。使用字符串不会强制您加载类定义,直到您实际需要为止。

+0

不仅可以将其添加开销,但将限定类的名称,如'富::酒吧:: Class'成类对象,从程序中的任何一点需要一些技巧(虽然不冗长)的代码,它实际上并没有作为一个单一的方法构建到ruby中(至少不是1.9.3版,后面还不确定)。如果你没有理由必须这样做,我最好同意传递Class对象本身。 (有些人会说,如果你根据字符串名称或引用传递类而不是实例,那么这是OO/DI设计出现_potential_ poor的标志。 – jrochkind 2015-02-24 14:39:14

2

类是一个对象,就像任何其他类一样。所以,这不是关于课程。

问问自己:你是否宁愿传递一个对象作为参数,或者在某个地方包含某个变量的某个变量的名称,然后再通过元编程再次变成一个对象?

哦,那些没有名字的类呢?或者其名称与他们可以到达的变量不相符?

a = Class.new 
a.name 
# => nil 
# has no name 

A = a 
a.name 
# => 'A' 
# has name A, is reachable via A and a 

A = nil 
a.name 
# => 'A' 
# still has name A, but is no longer reachable via A, only a 

B = a 
a = nil 
B.name 
# => 'A' 
# still has name A, but is now only reachable via B 

传递类本身还允许您创建一个匿名类,如内联,在单元测试存根:

ParsedRecord.new(value: 1, type: Class.new) 
ParsedRecord.new(value: 2, type: Class.new do def initialize; @foo = 42 end end) 
相关问题