2012-01-07 83 views
1

我在頁面上顯示了一些導航鏈接。 它將在應用程序中修復,但將來可能會更改,但不會交互式更改,即使新版本發生了改變。因此在正在使用的應用程序中修復。使用常量或類變量?

鏈接的數量設置爲在控制器中的許多不同動作中使用。

我應該使用一個類級別的變量@@number_of_link s到使它留在類中,並允許其他用途(不同的控制器和模型說)同名的無衝突(即範圍的),或者我應該使用像NumberOfLinks常數?

我已經給出了關於這兩方面的建議,並且想確認我對第一方面的偏好。

+2

不知道你問什麼減少代碼;如果它是應用程序範圍內的常量,則它應該是應用程序範圍內的常量。如果它是一個類級常量,它應該是一個類級常量。 – 2012-01-07 02:30:00

+0

嘿Dave謝謝+1。當你說類級常量時,實際上這是否意味着在任何方法之外聲明的變量?任何預先修復?大寫字母? – 2012-01-07 04:25:55

+0

我應該多給點一些關於它如何改變的信息。我會補充一點,爲了更清楚起見,它會改變一點 – 2012-01-07 04:28:23

回答

4

這絕對不是一個常數,除非它是不變的!

而不是一個類變量,我會建議一個類實例變量。你得到一個類變量的所有優點,有着更爲出色的作用域(類的其他成員就不會破壞的價值,更容易獲得了。

class Foo 

    class << self 
    def number_of_links 
     @number_of_links ||= 10 # or some sensible default, you might make this a constant to highlight the number when you're reading the code. 
    end 

    def number_of_links=(n) 
     @number_of_links = n 
    end 
    end 
end 

puts Foo.number_of_links 
# => 10 
Foo.number_of_links = 20 

puts Foo.number_of_links 
# => 20 

看到http://blog.codegram.com/2011/4/understanding-class-instance-variables-in-ruby更多。

+0

謝謝。 +1我會檢查鏈接。 – 2012-01-07 04:27:04

+0

是的很好的信息。很容易吸收。 – 2012-01-07 04:37:21

0

比方說,你需要,如果你這樣做了恆定的紅寶石會警告這樣的更新的鏈接數「警告:已初始化常數NumOfLinks」

在這種情況下,你應該用類變量堅持。

1

如果它是一個嚴格的天性,你不與應用程序邏輯修改,應使用恆定計劃的東西。

如果您希望與類的狀態改變(如果它是基於數據庫交互的狀態外推),你應該使用類變量的東西。

從性能的角度來看,這並不重要,在這種情況下,使用上面您所描述的方法可以假設使用這使得它更容易造成開發商不理解「解碼」的變量類型的意圖。

+0

一個常數聽起來不錯,但我在想,如果num_of_links曾經在其他地方使用過,那麼最好將其範圍擴展到這個類。似乎它會更安全? – 2012-01-07 04:33:27

+0

是的,NUM_OF_LINKS有點不明確。一個常量必須以大寫字母開頭,所以唯一可能發生「衝突」的方式是如果您重新分配常量,這在ruby中是可能的。再次,約定是聰明之王。如果某件事情不會改變,另一個人可以通過評估應用程序的常量來了解您的應用程序。 – josephrider 2012-01-07 16:48:28

2

如果只會改變一個新版本的軟件,然後使其成爲一個常量,這更好地反映了這個值的意圖

不會被應用程序邏輯改變的值不需要是瞬態變量。類變量(和類實例變量),因爲許多開發人員無法理解差異EEN二,何時使用它們,等

2

像伊恩說..使用類的實例變量 ..但是你可以使用attr_accessor

class Foo 
    class << self; attr_accessor :number_of_links; end 
    self.number_of_links = 10 #default value.. 
end 

puts Foo.number_of_links 
# => 10 
Foo.number_of_links = 20 

puts Foo.number_of_links 
# => 20