2016-11-04 6 views
1

設定データを格納するために使用しているクラスを作成しました。現在、クラスは次のようになります。Rubyアクセスクラスの変数

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 

私が使用している変数にアクセスするには:

# 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 

これは非常にモジュラーではありません。追加の構成データの追加は、3か所で参照する必要があります。

これを達成する良い方法はありますか?

+0

代わりにOpenStructを使用してください。 –

答えて

4

あなたはクラスレベルのインスタンス変数を作ることができます...

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

それはややコンパクトだし、まだNOTE

あなた

username = Configed.username 
# ... 
を与える:がたくさんあります考慮すべき@philomoryの答えの良いアイデア。特にYAMLを使用すると、異なる環境に異なる定数を設定することが可能になり、現在の環境の設定オプションをイニシャライザで作成されたOpenStructにロードすることができます( testdevelopmentproductionなど)。より柔軟なソリューションを実現します。

+1

実際に彼が振る舞いに関して書いたことと実際に一致するには、 'attr_accessor'ではなく' attr_reader'を使わなければならないことに注意してください。 – philomory

+0

@philomory優秀な点、私は編集します。 – SteveTurczyn

3

潜在的な改善がたくさんあります。まず、weird specific inheritance-related behaviorが不要な場合にクラス変数を使用する理由はなく、インスタンス化しない場合はクラスをまったく使用する必要はありません。

あなたはモジュールを使用することができます。

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

Configed.username 

しかし率直に言って、あなたはほぼ確実にハッシュを使用した方がいいでしょう:

あなたはメソッドスタイルのアクセスを好む場合
Config = { 
    username: 'username' 
    # etc 
}.freeze 

Config[:username] 

または、OpenStruct

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

Config.username 

変更が必要な場合は、freezeを入力してください。また、通常、クラスやモジュールではない定数(ハッシュなど)は、ALL_CAPSに名前を持ちます。 CONFIGEDですが、それは実際のコードに影響を与えない文体的な決定です。

あなたの質問は設定を '解析する'ことを指しますが、もちろんそうではありません。設定の設定データ(これまでの私の例では)はRubyコードです。

config.yaml:

username: username 
password: password 

config.rb:

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

またはJSON:あなたは、むしろ非コードファイルからロードしたい場合は、必ずYAMLあります

config.json:

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

co nfig.rb:

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

良い答え、私は自分の答えでそれを参照しています。 – SteveTurczyn