放課後プログラミング

調べたことや考えたことなどを忘れないために書きます。

IntelliJがEclipseより優れているわけ

f:id:hiroaki-kono:20140514021425p:plain f:id:hiroaki-kono:20140514020505p:plain
僕は自宅ではIntelliJを使い、職場ではEclipseを使って開発を行っているため、それぞれの違いを感じることが多々ありました。
この投稿ではIntelliJEclipseのそれぞれについて、ある作業を遂行したいときの手間を示し、それぞれについてどちらがより優れているのか考察します。

※貼っている画像について、予約語赤色のものがIntelliJで、緑色のものがEclipseです。

1.補完

結果の質が同じであれば過程はできる限り楽にできる手法が優れている。補完機能無しでJavaの開発を行うととても神経を使い、下らないミスに時間を取られるため、Java開発において補完機能はもはやなくてはならないが、更にその補完機能を使ってなるべく楽をするには、なるべく的確に補完してくれる必要がある。

このようなUtilityクラスのテストしたい場合について考える。

enum RGB {RED, GREEN, BLUE}

class Utility { public static RGB getRed(){ return RGB.RED; } }

IntelliJで下記のようにreとタイプしたところ、第2引数の型(既に与えた情報)を読み取って、第1引数に入るであろう値を候補として挙げてくれた。
f:id:hiroaki-kono:20140513054042p:plain

Eclipsereとタイプしたところ、その候補はreから始まるものを列挙しただけのものだった。
f:id:hiroaki-kono:20140513064946p:plain
IntelliJはコードの文脈を理解し、スマートに補完することができる。
参照:http://www.jetbrains.com/idea/features/code_completion.html
プログラマは文字を正確にタイプすることではなく、プログラムの組み方を考えることに集中していた方が良いので、補完に手間取ることは大きなデメリットになる。

2.デバッグ

デバッグ中に変数に格納された値はどちらのIDEでも簡単に参照できる仕組みになっているが、メソッドの返り値を変数に格納せずに直接評価している場合はその変数のリストには列挙されていない。その返り値がなんであるかを知りたくなった場合について考える。

IntelliJでこれを実現するショートカットはAlt + F8
IntelliJでは評価値を知りたい部分にカーソルを合わせ、Alt + F8と押すとダイアログが出てくる。そこで評価したい式の範囲を選び、Evaluateボタンを押すことで値を知ることができる。
f:id:hiroaki-kono:20140513055859p:plain

Eclipseでこれを実現するショートカットはCtrl + Shift + I
Eclipseで評価値を知りたい部分にカーソルを合わせ、Ctrl + Shift + Iと押しても、カーソルの合っている箇所の最小単位でしか評価してくれないため、以下のようになる。
f:id:hiroaki-kono:20140513223439p:plain
Eclipseでは下記のように、評価したい範囲を正確に選択状態にしてからCtrl + Shift + Iと押すことで値を知ることができる。
f:id:hiroaki-kono:20140513223445p:plain
文字列の正確な範囲選択は神経を使うので、いくつかの候補から選択するのと文字列選択で指定するのとでは、前者の方がプログラマの負担は少なくなる。

3.ソフトラップ

エディタ上で一行が横長になり文字が切れてしまったときに、実際に行は分割せず次の行に表示する機能のことをSoft wrapという。notepad.exeでいう「右端で折り返す」のこと。

IntelliJではあらゆる場所でソフトラップが可能。
f:id:hiroaki-kono:20140515022542p:plain
標準出力ではトグル式のボタンで簡単に切替可能。

f:id:hiroaki-kono:20140515022548p:plain f:id:hiroaki-kono:20140515022549p:plain
一方Eclipseではソフトラップはできない。
f:id:hiroaki-kono:20140515022718p:plain
トレースの結果もラップできない。何がどうAssertionErrorか知るにも一苦労する。
f:id:hiroaki-kono:20140515022719p:plain
コーディング規約を横スクロールが発生しない文字数に定めればエディタ上の問題は大体解決できる。しかしログの出力を見るとき、ものすごい長さの横スクロールが現れて見づらいために、好みのエディタにログをコピペしてから読んだことはないだろうか。この手間から開放されるにはソフトラップ機能を使い、内容を一望できるようにすればよい。

4.パラメータ化

