What’s Cool In IntelliJIDEA. Part I - 4

これは、What’s Cool In IntelliJIDEA. Part Iの翻訳(の一部)です。


前回分はこちら


http://d.hatena.ne.jp/fuzzhead/20111120/p1
http://d.hatena.ne.jp/fuzzhead/20111121/p1
http://d.hatena.ne.jp/fuzzhead/20111123/p1

Smart Code Completion

型付け(typing)は、単なる結びつけ(tying)かい?*1この型付けという用途で使用する際に、IDEが何と賢いことであるか、本当に驚くべきことだ。自分が望んだように、IDEが自動的にコードを補完するというのはクールじゃないか?

簡単な例を挙げよう。あるクラスにフィールドを導入したいとする。で、

 List<String> list = new 

と入力し、Ctrl+Spaceを打つ。その時Eclipseは何で補完をしようとするのか?Listインタフェースと、このフィールドが定義されているクラス名だ。あんまり賢くはないね、はぁ。


http://2.bp.blogspot.com/-pqbjDE-_Wt0/TgYdkg47ixI/AAAAAAAANhI/MpDU4RsiUW8/s1600/EclipseAutocomplete.png
[List実装クラスをnewする状況でListとMainを補完しようとするおちゃめなEclipseさん]


IntellliJでは、同じ事を入力してCtrl+Spaceを打つと、クラスパスに含まれるList実装クラス一覧がポップアップされる。また、Ctrl+Shift+Spaceではさらに賢くなり、好ましい選択肢としてArrayListを提案する。

http://4.bp.blogspot.com/-WaoeOVBO5II/TgYpoDY33RI/AAAAAAAANhQ/bbp3_L5pYoA/s1600/CtrlSpace.png
[List匿名クラスとList実装クラスが候補に上がっています]


http://1.bp.blogspot.com/-HZMKzIg8cEk/TgYpoVovZaI/AAAAAAAANhY/VMmQTUggzpg/s1600/CtrlShiftSpace.png

[ArryaListが候補に上がります。MapだとHashMapになります。]


他に私がIntelliJで発見した自動補完には、
smate type compilation(Ctrl+Shift+Space)を二回連続して実行すると、期待する型を返却するようなメソッドチェインをIntelliJが探しだす、というものがある。


http://4.bp.blogspot.com/-82RqCy4QiPg/TgZDIHWvXsI/AAAAAAAANhg/yJP2XHKQY98/s1600/CtrlShiftSpaceCtrlShiftSpace.png
[左辺の型(Owner)に合致するメソッドチェインも補完候補に上がります]

Live Templates

コードを自動補完とは別に、素早く書くための方法としてテンプレート[(雛形)]がある。ふつう、IDEはテンプレートを提供してくれるのだが、自分で新しいテンプレートを追加することもできる。IntelliJでどうやるか見てみよう。


Ctrl+Jを押すと、利用可能なテンプレート一覧がポップアップされ、テンプレート名でフィルターをかけることができる。なるほど、一覧にごく一部のテンプレートしか表示されていない場合、その一覧から正しいものを選ぶのは難しい。しかし、このように一覧中に候補が多すぎる場合、一覧をフィルタリングする別の手段を使うのがよい。


メソッド引数のnullチェックは極めてよくあることだ。これに対応するif文は、inn[if-not-null]テンプレートで生成される。エディタ上で"inn"とタイピングして、テンプレート展開用のキー(デフォルトではTABキー)を押せば、nullチェックif文が生成されるのだ。


http://3.bp.blogspot.com/-NDBuMsAC3e8/TgZJL26DtZI/AAAAAAAANho/K6TQugsBaYo/s1600/LiveTemplates-1.png

[if-not-nullテンプレートが展開されるので、チェック対象の変数を一覧から選択します。]


次のよくあるコード断片は、コレクション要素の走査処理だ。IntelliJは、さまざまなループ用途にイテレーションテンプレートをたくさん提供している。イテレーションテンプレートに共通する点は、それらが"it"[という接頭辞]で始まる点だ。すなわち、iter[Iterate Iterable]、itco[Iterate elements of java.util.Collection]、itar[Iterate elements of array]等だ*2。例えば、コレクションがあるとして、iterとタイプしてテンプレート展開用キーを押すと、コレクションを走査するforeachループが文脈に応じて生成される。


http://3.bp.blogspot.com/-uXKt8WsXYsc/TgZL52HnncI/AAAAAAAANhw/pRJXPfGxGJ4/s1600/LiveTemplates-2.png

[コレクションの総称型から要素の型を導出してくれています。]


また、文を囲む用途のテンプレートも、適用可能な状況であれば使うことができる。Ctrl+Alt+Tはトリックを行う。例として「検索処理をtry-catch節で囲みたいが、検索結果に対するループ処理を誤って先に生成してしまったケース」を挙げておく。


http://3.bp.blogspot.com/-cL3qXITpATA/TgZOu1U7qZI/AAAAAAAANh4/NJuEygnE7X0/s1600/LiveTemplates-3.png


他にも、デフォルトのEclipseを使うときにやっかいな思いをしてしまうテンプレートに、soutvというのがある。これはその場に応じた変数を表示するSystem.out.println(...)を生成してくれる。


http://4.bp.blogspot.com/-X8zg9BkGRng/TgZQkkUtjhI/AAAAAAAANiA/Sa-oWQXd0v0/s1600/LiveTemplates-4.png


テンプレートを編集したり作ったりするのはとても直感的で、ドキュメントも整備されている。普段、私は自分用のtry-catchテンプレートを定義している。というのも、デフォルトでは用意されていないからだ(これは奇妙なことだ)。


http://2.bp.blogspot.com/-kKsIXNaTzn8/TgZZDx7a7EI/AAAAAAAANiI/Z5JfYF0W94g/s1600/LiveTemplates-5.png

[try-catchのテンプレート定義です]


IntelliJでのテンプレート機能でユニークなのは、IDEの多彩な機能、例えばコード補完やその他の便利な機能を利用して、新しいテンプレートを定義できる点だ。

Refactoring

リファクタリングについては大部分を省略しようと思う。IDEで利用可能な膨大な量のリファクタリングを比較するのは正気の沙汰ではないからだ。簡単なリファクタリング「変数、メソッドその他の抽出」を取り上げて、ひとつだけ使いやすさの点について記しておく。


Eclipseでは、Alt+Shift+Lを押してリファクタリングを実行する前に、対象となるステートメント全体を選択しておく必要がある。(あるいは末尾にカーソルを置いておく必要がある)。そうでないと、Eclipseは「リファクタリング対象が選択されていなければなりません」というポップアップメッセージを出力し、開発者の望みを理解することを拒否する。


IntelliJは、文脈から判断してリファクタリングの選択肢を提示するので、少し賢いようだ。


http://3.bp.blogspot.com/-Fd6lW9EyQS0/TgZnBhNQ1nI/AAAAAAAANiQ/Ru9U7RQJmZ4/s1600/CtrlAltV.png

[文脈から、あり得る選択肢を提示してくれます。]


まだまだあるよ。チャンネルはそのまま :)

*1:[typingとtyingのダジャレです]

*2:iterは拡張for文を、itcoはイテレータを、itarはインデックスを使います