2008-12-22 14 views
43

Ich habe jetzt seit ein paar Monaten in Ruby programmiert, und ich frage mich, wann es angebracht ist, Konstanten über Klassenvariablen zu verwenden und umgekehrt. (Ich arbeite in Rails, denke über Konstanten in Modellen nach).Konstanten oder Klassenvariablen in Ruby?

class Category 
    TYPES = %w(listing event business).freeze 
end 

ODER

class Category 
    @@types = %w(listing event business).freeze 
    cattr_reader :types 
end 

Gibt es Umstände, wo man zu einem anderen vorzuziehen ist? Oder ist es nur eine Frage des Geschmacks/Stils?

Antwort

54

Die Hauptsache ist, dass Sie mit der CONSTANT-Notation dem Leser klar machen. der kleingeschriebene, gefrorene String erweckt den Eindruck, könnte einstellbar sein, zwinge jemanden dazu, zurückzugehen und den RDoc zu lesen.

+5

+1 - und denken Sie an die Armen Variable, die nicht zu erfüllen seine desiny bekommt (es ändert sich nie)! Bezogen auf den RDoc-Kommentar beachten Sie, dass Konstanten standardmäßig dokumentiert werden – Gareth

+3

Schlechte kleine ungeliebte Variable. –

10

Wenn dies wirklich konstante Werte sind, die Sie im Quellcode definieren und nicht während der Codeausführung ändern wollen, dann würde ich die Verwendung von constant empfehlen.

Wenn Sie diese Werte dynamisch während der Ausführung festlegen und/oder ändern möchten, verwenden Sie die Klassenvariable mit Gettern und Sätzen.

8

Grundsätzlich könnte man es so ausdrücken: Wenn Sie etwas Konstantes wollen, verwenden Sie eine Konstante. Wenn Sie etwas haben wollen, das variabel ist, verwenden Sie eine Variable. Es scheint, dass Ihre Liste von Typen Konstanten sind, da es sich um ein eingefrorenes Array handelt. Daher würde ich sagen, dass es in diesem Fall sinnvoll ist, eine Konstante zu verwenden.

1

Wenn Sie nicht möchten, dass sich der Wert während der Laufzeit Ihres Programms ändert, und Sie den Wert außerhalb der Klasse verwenden möchten, verwenden Sie eine Konstante.

Andernfalls können Sie eine Klassenvariable verwenden. Beachten Sie jedoch, dass Klassenvariablen unter Unterklassen und Instanzen von Unterklassen gemeinsam genutzt werden. Wenn Sie also irgendwann in der Zukunft eine Kindklasse implementieren möchten, müssen Sie bei der Verwendung von Klassenvariablen sehr vorsichtig sein.

Siehe die Antworten hier für weitere Informationen hierzu: Class variables in Ruby