紳士なブログ

紳士すぎてすみません

モンキーパッチの防止(Rakeの場合)

Rubyは動的言語であり、メタプログラミングを駆使すれば魔術のようなこともできる。

一方で、一歩間違えればコードの複雑性が上がり、可読性が下がってしまう危険性があるどころか、思わぬ挙動を引き起こしてしまうこともある。


テストを必要十分に書くということでそのようなミスを防ぐことはできるが、

コードを実際に書くときにも気をつけられることはないか。


ということでビルドシステムであるRakeのコードを簡単に見てみる。

gems/rake-0.8.7/lib/rake.rb
class Module
  def rake_extension(method)
    if method_defined?(method)
      $stderr.puts "WARNING: Possible conflict with Rake extension: \#{self}##{method} already exists"
    else
      yield
    end 
  end 
end


Rakeで上記のように定義することにより、

新規にメソッドを定義する際、例えば以下のように書いて安全確認をすることができる。

class String
  rake_extension('ext') do
    def ext(newext = '') 
      # do something
    end 
  end 
end

このようにすることで、Rubyのコアライブラリが将来String#extを定義するようになったら、例外を吐いて警告もらえる。