matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 27: メソッドの抽出

2012-12-30 18:17:12

元記事

31日間ReSharper一周」の27日目にようこそ。

今日のネタは「メソッドの抽出」だ。おそらく史上2番目に役立つリファクタリングだ(もちろん「リネーム」が1番だ。2~3日以内に扱うつもり)。

  • 「メソッド名」は一目瞭然。
  • 式がインスタンスフィールドや、メソッドや、プロパティのどれかを使っているなら、「static宣言」は自動的にグレーアウトされる。どうしてそうなのかはいまいち分からない。メソッドを呼び出すときには意味があるけど、フィールドやプロパティは、新しいメソッドに単に渡すだけでも良かったはずだ。ReSharperが許してくれるなら。
  • 「戻り値」には何の目的もないようだ。これが利用可能になっているのを見たことがない。「戻り値なし」か、空欄になっているかだ(ReSharperは明らかに戻り値の型を知っているはずなのに――「シグネチャのプレビュー」ダイアログボックスでは正しく表示されるんだから)。これが単にバグなのか、それとも空のコンボボックスを置くというのが慎重に決められたデザインなのか、よく分からない。
  • 「パラメータ」。どのパラメータが必要なのかはReSharperが決めて、記入してくれる。一方、グリッドは「シグネチャの変更」ダイアログのものと似ている。フル機能には程遠い。ここでできるのはリネームと並べ替えだけだ。パラメータの型を変えたりといったことは何もできない。

ReSharperは、必要だと判断したパラメータの名前を提案してくれる。でもダイアログが開いたときの1度きりだ。他の提案リストをドロップダウンすることはできない。

パラメータのチェックをはずすと渡されなくなる。その代わり、ReSharperは局所変数を生成して、3つの点(…)で初期化する。だからコンパイラは必ず、何か他のものを記入しなさいと穏やかに諭してくる。

パラメータを追加して抽出

何度か、ReSharperの(Delphiのもそう。この件に関してはね)「メソッドの抽出」ダイアログにパラメータを追加するオプションがあったらなあと願ったことがある。でも今夜このことを考えていて、必要ない――少なくともReSharperでは――ことに気づいた。

テスト用のセットアップコードがあるとしよう。こんな感じだ。

_foo = new Foo(42);

そして、このコード行を新しいメソッドに変えたいとする。メソッド名はInitializeFoo()で、int引数をとる。望みのものは、「メソッドの抽出」ダイアログがこれから書き出すコードを表示し、それが42をハイライトして、「さあ、この式に別のパラメータを追加してくれ」と言ってくることだ。

って、どんだけー。まさにそれをやってくれる機能はもうあったんだよ!な、なんだってー!実際にはまずOKをクリックしてメソッドを抽出しないといけない。でもそれからコードエディタで42をハイライトさせて「パラメータの導入」をすることができる。そうすると呼び出し元が42を渡すように自動的に更新される。全部オッケー。


31日間ReSharper一周 インデックスへ戻る