2016-11-04 4 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 

Это не очень модульным. Добавление дополнительных данных конфигурации необходимо указать в трех местах.

Есть ли лучший способ добиться этого?

+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 

Это несколько более компактно, и по-прежнему дает

username = Configed.username 
# ... 

Примечание: Есть много хорошие идеи в ответе @philomory, которые заслуживают внимания. Использование YAML, в частности, позволит вам настроить разные константы для разных окружений test, development, production и т. Д., И вы можете загрузить параметры конфигурации текущей среды в OpenStruct, созданные в инициализаторе.Делает более гибкое решение.

+1

Обратите внимание, что для того, чтобы действительно соответствовать тому, что он уже написал с точки зрения поведения, вам придется использовать 'attr_reader', а не' attr_accessor'. – 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. Если вы не хотите загрузить его из файла без кода, всегда есть YAML:

config.yaml:

username: username 
password: password 

config.rb:

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

или 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

Хороший ответ, я ссылаюсь на него в своем собственном ответе. – SteveTurczyn

Смежные вопросы