2005年12月19日
_ RRBの Rename method について
Ruby は動的型付けな言語なので、Rename methodを正しく処理することは できません。よって、 RRB は二つのやり方を用意して、それをユーザに 選ばせることにしています。
一つめは、同名のメソッドをすべて変換する方法、もう一つは 選択したクラスに属していると明らかにわかるものだけを変換する方法です。
一つ目は説明の必要はないでしょう。で、二つ目ですが、ここで明らかに わかるというのは、定義部とselfを省略した呼び出しのみということです。 これは当然不完全です。 そこで RRB は以下のようなコードを、
class Heke def old_method : end end
次のように変換します。
class Heke def old_method raise "Heke#old_method is renamed to new_method" end def new_method : end end
これでテストを実行すると古いメソッドを呼びだした所で例外が 発生するわけです。あとはスタックトレースを確認して訂正すれば よいと考えているわけです。 リファクタリングする場合はすでにユニットテストは準備しているはずだ、 と仮定してよかろうという判断のもとこうしています。
また別の方法としては
class Heke def old_method warn "#{caller(1).first}: Heke#old_method is renamed to new_method" new_method end def new_method : end end
として警告を出すだけで新しいメソッドを呼ぶという手もあります。 ただこれは警告を見のがしてしまうというデメリットも考えられますので このやりかたは使っていません。
ちなみに Smalltalk のリファクタリングツールでは、上のようなコードを 埋め込み、ユニットテスト実行時にリネームしたメソッドの呼びだしが検出 されたとき、ソースのメソッド呼出し部を勝手に変更してしまうそうです。 実行環境と開発環境が密接に結びついた Smalltalk ならではのやりかた だと言えそうです。