2015-02-24 56 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) 
相關問題