2016-12-01 1 views
0

Es scheint, dass es sich um ein Protokoll ist eine Klasse auf diese Weise, wenn Sie einige Konstanten hinzufügen müssen, schreiben: Warum werden Konstanten in der Rubinklasse nicht empfohlen?

module AddressValidator 
    FIELD_NAMES = [:street, :city, :region, :postal_code, :country] 
    VALID_VALUE = /^[A-Za-z0-9\.\# ]+$/ 
    class << self 
    ... 
    end 
end 

hinzuzufügen Konstanten in der Klasse auch funktionieren, aber warum ist es nicht empfehlenswert

?

class AddressValidator 
    FIELD_NAMES = [:street, :city, :region, :postal_code, :country] 
    VALID_VALUE = /^[A-Za-z0-9\.\# ]+$/ 

    ... 
end 
+0

wo ist die Frage? –

+1

Wer hat dir gesagt, dass eine solche Regel existiert? – spickermann

+0

Ihr erstes Beispiel erstellt keine Klasse, es erstellt ein Modul. – Stefan

Antwort

2

Ich denke, Sie könnten ein bisschen verwirrt sein.

Das erste Beispiel, das Sie haben, erstellt keine Klasse.

class << self 

Dies ist die Notation der Singleton-Klasse des aktuellen Objekts in Rahmen für die Öffnung (im Fall von Ihrem Beispiel der AddressValidator).

Sie können dies testen, indem Sie AddressValidator.new aufrufen und keine AddressValidator-Instanz abrufen, sondern eine NoMethodError.

Ich denke, was Sie gehört haben, ist über Namespacing Konstanten, die Module als Standard-Praxis verwendet.

Wenn Sie nur eine Reihe von Konstanten, die Sie mit einem Namespace mit einem Modul wie diese trennen möchten, ist besser als eine Klasse verwenden. Im Grunde genommen ist die Faustregel, Module für Namespace und Klassen zu verwenden, nur wenn Sie Instanzen dieser Klasse erstellen möchten.

+0

Vielen Dank für Ihre ausführliche Antwort. Im ersten Beispiel kann man eine Methode aufrufen, die innerhalb der 'Klasse << self 'wie' AddressValidator.a_method' definiert ist. Also bin ich verwirrt und ich habe angenommen, dass es eine Klasse schafft. Aber es ist nicht so, weil es keine Instanz erstellen kann. – Leo

Verwandte Themen