matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 16: Alt+Enterで名前空間をインポート

2012-12-30 18:17:12

元記事

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

今日から数日の間は、ReSharperでいちばんよく使うキーストロークの1つについて話そう。Alt+Enterだ。前に言及したときにはReSharperの「十徳ナイフ」と呼んだけど、それはとにかく万能だからだ。ある種のコンパイラエラーを修正できたり、コードを補完できたり、使われていないコードを削除できたり、総じて言えば、コーディング中に繰り返し現れる作業を自動でやってくれる。

今日のネタ: 名前空間のインポート。

基本

前にも言ったけど、ReSharperは認識できないシンボルを赤く表示する。でも、まだusingしてない別の名前空間の中に存在するシンボルであることが分かっていれば、ReSharperは別のものも表示する。エラーを修正させようとするヒントだ。

Alt+Enterを押して名前空間をインポートするよう促す

だから、もしソースファイルPixelOffsetModeとだけ入力したら(しかも、まだusing System.Drawing.Drawing2Dをやってなかったら)、ReSharperは名前空間を全部スキャンして、その名前のクラスを探し出し、目的のものはこれですかと聞いてくる。Alt+Enterを押して同意すれば、ソースファイルに using System.Drawing.Drawing が追加される。

この機能について知っておくべき追加情報を以下に記す。

  • ソート。ReSharperは、予期した順序でusing文を追加する。その順序とは、修正版アルファベット順だ。最初にSystem名前空間以下の全部を(アルファベット順で)並べ、その後ろに残りの全部を(アルファベット順で)並べる。注意してほしいのは、この機能では、今言った順序に並んでいないときだけ並び替えをするんだけど、再度並び替えるときはCtrl+Alt+Fを押すだけでいい。
  • 場所にあまり依存しない。Alt+Enterで実行できる他の機能については後から話すけど、普通は、カーソルが存在するコードに特有のものだ。でも、今回に限った使い方――名前空間のusing――では、その必要はない。たとえカーソルが赤いシンボルの上になくても動く。(赤いシンボルがファイル内に複数あるなら、Alt+Enterの対象になるのはいつもカーソル位置に近い方だ。)
  • (あんまり)瞬間的ではない。コードの色分けと同じだけど、ヒントが表示されてAlt+Enterを押せるようになるまで、入力を止めて1~2秒待たないといけない時もあるだろう。ReSharperはコードを調べて、(a)型が認識されていないことと、(b)その型が別の名前空間に存在していることに気がつかないといけない。これが終わってからでないとAlt+Enterのヒントは出せないし、それまではAlt+Enterを押しても何も起こらないだろう。長くはかからないけど、時々は手を止めて待つ必要があるだろう。
  • あいまいさの解消。もしシンボルが複数の名前空間で見つかったら、ReSharperはどっちにするか聞いてくる。ヒントには「(複数の選択肢)」と表示されるだろう。Alt+Enterを押したら、選択肢一覧の中から欲しいものを選ばないといけない。
    Alt+Enterを押した後の選択メニュー
    Alt+Enterを押してインターフェースのどれかをインポートするよう促す
  • 参照に依存する。これは驚くような事じゃない。新しいアセンブリを作成して、クラスに[TextFixture]属性を追加すれば、ReSharperはそれを赤く表示するだろうけど、アセンブリを右クリックしてNUnit.Framework.dllへの「参照を追加」しないと、修正の手助けはやってくれない。

Ctrl+Alt+Spaceとの比較

昨日はCtrl+Alt+Spaceで型名が自動補完されusing文が追加されることを話した。

Alt+EnterはCtrl+Alt+Spaceが動かないところで動く。たとえば、オンラインのサンプルコードをコピペしている時に、必要なusing文が追加されていないような場合とか。でもコーディング一般ではCtrl+Alt+Spaceの機能の方が向いているとは思う。ただね、こっちを使うことをどうしても思い出せないんだな。「そうそう、今はメソッド名じゃなくて型名を入力しているんだから、Ctrl+Alt+Spaceを押すんだったな。」って考えられるようになるには時間がかかる。でももし使うことを思い出せたなら、何か入力してAlt+Enterを押すよりも適してるように思われる。

主な理由は、どっちの機能でも1~2秒待たなきゃいけない場合があるんだけど、待ちのタイミングはCtrl+Alt+Spaceの方がふさわしいからだ。

Alt+Enterだと、識別子を入力してスペースキーを押した時には、気持ちはもう次に入力する内容に移っている。でもコードが赤くなったことに気づいて、さっき書いた内容に注意を戻さないといけなくなる。「ありゃ、この文を入力し終わったらAlt+Enterで修正しないといけないな」という判断を意識の裏でするだけとは言っても、まあ気が散るよね。

一方Ctrl+Alt+Spaceでは、識別子の一部を入力したらキーストロークを押す。ここまでが識別子の入力の範囲だ。そしたら頭を行内の次のところに切り替える。だからすでに書いたコードの確認で流れがさえぎられるってことがない。

人によってメリットは違うだろう(し、僕のメリットだってそうだ)。べ、別にAlt+Enterがダメ機能だって言ってるわけじゃないんだからね!ただ、Ctrl+Alt+Spaceに適したところではそっちを使ってもいいんじゃないかって思っただけなんだから……

Visual StudioのAlt+Shift+F10との比較

Visual Studio 2005にも似たような名前空間をインポートする機能がある。VSが知っているシンボルを入力したときには、小さいスマートタグが表示される。マウスを乗せる(か、Alt+Shift+F10を押す)とドロップダウンメニューが表示され、そこからusingを追加することができる。ReSharperのAlt+Enterと比べるとどうかな?

  • キーストローク。もしシンボルが1つの名前空間だけに存在するなら、ReSharperではAlt+Enterを押すだけでいい。Visual StudioだとAlt+Shift+F10を押した後にEnterも押さないといけないから操作しにくい。ReSharperの勝ち。
  • ソート。Visual Studioだとusingブロックの最後尾に名前空間が追加されるし、すでにあるusing文の順番がでたらめでも放置される。ReSharperだと自動的に並べ替えられる。ReSharperの勝ち。
  • 位置関係。Visual Studioでは、カーソルがシンボルの上にないとスマートタグは表示されない。ReSharperでは、赤いシンボルが画面内にあるなら常に「名前空間の追加」というAlt+Enterのヒントが表示されるので、名前空間をインポートするときにカーソルを動かす必要がない。ReSharperの勝ち。
  • 応答時間。Visual Studioでは、型名の最後の文字を入力したらすぐにスマートタグがポップアップ表示される。ReSharperでは、シンボルが赤くハイライトされてヒントが表示されるまでに1~2秒かかることがある。かろうじてVisual Studioの勝ち。(3GHz/2GBの開発マシンよりも800MHz/256MBの個人用ノートPCの方が、もっと差が目立つけど)

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