Hack Your Design!

Ruby Gem Configuration Pattern

railsのgemでよくみかける初期設定ファイル、config/initializers/foo.rb。このような初期設定のインターフェースをgem内に作る場合、いったいどうしたら良いでしょうか。

めざす完成形はコレ!

完成系として、下記を想定してみます。

# config/initializers/konfig.rb
Konfig.configure do |config|
  config.my_value = 'my configuration value'
end

configureメソッドを用意

まずはmoduleconfigureというクラスメソッドを用意します。

module Konfig
  class << self
    def configure
    end
  end
end

Configurationクラス

次に実際の設定値が入るConfigurationクラスを用意します。

class Configuration
  attr_accessor :my_value

  def initialize
    @my_value = 'default value'
  end
end

完成形

次にこれを組み合わせてみましょう。

module Konfig
  class << self
    def configure
      yield(configuration)
    end

    def configuration
      @configuration ||= Configuration.new
    end
  end

  class Configuration
    attr_accessor :my_value

    def initialize
      @my_value = 'default value'
    end
  end
end

これでインスタンス化されたConfigurationクラスが出てきます。

> Konfig.configure {|config| p config}
#<Konfig::Configuration:0x007ff5dfba4a50 @my_value="default value">
Konfig.configure do |config|
  config.my_value = "abc"
end
# => "abc"

Konfig.configuration
# => #<Konfig::Configuration:0x007fa9730aace8 @my_value="abc">

configureConfigurationインスタンス作っててブロック内のconfig変数でConfigurationインスタンスに設定注入していくようなイメージですね。

参考

  • このエントリーをはてなブックマークに追加