モンキーパッチの防止(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を定義するようになったら、例外を吐いて警告もらえる。