EclipseでJavaソースコードを読む技術

## はじめに

プロジェクト内の他のメンバーが書いたソースコードを読んだり、利用しているフレームワークの調査のためソースコードを読んだり、色々な場面でソースコードを読む機会があります。

そういったときになるべく素早く読み進めるためにはIDEの機能を利用したり、当たりをつけるセンスを高めたり、キーボード操作が速くなるよう訓練したり、いくつかのアプローチが考えられます。

本稿ではそれらのアプローチの中からIDEの機能を利用することにフォーカスして、言語はJava・IDEはEclipseを使った場合にソースコードを読むのに役立つ機能を紹介します。

## EclipseでJavaのソースコードを読む

分かりやすさのため、いつくかスクリーンショットを掲載していますが、そこに写っているソースコードは[Doma](https://github.com/domaframework/doma)というデータベースアクセスライブラリのものです。（完全に私の趣味です）

また、私の体はEclipseに呪われているのでEclipseの機能について書きますが、他のIDEでも似たようなものはあると思います。ですので、他のIDEをお使いの方は「このIDEならこうすればいいよ」という記事を書いて貰えると嬉しいです。

### 定義へジャンプ

まずは基本的なところから。ソースコードを読んでいてメソッド呼び出しをしているコードからそのメソッドを定義している箇所へジャンプしたいときは、メソッド呼び出しをしているコードにカーソルを当てて`F3`を押します。

1. カーソルを当てて<br><img width="212" alt="スクリーンショット 2017-12-09 12.18.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/029b3929-3386-a774-448f-3174aad83b85.png">
2. `F3`を押す<br><img width="374" alt="スクリーンショット 2017-12-09 12.18.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/d7bc5f85-f586-d8b7-5849-b819cfd1ddfc.png">

特定の処理を頭から読んでいくとメソッド定義へジャンプすることがとても多いのでよく使う機能だと思います。

### インターフェースの実装クラスのメソッド定義へジャンプ

`F3`でメソッド定義へジャンプすると、その先がインターフェースで実装がない場合があります。

1. `F3`でメソッドの定義へジャンプすると……<br><img width="372" alt="スクリーンショット 2017-12-09 13.20.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/50f5e84c-ca74-5f22-7c85-d4e9f1973611.png">
2. インターフェースで実装がない！<br><img width="194" alt="スクリーンショット 2017-12-09 13.20.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/2810c866-6505-80af-60c0-08fbd644155d.png">

そういった場合はメソッド呼び出しコードにカーソルを当てて`Command + T`を押します。すると、そのメソッドを実装しているクラスの一覧が表示されるので、これだ！と思うクラスを選択してメソッドの定義へジャンプします。

1. メソッド呼び出しコードにカーソルを当てて<br><img width="372" alt="スクリーンショット 2017-12-09 13.20.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/50f5e84c-ca74-5f22-7c85-d4e9f1973611.png">
2. `Command + T`を押す<br><img width="415" alt="スクリーンショット 2017-12-09 13.21.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/3fabe6c7-6855-064d-a8df-a29d31367f66.png">
3. 実装クラスを選択するとメソッド定義にジャンプできる<br><img width="239" alt="スクリーンショット 2017-12-09 13.21.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/983b8677-bc3e-a1f0-4e61-3acb34d8479b.png">

この例では1つのクラスしか表示されていませんが、場合によっては多くの実装クラスが表示されます。その中から、これだ！と思えるクラスを選択するのは知識やセンスが必要になりますが、それらを鍛えるのはまた別の話なので省略します。

### メソッドの呼び出し箇所を検索する

仕様変更の影響調査などで、あるメソッドがどこから呼ばれているのか知りたい、といったことがあると思います。その場合、調査対象のメソッド定義にカーソルを当てて`Control + alt + H`を押します。すると、そのメソッドを呼び出している箇所の一覧が表示されます。

<img width="597" alt="スクリーンショット 2017-12-09 13.23.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/60c81736-ad13-61fe-591a-40b9ac440bd4.png">

呼び出し箇所の一覧の各項目の左にある三角のマークを押すと、さらにそのメソッドの呼び出し箇所が一覧表示されます。

<img width="585" alt="スクリーンショット 2017-12-09 14.23.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/02ef3d9f-8e97-ce4f-ba44-314c7ad300c5.png">

そうやってどんどん呼び出し階層を遡って行けます。

### クラスの参照箇所を検索する

クラスにカーソルを当てて`Command + Shift + G`を押します。すると、そのクラスを参照している箇所が一覧表示されます。

<img width="363" alt="スクリーンショット 2017-12-09 14.30.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/19129/52f1da84-db14-3934-fce6-354f24aeafb5.png">

フィールドとしてそのクラスを参照している場合はフィールド名が、引数・ローカル変数として参照している場合はコンストラクタ名やメソッド名が検索結果に表示されます。

この機能は、私はSpring Bootなど、それなりの大きさのフレームワークを読む時に必要になりました。

### 他によく使う検索機能

これら以外でよく使うのは型の検索とリソースの検索です。

* `Command + Shift + T`で型の検索(JARの中まで検索してくれる)
* `Command + Shift + R`でリソースの検索(JARの中までは検索してくれない)

私の場合、これらはソースコードを読んでいる途中よりは、ソースコードを書いているときによく使っているように思います。

## Eclipse以外のツール

Eclipse以外にもソースコードを読むのに役立てているツールはあります。ここではおまけ程度に簡単な紹介に留めます。

### Git

`git grep`と`git ls-files`をよく使います。`git grep`では`-i`オプションや`--name-only`オプションを併用することも多いです。

Spring Frameworkなど、検索のためにEclipseにインポートするには大きいプロジェクトは`git grep`することが多いです。

### unite.vim

unite.vimはファイルやバッファなど、様々なものをデータソースとして検索ができるVimプラグインです。ものすごく便利なのですが、会社のPCで動かなくてちょっと困っています。なんとかせねば……

ちなみにunite.vimはメンテナンスモードに入っており、後継は[denite.nvim](https://github.com/Shougo/denite.nvim)だそうです。乗り換えねば……

## おわりに

JavaとEclipseを題材にしてソースコードを読むのに役立つ機能を紹介しましたがいかがでしたか？　先に述べたように他のIDEでも似たような機能(あるいはもっと便利な機能)はあると思いますので、お使いのIDEのマニュアルを調べたり回りの識者に質問してみてください。

今回は具体的にEclipseの機能を書きましたが、ソースコードを読むということに対するマインドな部分や、ソースコードを素早く読むためにできる他のアプローチについても別の機会に発表できたらいいなと思っています。

それではみなさん、良いソースコードリーディングライフを！