トップ «前の日記(2005年12月15日) 最新 次の日記(2005年12月20日)» 編集

ohai日誌

2003|12|
2004|01|02|03|04|05|06|07|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|06|08|10|11|
2008|01|02|03|04|05|07|09|
2009|01|02|
2013|06|12|
2014|01|02|03|04|06|09|10|12|
2015|04|
2016|09|
2018|02|

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 ならではのやりかた だと言えそうです。


トップ «前の日記(2005年12月15日) 最新 次の日記(2005年12月20日)» 編集