下記のコードについて、RGB.REDメソッドの引数で受けるようにしたい場合について考える。

private void print(){
    System.out.println("test" + RGB.RED);
}

IntelliJでこれを実現するショートカットはCtrl + Alt + P
パラメータ化対象箇所でCtrl + Alt + Pを押すと、まずどの範囲をパラメータ化するか選択できるようになる。
f:id:hiroaki-kono:20140514011652p:plainf:id:hiroaki-kono:20140514011654p:plain
パラメータ化の範囲を選択すると、次はどのようなパラメータ名にするかいくつかの候補を提示してくれる。ここでパラメータ名を選択するか自分で入力すればパラメータ化は完了する。
f:id:hiroaki-kono:20140514012101p:plain

一方Eclipseでこれを実現するショートカットはないらしい。パラメータ化対象箇所を文字列選択してからコンテキストメニューを開き、Introduce parameterを探し出す必要がある。
f:id:hiroaki-kono:20140514013903p:plain
Introduce parameterを探し出して押すとダイアログが開くが、大きめのダイアログのわりに情報は少なく、パラメータ名の候補はnameのみだった。
f:id:hiroaki-kono:20140514014130p:plain
パラメータ化の作業にかかる手間はIntelliJの方が格段に少ない。退屈な作業を強いられるとプログラマはコードに集中できず、作業効率は落ちてしまう。

5.ファイルアイコン・ファイルタブの表示

同じ.javaファイルでもテスト用のクラスだったり、enumクラスだったり、異なる種類のクラスやインターフェースが定義されている。

IntelliJでは同じ.javaファイルでも、内容によってそのアイコンは区別される。
f:id:hiroaki-kono:20140515040010p:plain
Eclipseはされない。(ところでEnumのソースはjdkのsrc.zipにあるEnum.javaを見に行ってるはずなのに、.classファイルとして認識されるらしい)
f:id:hiroaki-kono:20140515040007p:plain
それぞれのアイコンの意味は下記で確認できる。
IntelliJ : http://www.jetbrains.com/idea/webhelp/symbols.html
Eclipse : http://help.eclipse.org/kepler/index.jsp?topic=/org.eclipse.jdt.doc.user/reference/ref-icons.htm

また、IntelliJではファイルタブの多段表示が可能だが、Eclipseでは多段表示に対応していない。そのため開いているファイル数が増えるとタブの表示が省略されてしまう。
IntelliJでもEclipseでもCtrl+Eによって開いているファイルの一覧(IntelliJでは最近開いたファイルも含まれる)を表示して、検索してすぐに開くことができるため、問題にならないかもしれない。しかし開いているファイルを目視できれば何を開いていたか覚えておく必要がなくなるため、その分プログラマはコードに集中することができる。

6.キーマップ

デフォルトのキーマップが気に入らない場合はキーマップを編集する必要がある。そして両方のIDEでキーマップをカスタマイズすることが可能。
そのキーマップのカスタマイズをしたい場合に問題となる、それぞれのUIについて比較した。

IntelliJでは種類毎に分類され、メニューバーの機能やエディタ上のアクション等、階層を辿って目的の項目を見つけることができる。そのほか、機能の名前からの検索、キーマップからの検索が可能。また、デフォルトから変えたキーマップは青文字で表示されている。
f:id:hiroaki-kono:20140515003645p:plain

Eclipseでは項目毎の分類はされていない代わりにカテゴリというカラムが用意されている。検索方法はIntelliJと同様に機能の名前やキーマップに加えて、カテゴリやWhenカラムの値からも検索が可能。マトリクス上の全文字列に対して区別なく検索をかけているようだ。
f:id:hiroaki-kono:20140515003716p:plain
数多くのファイルが、ファイル名に色々情報が書かれて一つのディレクトリに全て置かれた状態と、いくつかのディレクトリに分類された状態なら、ファイル名に書かれた情報の具体的な文字列がわからないときでは後者が強い。一般的な通称のある機能であれば名前はわかるが、詳細な機能の名前まで把握している人は少ない。なるべく無知でも扱えるUIが優れている。

まとめ

IntelliJEclipseで何ができるかはそこまで大きく変わらない、しかしどのようにできるかの部分で大きな差がある。
この投稿では挙げていない多くの些細な部分でも、IntelliJは快適にコーディングさせてくれるのです。