根据Ruby惯例放置配置块的位置?

时间:2015-08-02 00:52:01

标签: ruby coding-style config

哪个更正确? 我知道他们两个都“有效”,但是在哪里放置配置块的约定是什么?

此:

class Something
  Library1.config do |config|
    #call configuration methods
  end

  Library2.config do |config|
    #call configuration methods
  end

  def initialize
    #build the object
  end
end

还是这个?

class Something
  def initialize
    Library1.config do |config|
      #call configuration methods
    end

    Library2.config do |config|
      #call configuration methods
    end

    #build the object
  end
end

1 个答案:

答案 0 :(得分:0)

没有一个正确的答案。你只需知道每种情况下你想要什么,因为他们做了不同的事情。

  • 前者在首次加载类时配置库
  • 后者每次创建实例时都会配置库。

两者都是你可能想要的东西,但我可能会

为什么呢?因为您正在修改许多类可能依赖的模块的全局状态,所以可能只想配置一次。相反,我会将配置放入一个专门的配置文件,在初始化时加载。这通常在例如rails(请参阅:rails项目的config/目录中的所有内容。)

实施例

我构建了一个示例,说明了不同的行为,以及在更改模块的全局配置时,rouge类(Spoiler)如何使每个人感到困惑。在此示例中,Spoiler更改配置两次,明显影响NaiveUser

module Configurable
  def self.configuration
    @configuration ||= { number: 1 }
  end

  def self.config
    yield(configuration)
  end
end

class NaiveUser
  def configurable_number
    Configurable.configuration[:number]
  end
end

puts NaiveUser.new.configurable_number

class Spoiler
  Configurable.config do |c|
    c[:number] = "first spoil"
  end

  def initialize
    Configurable.config do |c|
      c[:number] = "spoiled again"
    end
  end
end

puts NaiveUser.new.configurable_number

Spoiler.new

puts NaiveUser.new.configurable_number

该程序的输出是

1
first spoil
spoiled again

这个例子可以是例如扩展到一个示例,其中有状态NaiveUser错误地混合来自两个不同配置的结果(错误的)假设配置将保持不变。