しおしお

IntelliJ IDEAのことなんかを書いてます

IDEの機能比較:ローカル変数の抽出

Eclipseを入れちゃったので、IntelliJとどれぐらい違うのかなと思って比較してみたよ。NetBeansも仲間にいれてます。

id:masanobuimai さんのコメントを元にEclipseにQuick Fixを使用した場合の操作を追加しています。

使ったバージョン

  • Eclipse Juno(ビルドば番号は見つかったけどバージョンがどこにあるかわからず)
  • NetBeans7.2
  • IntelliJ IDEA 12 EAP(120.305)

比較した機能

リファクタリング機能で最も使うローカル変数の抽出機能を比較してみたよ。個人的には、この機能はかなり重要だと思ってます。

Eclipse

Eclipseでローカル変数の抽出をするには、抽出する部分を事前に選択します。選択範囲でローカル変数が抽出できないとエラーになってしまいます。なんか残念すぎますね・・・
下の例だと、「map.get("USER_ID")」の戻り値をローカル変数に抽出します。
f:id:sioiri:20120810224259p:plain

範囲選択をしたら、Refactorメニューからローカル変数の抽出を選びます。下の画像のような感じですね。f:id:sioiri:20120810223749p:plain

変数名を入力するダイアログが表示されるので、好きな変数名を入れてあげます。
f:id:sioiri:20120810224523p:plain

これで変数の抽出が完了です。型をインタフェースに変えたりってこともできないみたいですね。
f:id:sioiri:20120810224700p:plain

QuickFixを使用したローカル変数の抽出

EclipseもQuickFix(command + 1やctrl + 1)を使用すると、リファクタリングメニューから行くよりも便利なリファクタリングができます。

ローカル変数を抽出したいステートメントにカーソルを移動し、Quick Fixを表示します。そうすると、ローカル変数を抽出するメニュー(〜new local variable)が出てくるので選択します。
f:id:sioiri:20120811002816p:plain

ローカル変数が宣言され、変数名及び型を変更できます。型と変数名の移動はtabで行います。
f:id:sioiri:20120811003148p:plain

リファクタリングメニュとは異なり型も選択できるようになります。
f:id:sioiri:20120811003258p:plain

NetBeans

抽出範囲は、カーソルの位置によって変わるようです。現在のカーソル位置以降でローカル変数に抽出可能なものを候補として出してくれます。IntelliJと同じ動きですね。

map変数の部分にカーソルがあると、map以降でローカル変数に抽出可能なものがリストされます。
f:id:sioiri:20120810225509p:plain

map変数より後にカーソルがあると、mapをのぞいたものがリストされます。
f:id:sioiri:20120810225617p:plain

ローカル変数の抽出はリファクタリングメニューの変数の導入から行います。
f:id:sioiri:20120810225847p:plain

Eclipseと同じように変数を入力するダイアログが表示されるので、好きな変数名を入れてあげます。
finalにできたりもするようですね。
f:id:sioiri:20120810230133p:plain

これで終わりです。型はEclipseと同じように選べないんですね。
f:id:sioiri:20120810230354p:plain

IntelliJ

IDEといったらIntelliJIntelliJですね。

抽出範囲の選択は、基本的にNetBeansと同じ動きですね。見た目はこんな感じです。
f:id:sioiri:20120810231120p:plain

ローカル変数の抽出は、RefactorメニューのExtractのVariableから行います。昔は、Introduce Variableみたいな名前だった気がします。
f:id:sioiri:20120810231706p:plain

個人的には、ダイアログ出すよりエディタ上でのリファクタリングが好みだけど、ここは他のIDEとあわせてダイアログを表示するリファクタリングでいきます。

変数を入力するダイアログが表示されます。変数名は、呼び出したメソッドの名前やMapのキー値などを元に候補として幾つか表示してくれます。これがなにげに便利ですよ。
f:id:sioiri:20120810231910p:plain

型も親クラスや実装しているインタフェースを候補で出してくれるので、インタフェースで宣言が簡単に出来ます。下の絵は、new ArrayList()に対してローカル変数の抽出をした場合です。Listなんかも候補にいますよね。
f:id:sioiri:20120810232158p:plain

抽出後はこんな感じです。
f:id:sioiri:20120810232238p:plain

ちなみにIntelliJでは、ダイアログを出さずにエディタ上だけでの操作も可能です。この切替は、「Settings」の「Editor」から行います。右下の方の「Enable in-place mode」にチェックを入れるだけです。

エディタ上だけで行う場合は、こんな感じになります。shift-tabで型選択になってtabで変数名編集にといったりきたりができます。
f:id:sioiri:20120810232523p:plain

まとめ

微妙な違いがあって、Eclipseはちょっと使いづらすぎるかなと。範囲選択を事前にしないとダメってのは使う気がなくなってきてしまいます。
IntelliJNetBeansは型選択ぐらいの差があるぐらいかな?この差が個人的にはものすごい大きいと感じてます。

Eclipseは、リファクタリングメニューからのローカル変数の抽出ではなく、Quick Fixからの操作が圧倒的に便利です。(なぜ、同じローカル変数の抽出なのに違いがここまであるのかわかりませんが・・・)
IntelliJEclipse(Quick Fix)を比較した場合は、そこまで大きな機能差はありません。(最後は好みの問題かな)

おわり。気が向いたら続編書きます。