matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 11: コードナビゲーション

2012-12-30 18:17:12

元記事

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

今日のネタはコード内のナビゲーションだ。ReSharperの3つの機能を扱う。「Navigate From Here」コンテキストメニュー、ガター(左余白)アイコン、「宣言に移動」だ。

ReSharperのすごい所に、コンテキストメニューが1つ以上あるってことがある。対象を絞ったコンテキストメニューは2、3のキーストロークで表示されるから、「今ここで少しでもやりたいかもしれないこと全部」ではなく「コードナビゲーション関係でやりたそうなこと全部」とか、「リファクタリング関係でやりたそうなこと全部」といったものを表示できる。(もちろん、すべてを含むコンテキストメニューを利用することもできる。)

対象を絞ったコンテキストメニューとは、脳能力とコーディング速度との大きな歩み寄りなんだ。使い始めるのは簡単だ。だって全種類の機能を表示するなら1つのキーストロークだけ覚えておけばいいから。でもコンテキストメニューの個々の項目は実際は別種のコマンドなんだし、それらの多くには独自のショートカットキーもある(そいつらはメインのコンテキストメニューには表示されず、対象を絞ったコンテキストメニューだけで表示される)。だから、普段使う機能についての専用のショートカットキーを徐々に覚えていくことも、それによって機能を速く呼び出すこともできる。

下記は「Navigate from Here」コンテキストメニューの例だ。Ctrl+Shift+Gで呼び出せる。

ReSharperの「Navigate From Here」コンテキストメニュー

コンテキストメニューなんで、現在のカーソル位置から見て意味のあるコマンドだけが表示される。もしクラス名の上にカーソルがあるなら、メソッド名や名前空間名の上にあるときとは別の選択肢が表示される。

すべての選択肢を使ったことがあるわけではないけど、今気に入っているのは「継承先」だ。もし、とあるインタフェースのメソッドを呼び出すコードの上だったなら、そのインタフェースメソッドを実装しているクラスの一覧が表示される。

ReSharperの「Navigate From Here - 継承先」。インタフェースメソッド上なら、そのインタフェースメソッドを実装する全てのメソッドが表示される。

さらにすごいのは、もしインタフェースの実装が仮想(virtual)メソッドだったなら、そのメソッドをオーバーライドしている派生クラスまで一覧に表示される。最上位のオーバーライド(インタフェースを実装しているクラス)は太字で表示される。それより下位のオーバーライド(メソッドをさらにオーバーライドしている派生クラス)は普通の文字だ。

ガター(左余白)アイコン

この機能は、僕はそんなに頻繁には使わない。上にたどるだけだし、それってそもそも簡単だ(同じことは「Navigate From Here」でもできる)から。まあでも書く価値はある。

ReSharperでは、基底クラス(または実装しているインターフェース)に関連するメソッド宣言の隣にガターアイコンが表示される。だからFooメソッドが基底クラスのメソッドをオーバーライドしているなら、あるアイコンが表示される。もし基底クラスのメソッドをシャドウしているなら別のアイコンが表示されるし、インターフェースメソッドを実装しているなら、さらに別のアイコンが表示される。

ReSharperのガターアイコン。インタフェースの実装、オーバーライド、シャドウを示す。

ReSharperのガターアイコン。上から順に、インタフェースの実装、オーバーライド、メソッドのシャドウ。

(考えてみると、これらのアイコンを眺めるところから始めないといけない。緑の「I」は、あるクラスにおいてどのメソッドがインタフェースから来ているものかを表すいい指標だ――でも一目瞭然とはいかないな。)

ガターアイコンをクリックすれば、関係する継承元メソッドにジャンプする。よさそうに思えるが、僕はめったに使わない。別に何もしなくても、普段は基底クラスしか使わないからね!(テンプレートメソッドはコードの重複を除く良い方法だけど、コードを追うのが面倒だったりする)

宣言へ移動

これは、ReSharperをインストールすると変更されるキーストロークのうちの1つだ。F12だったのがCtrl+Bになっている。識別子をCtrl+クリックするのでもいい。

キーストロークは別として、動作はVisual Studio版(コードの興味がある部分にジャンプ)とほぼ同じだが、1点だけ違う。その違いとは、(Microsoftのアセンブリみたいな)ソースコードのない識別子の上にいるときの動作だ。VSもReSharperもコード定義の説明を表示しようとするんだけど……

<怒>

ReSharperは古い「クラスブラウザ」を表示しやがる。ボロいから使うのは本当に苦痛だ。

ReSharperではクラスブラウザが表示される

実は、Ctrl+クリック以外のどのコードナビゲーション機能を使ってもこうなる。たとえば、ガターアイコンをクリックしても「クラスブラウザ」に行き着く。

一方Visual Studio 2005はクラスのメタデータをコードとして表示する新しい機能(「メタデータから」という機能)を持っていて、「オブジェクトブラウザ」は原則これで置き換えられているんだが、ReSharperに関係したところだけは例外だ。

Visual Studioでは、[メタデータから]というウィンドウ内で、メタデータをコードとして表示する

Visual Studioのコードビューのほうがずっといい。理由は2つ。

  1. ナビゲーションに関して「クラスブラウザ」はダメダメ。たとえば、Graphics.DrawImageを見ているとする(上の「クラスブラウザ」のスクリーンショットを見てほしい)。そうすればそのメソッドが引数としてImage型をとるのはわかる。ではImageクラスにどんなメソッドがあるか知りたくなってジャンプするときはどうだ?コードビューだったらCtrl+クリックで移動できるだろう。でもReSharperでは「クラスブラウザ」しか使えない。重要な情報は別のペインにある。まず右上のペインにある右側のオーバーロードをクリックし、右下角のXMLドキュメントコメントにある引数の型を見つけ、そしてそこのハイパーリンクをクリックしないといけないんだ。(長いこと、「クラスブラウザ」で引数の型にジャンプする方法があることに気づいてなかった。この記事を書いていて始めて見つけたんだ。)
  2. コードビューはコードっぽく見える。これなら見慣れているし、使い慣れている。どうやって動き回ればいいのかも完全に分かっている。コードなら毎日作業している。一体なんでReSharperみたいな生産性向上の道具で僕の生産性が下がんないといけないんだってことだ。全く同じことをするのに別のGUIを覚えないといけないし、しかももっといい代替物があるっていうのにだよ?

ReSharperでも新しいコードビューを使えるようになってほしいので、そういうい機能要求を送っておいた。返事は、コンテキストメニューからならVSの「定義に移動」にアクセスできるんだから、現状のままにしておくとのことだった。がっかりだよ!おんぼろオブジェクトブラウザが出てくるのは「宣言に移動」だけじゃないんだ――ReSharperのコードナビゲーション関係全部がそうなんだから。

(もし君たちもReSharperを使っていてこの件に不満だったら、サポートに知らせてやってくれ。)

</怒>


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