2016-11-04 3 views
1

Ich habe eine Klasse erstellt, die ich verwende, um Konfigurationsdaten zu speichern. Derzeit sieht die Klasse wie folgt:Ruby-Access-Klassenvariablen leicht

class Configed 
    @@username = "[email protected]" 
    @@password = "password" 
    @@startpage = "http://www.example.com/login" 
    @@nextpage = "http://www.example.com/product" 
    @@loginfield = "username" 
    @@passwordfield = "password" 
    @@parser = "button" 
    @@testpage = "http://www.example.com/product/1" 
    @@button1 = "button1" 
    def self.username 
     @@username 
    end 
    def self.password 
     @@password 
    end 
    def self.startpage 
     @@startpage 
    end 
    def self.nextpage 
     @@nextpage 
    end 
    def self.loginfield 
     @@loginfield 
    end 
    def self.passwordfield 
     @@passwordfield 
    end 
    def self.parser 
     @@parser 
    end 
    def self.testpage 
     @@testpage 
    end 
    def self.button1 
     @@button1 
    end 
end 

Um die Variablen zugreifen Ich verwende:

# Config file 
require_relative 'Configed' 

# Parse config 
startpage = Configed.startpage 
loginfield = Configed.loginfield 
passwordfield = Configed.passwordfield 
username = Configed.username 
password = Configed.password 
nextpage = Configed.nextpage 
parser = Configed.parser 
testpage = Configed.testpage 

Dies ist nicht sehr modular. Das Hinzufügen zusätzlicher Konfigurationsdaten muss an drei Stellen referenziert werden.

Gibt es einen besseren Weg, dies zu erreichen?

+0

Verwenden Sie stattdessen OpenStruct. –

Antwort

4

Sie können Klassenstufe Instanzvariablen ...

class Configed 
    @username = "[email protected]" 
    @password = "password" 
    @startpage = "http://www.example.com/login" 
    # ... 
    class << self 
    attr_reader :username, :password, :startpage # ... 
    end 
end 

Es ist etwas kompakter und noch gibt Ihnen

username = Configed.username 
# ... 

HINWEIS machen: es gibt eine Menge von Gute Ideen in @philomorys Antwort, die Beachtung verdient. Die Verwendung von YAML im Besonderen würde es Ihnen ermöglichen, verschiedene Konstanten für verschiedene Umgebungen einzurichten test, development, production usw., und Sie können die Konfigurationsoptionen der aktuellen Umgebung in ein OpenStruct laden, das in einem Initialisierer erstellt wurde.Macht eine flexiblere Lösung möglich.

+1

Beachten Sie, dass Sie 'attr_reader', nicht' attr_accessor' verwenden müssen, um wirklich mit dem übereinzustimmen, was er bereits in Bezug auf das Verhalten geschrieben hat. – philomory

+0

@philomory ausgezeichneter Punkt, ich werde bearbeiten. – SteveTurczyn

3

Es gibt viele mögliche Verbesserungen. Vor allem, kein Grund, Klassenvariablen zu verwenden, wenn Sie nicht ihre weird specific inheritance-related behavior wollen, und keinen Grund, eine Klasse überhaupt zu verwenden, wenn Sie es nicht instanziieren werden.

Sie ein Modul verwenden:

module Configed 
    module_function 
    def username 
    'username' 
    end 
    # etc 
end 

Configed.username 

Aber ehrlich gesagt, sind Sie fast sicher besser dran mit einem Hash mit:

Config = { 
    username: 'username' 
    # etc 
}.freeze 

Config[:username] 

oder, wenn Sie Methode Stil Zugang bevorzugen, ein OpenStruct :

require 'openstruct' # from standard library 
Config = OpenStruct.new(
    username: 'username' 
    # etc 
).freeze 

Config.username 

Wenn sie modifizierbar sein müssen, tun nur freeze sie nicht. Außerdem würde typischerweise eine Konstante, die keine Klasse oder ein Modul (wie etwa ein Hash) ist, in ALL_CAPS einen Namen haben, z. CONFIGED, aber das ist eine stilistische Entscheidung ohne tatsächlichen Einfluss auf den Code.

Ihre Frage bezieht sich auf das "Parsen" der Konfiguration, aber natürlich nicht. Die Konfigurationsdaten in Ihrem Setup (und in meinen bisherigen Beispielen) sind nur Ruby-Code. Wenn Sie lieber aus einem Nicht-Code-Datei laden würden, gibt es immer YAML:

config.yaml:

username: username 
password: password 

config.rb:

require 'yaml' # from Standard Library 
Configed = YAML.load_file('config.yaml') 
Configed['username'] 

oder JSON:

config.json:

{ 
    "username": "username", 
    "password": "password" 
} 

co nfig.rb:

require 'json' # from Standard Library 
Configed = JSON.parse(File.read('config.json')) 
Configed['username'] 
+0

Gute Antwort, ich verweise es in meiner eigenen Antwort. – SteveTurczyn