matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 23: 変数の導入(と、Ctrl+Shift+Rでリファクタリングすることの紹介)

2012-12-30 18:17:12

元記事

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

今日は、そして31日間の残りは、ReSharperのリファクタリングサポートについて話そう。これはVisual Studio 2005で取り入れられたいくつかのリファクタリングと比べてずっと改善されたものだ。

Ctrl+Shift+Rで「ここをリファクタリングする」

ReSharperには、リファクタリング用のコンテキストメニューがある。このメニューには、現在のカーソル位置で意味のあるリファクタリングか、または現在の選択範囲に基づいたリファクタリングだけが含まれる。Ctrl+Shift+Rで呼び出せる。

そこで表示されるものの例はこれだ。

ReSharperの「ここをリファクタリング」コンテキストメニュー。現在のコンテキストで可能なリファクタリングを表示する。

このメニューには他のリファクタリングコマンドも含まれていて、その中には独自に定義されたキーストロークを持っているものもある(それらはれっきとしたVisual Studioコマンドだから、キー割り当てを追加変更することができる)。よく使うリファクタリングがあるのなら、他のキーストロークをいくつか覚えていくかもしれない。でも僕としてはとっかかりのコストが安いのは本当に嬉しい。覚えなきゃいけないのはCtrl+Shift+Rだけだ。

変数の導入

「変数の導入」では新たな局所変数が作成され、選択した式で初期化される。そして選択した式は新しい変数を参照するように置き換えられる。

ReSharperの「変数の導入」リファクタリングダイアログ。Ctrl+Shift+Rでアクセス。

オプションの概要は次のとおり。

  • 変数の型。このコンボボックスが使用可能になっているのを見た覚えがない。いつも式が表す特定の型に固定されている。代わりに基底型を使いたければ、まず変数を導入して、それから型を変えないといけない。
  • 変数名。もちろん、ReSharperによる変数名の提案はここでも効く。ある1つの提案名が記入されていて、他のを見るにはコンボボックスをドロップダウンすればいい。
  • 式をすべて置換。導入するのは局所変数なので、現在のメソッド中の式が置き換わるだけだ。もし同じ式が1回以上あるのなら、たいていはこのオプションにチェックしたいと思うだろう。でもこれは、副作用とか別名変数とかによって、コードの振る舞いを変えることがある。だからこのオプションはデフォルトでチェックされていないんだろう。
  • 定数の導入。これは別のリファクタリングでもおかしくなかったが、「変数の導入」に統合されている。このチェックボックスは、式をコンパイル時に評価することができる場合だけ使用可能になる。

青色を取り除く

このダイアログを表示するとき、式がメソッド中に1回以上現れているなら、ReSharperは使用部分をすべて青でハイライトする。そしてカラーバーに青い目盛りも表示する。

「変数の導入」ダイアログをキャンセルした後でも式が青くハイライトされたままになるReSharperの「機能」。

「変数の導入」ダイアログをキャンセルしても、青いハイライトは消えないし、カラーバーの青い縞も消えない。これをバグ報告したが、いいえバグではありませんと言われた; これには目的があって、この式が現れている全ての場所を見ることができるようにです、だと。キャンセルボタンを使って式を探すなんてことは初めて聞いたよ。(おまいら、OKとキャンセル以外に別のボタンがあった方がいいとは思わないか?「使用状況の表示」ボタンとか?)

追記: 最初に書いたときには気づかなかったが、OKをクリックしても青いハイライトはとどまっている。だから何をやろうが関係なく、ダイアログを表示したなら、閉じた後に忘れずにEscを押す必要がある。おまけで余計な1ステップを、毎回毎回。ReSharperはものごとを簡単にし、一般的なタスクにかける時間を少なくするためのものじゃなかったのか?ブーブー。

わーわー言ったが、2ヶ月かかってやっと青色表示を消す簡単な方法を見つけた。Escを押すだけ。これはぜひ知っておくべきだ。でないとかなりしつこいからだ。Escを押さなければ、このハイライトはファイルを閉じるかコードを削除するかするまでずっと残っているぞ。

注: 明日の記事はまだあんまりできてないけど、今週末は外出してしまう。なので明日分の記事は日曜日に投稿されるだろう。


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