メタプログラミングRuby 第2章
似たようなメソッド群をどのようにリファクタリングするかという課題に対して、動的ディスパッチ&動的メソッドと method_missing の二つの手段で解決をはかる話。
ゴーストメソッド作成時の Object#respond_to? と Object#methods
method_missing でゴーストメソッドを作った場合、respond_to? の結果が false になる。また、Object#methods にも入らない。適宜必要な場合はそれぞれのメソッドをオーバライドしてやる必要がある。
Module#const_missing
method_missingほどではないけれど、覚えておけば使いどころはありそうなので覚えておきたい
ゴーストメソッドのデメリット
- バグが見つけづらくなる
- 普通のメソッド呼び出しより遅い
- 初回呼び出し時に define_method 等でメソッドを定義することで、二回目以降の呼び出しを高速化できる
- 既存のメソッドとかち合う可能性がある
- Module#undef_method でかち合うメソッドを削除する
- ブランクスレートを作る
- 1.9 なら BasicObject を継承して作る
- 1.8 なら undef_method を使う