Хранение настроек приложения Руби


Я использовал код, который выглядит немного похоже на это приложение, я работаю на:

module App
  module Settings

    class << self
      attr_accessor :console, :file
    end

    self.console ||= true
    self.file    ||= []

  end
end

Я решил использовать этот метод, потому что мне нравится интерфейс, у меня появилась идея после прочтения Синглтон примеры шаблоны проектирования в Ruby.

Я могу тогда требовать приложения/настройки из любого файла в моем приложении и читать/писать настройки

p App::Settings.console
App::Settings.file << "afile.rb"
p App::Settings.file

и т. д...

Это разумный способ сохранить свои настройки в одном файле? Я чувствую, что я излишне повторяться. Любые идеи для сушки?



Комментарии
2 ответа

Нет ничего действительно неправильно с этим, но с помощью простой хэш может быть проще:

module App
@@settings = {
:console => true,
:file => []
}
def self.settings
@@settings
end
end

Ваш следующий код станет:

p App.settings[:console]
App.settings[:file] << "afile.rb"
p App.settings[:file]

Существует несколько преимуществ такого подхода:


  • Хэши легко serialise и хранить в файлах, используя в YAML/JSON в/и т. д.

    require 'yaml'
    p App.settings.to_yaml

  • Вы можете ссылаться на приложения.настройки в локальной переменной, чтобы избежать ввода его:

    s = App.settings
    #do stuff with s

  • Хэш имеет много методов удобство для перебора его значений.

    App.settings.each do |key, value|
    #do something
    end

  • Вы можете добавить/обновить его лаконично, используя слияние! метод.

    App.settings.merge! :console => false, :newsetting => 'value', :etc => '...'

Чтобы получить функциональность, как это в вашей способ вам придется написать много методов себя. Лучше всего использовать встроенные функции, Руби вместо того чтобы изобретать колесо.

6
ответ дан 27 февраля 2011 в 10:02 Источник Поделиться

На основе решения @david4dev, вы можете сохранить старый интерфейс:

module App
@settings = {
:console => true,
:file => []
}
def @settings.method_missing(name, *a)
name.to_s =~ /(.*)=/ ? self[$1.to_sym] = a[0] : self[name]
end
def self.settings
@settings
end
end

p App.settings.console
App.settings.file << "afile.rb"
p App.settings.file

Кроме того, вы можете использовать параметры в качестве константы, как в свой исходный код:

module App
# ...
def self.const_missing(name)
name == :Settings ? @settings : super
end
end

p App::Settings.console
App::Settings.file << "afile.rb"
p App::Settings.file

require 'yaml'
p App::Settings.to_yaml

3
ответ дан 27 февраля 2011 в 02:02 Источник Поделиться