2010-11-23 34 views
4

一般來說,創建一個實例變量的最佳做法和優缺點是可以從多個方法訪問或創建一個實例變量,該實例變量只是作爲參數傳遞給這些方法。在功能上它們是等價的,因爲方法仍然能夠使用變量來完成工作。雖然我可以看到一個好處,如果你正在更新變量,並希望返回更新的值,但在我的具體情況下,變量永遠不會更新,只能通過每種方法讀取以決定如何操作。哪個更好?創建一個實例變量或在Ruby中傳遞一個局部變量?

示例代碼是明確的:

class Test 
    @foo = "something" 

    def self.a 
    if @foo == "something" 
     puts "do #{@foo}" 
    end 
    end 

    a() 
end 

VS

class Test 
    foo = "something" 

    def self.a(foo) 
    if foo == "something" 
     puts "do #{foo}" 
    end 
    end 

    a(foo) 
end 
+4

請注意:在類級別聲明`@foo =「something」`將使其成爲類對象的實例變量,而不是測試對象。至少,這對我來說是個棘手的問題。 – Jeremy 2010-11-23 00:18:06

回答

1

正如你所說,這是對代碼的非功能性的問題。考慮到這一點......

很難給出一個明確的規則,因爲它完全取決於上下文。變量是否曾經被設置過並被遺忘過,或者不斷更新?多少個方法共享相同的變量?代碼將如何使用?

根據我的經驗,驅動對象行爲但很少(如果有的話)修改的變量在初始化方法中設置,或賦予將級聯行爲的方法。庫和葉子方法往往會傳入變量,因爲它可能有人會想孤立地調用它。

我建議你先將所有東西都先傳遞,然後重構,如果你注意到在整個類中傳遞相同的變量。

0

如果我需要一個範圍在實例級別的變量,我使用一個實例變量,在initialize方法中設置。

如果我需要一個範圍在方法級別的變量(即,從一個方法傳遞給另一個方法的值),我在方法級別創建變量。

所以你的問題的答案是「我的變量何時應該在範圍內」,如果沒有看到你的所有代碼並知道你打算如何處理它,我無法真正回答。

如果你的對象行爲應該在初始化階段被靜態設置,我會使用一個實例變量。

2

我不傳遞實例變量。它們是實例的狀態值。

將它們看作是該特定對象的DNA的一部分,因此它們將永遠是使對象成爲它的原因的一部分。如果我調用這個對象的方法,它就已經知道如何訪問它自己的DNA,並且會在內部執行它,而不是通過傳入某個參數。

如果我想對對象應用某種外來的東西,那麼我將不得不通過參數傳遞它。

相關問題