【Eclipse】QuickFixを使って流れるようなコーディング

#はじめに
- 本記事は [Develop fun!を体現する Works Human Intelligence Advent Calendar 2020](https://qiita.com/advent-calendar/2020/whi) の18日目の記事です。
- 筆者の初めてのQiita記事になります。よろしくお願いします!

#背景
- 最近弊社ではt_wadaさんに講演して頂いたり、皆で[t_wadaさんのライブコーディング動画](https://www.youtube.com/watch?v=Q-FJ3XmFlT8)を視聴しTDDの考え方やユニットテストをキャッチアップしていく機会が増えました。(個人的にあまりやって来なかったので良い機会)
- その[ライブコーディング動画](https://www.youtube.com/watch?v=Q-FJ3XmFlT8)でt_wadaさんのコーディング見てると、普段自分がEclipseを使ってJavaでコーディングしてるときより「**あれ？なんか流れがスムーズだな**」と思った点があったので、それをきっかけに「もっと流れよくコーディングしたい」なぁと思い、自分が普段使うEclipseのショートカットと組み合わせてこうすれば自分なりにスムーズだと思う方法をメモがてらまとめようと思います
    - (流れよくとはなんぞやという感じもありますが。。手数少なくってイメージかな)

#何ができるの？
- Eclipseのショートカット、おもに**QuickFix(ctrl+1)**を使ってスムーズ(少し手数少なく)にコーディングができるようになる

#題材とするコード
[TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング](https://www.youtube.com/watch?v=Q-FJ3XmFlT8)で取り上げられている、FizzBuzz問題のコードです。

このコードをライブコーディング動画ではテスト駆動で実装していきます。
(以下は、動画で実装途中のコードを引用しているので完全なロジックではないです)

```java:プロダクトコード
public class FizzBuzz {

	public String convert(int i) {
		//ここにfizbuzzのロジックを実装していく
		return "1"; 
	}

}
```

```java:テストコード
public class FizzBuzzTest {

	@Test
	public void _1を渡すと文字列1を返す() throws Exception {
		//準備
		FizzBuzz fizzbuzz = new FizzBuzz();
		//実行
		String actual = fizzbuzz.convert(1); 
		//検証
		assertEquals("1", actual);
	}
}
```

# いつもの自分の手順
まぁ、テスト駆動開発で普段開発していないので、プロダクトコード(ここでは`FizzBuzz`クラス)から実装していきます。

##  プロダクトコード(FizzBuzzクラス)の実装
- 「Package Exproler」にてパッケージを選択して(なければ作って) `Ctrl+n`で新規作成ウィザードを開く
    - wizardsに`class`と入力し新規クラス入力ウインドウを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/30e56c76-2c00-cdb1-50bd-0fd97c72632c.png)
    
- クラス名を考えてName欄にクラス名を入力しクラスの枠を生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/b80d758b-d885-6daa-f687-d5f30b0bf82c.png)

   
- メソッドを実装していく
    - 「public int convert(int val) { ...」みたいに全部タイプしていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/02590a09-8a20-0165-e8b4-89896fe9650f.png)



普通といえば普通の手順だと思いますが、こんな流れで、普段はここで`convert`メソッドのロジックをある程度作り込んだあとに、テストコードを実装します。

## テストコード(FizzBuzzTestクラス)の実装
Eclipseプラグインの`Quick JUnit`が普段入っているので、以下の手順になります。

- プロダクトコードを開いている状態で `ctrl + 9` でテスティングペアを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/732637d5-c503-3829-4a8e-437106755861.png)

- テストクラス名がプロダクトコードのクラス名にサフィックスでTestが自動でつきます
    - (こういうルール付された自動生成は便利ですよね)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/3420b1e6-dac8-0c03-8456-c0d7b9d85614.png)

- 生成されたクラスは失敗するテストメソッドが一つあるので、適宜編集してテストコードを実装していきます
    - 「public void  _1を渡すと文字列1を返す()...」とタイプしていく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/6cabe256-297c-3e11-3267-3ec8d60ac674.png)

### テストコードの中身の実装
- 事前準備→実行→検証のコードを順に実装する
    - (普段はこういう手順ですが、検証コードから先に**逆順**で実装することを、動画の[この部分](https://youtu.be/Q-FJ3XmFlT8?t=3987)で説明されています)

- プロダクトコード(FizzBuzzクラス)のインスタンスをnewする
    - FizzBuzzクラスは作成済みなので`ctrl + space`の入力補完で入力していく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/b216ac82-fef8-4f9d-b012-8b2ff0c47b9f.png)

- 検証したいメソッドを呼び出す
    - 「String actual = ..」とタイプしていく
    - convertメソッドの呼び出しは`ctrl+space`で入力補完
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/02958371-55ff-fc09-f1ea-6cf35a62ad93.png)

- 検証コードを書く
    - 「assertEqu..」を`ctrl+space`で入力補完
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/bf82a73e-b066-b437-63ca-4bb8f7024b20.png)


こんな流れで、普段は実装しています。
この手順も別に悪いわけではないし、とても面倒とかそういわけでは無いし、入力補完などは十分便利なのですが、ライブコーディング動画の中ではもっとIDEの機能を活用して手数少なくコーディングしていたので、その手順を紹介したいと思います。

# ライブコーディング動画の中での手順

## TODOリストを作成する
詳細は動画の[このあたり](https://youtu.be/Q-FJ3XmFlT8?t=3460)。

本記事ではEclipseの使い方にフォーカスしているので、テスト駆動の詳細にはふれられません(てか自分もキャッチアップ中)が、動画が本当におすすめなので、まだ観てない人はぜひ見てみてください。

## テストコード(FizzBuzzTestクラス)の実装
- 「Package Exproler」にてパッケージを選択して(なければ作って) `Ctrl+n`で新規作成ウィザードを開く
    - wizardsに`junit`と入力し新規jUnitテストケース作成ウィザードを開く
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/30bd93c1-2982-556d-9555-cfa3ce1feb0d.png)

- クラス名を考えてName欄にクラス名を入力しクラスの枠を生成
    - (この辺りは普段の自分の手順と大きくは変わらないですね、変わるのはテストケースから作るという点。大きな違いかもですが。。)
    - (プロダクトコードのクラス名もこの時点で考える必要がありますね、テスティングペアの名前に規則があるので)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/9176816f-fe1d-1232-a77d-93484784988b.png)

### TODOリストにある機能仕様を検証するテストメソッドの実装
 - 動画では検証→実行→準備の順に実装をしていきます
 - 「assertEqu..」を入力し`ctrl+space`で入力補完
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/a5212977-e147-b777-919d-81cf0efdc888.png)

以下からは動画の[ここら](https://youtu.be/Q-FJ3XmFlT8?t=4382)辺りから

- `actual`がエラーになっているのでフォーカスをあてて`ctrl+1`でQuickFix
    - (フォーカス当てるのは`ctrl+.`や`ctrl+,`でもできます)
    - 「Create local variable `actual`」でローカル変数を自動生成
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/b523998d-12ec-7700-5653-09e343405042.png)

- ローカル変数の型をStringに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/ed710b48-49ec-ded2-b24e-92dc28b2feb0.png)

- まだコンパイルエラーになるのでもうっかい`ctrl+1`でQuickFix
    - 「Initialize variable」で変数を初期化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/48e8c8f0-5e55-6abc-d7dc-d316a85f1c52.png)

- 一番上に来ちゃうので`alt + ↓`で行ごと移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/f13bb85d-9b41-2435-8aae-1563721ccd52.png)

### 「プロダクトコードの実行(呼び出し)」を実装
- (ここが個人的には印象深く、まだ実装してないコードを**使う側から先に書いちゃうんだ？**と思いました)
    - 使う側から先に書くことで使いやすさを意識されたコードになるとのことです

- 当然コンパイルエラーになるので`ctrl+1`でQuickFix
    - 「Create local variable `fizzBuzz`」でローカル変数を自動生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/f2a1265a-18ad-6b69-8d75-e4b18bb6b4e9.png)

## プロダクトコード(FizzBuzzクラス)の実装
- ローカル変数の型を「FizzBuzz」に変更
    - FizzBuzzクラスもこの時点では存在しません。
- 当然コンパイルエラーになるので`ctrl+1`でQuickFix
    - 「Create class `FizzBuzz`」でクラスを自動生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/d6ba80bb-eb25-97b7-c590-34fba81dde76.png)

- FizzBuzzクラスには`convert`メソッドがまだなくコンパイルエラーになるので`ctrl+1`でQuickFix
    - 「Create method `convert(int)` in type `FizzBuzz`」でメソッドを自動生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/9cec3da4-c50d-983c-9859-d30413136a2c.png)

- 生成後はこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/f96e60e3-33ce-41c7-1f46-67e9199ffeec.png)


- まだコンパイルエラーが残っているので更に`ctrl+1`でQuickFix
    - 「Initialize variable」を選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/9ef04609-4224-29c1-a5ea-7cccc8d43bf4.png)

- 初期化で「new FizzBuzz()」を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86548/33ffd218-d916-9b77-b409-3fc01cdc5588.png)

動画ではざっと、こんな流れでコーディングされていました。

私自身は普段のコーディングの順番やEclipseの操作と結構違う点もあったので、**おお！**と思いました。


# まとめ
1. **QuickFix(ctrl+1)**を多様しできるだけEclispeに自動生成させると手数が少なくなる
    2. 先にコンパイルエラーになるコード(使う側で存在しないクラスやメソッド)を書いてQuickFixで自動生成
2. 使う側から考えるので使いやすいコードを考えることになる
    3. 本記事の趣旨とはズレますが、テスト駆動のメリットとして動画では印象深く紹介されてたので。ここでも上げて起きます。
    4. (使う側からコードを書くので、QuickFixがより活きてくるのかもしれないなと思っています)

本質的には**2**が大事だと思いますが、個人的にはコーディングしていて楽しい気持ちになるので、**1**も大事だと思っています。
(サクサクとコードが書かれていくのは、なんか楽しい気持ちになるので、大事)

今回記事を書くにあたり何回か自分で動画の手順でコーディングしてみましたが、**QuickFix(ctrl+1)**は本当に便利で、これを覚える色々ケースで役に立ちそうだと思いました。
(変数リネームやインライン化など、コンパイルエラーになっていない部分でQuickFix開いても、色々できるみたいです)


# おわりに
もう少し書こうと思ってた内容もありましたが、時間切れなのでこれで終わりにしたいと思います。

個人的には初めての投稿で、書いていて色々手が止まるところがあったので、
「量が質に転化する」のを目指して、来年は継続的に投稿できるようにしていきたいです。

あと、t_wadaさんのライブコーディング動画はとても参考になりました。(無料で見れてとてもありがたい)
色々な人のライブコーディング動画を見て、コーディングの順番とかIDEの使い方とか比較しても楽しいかもしれないですね！


# 参考
[TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング](https://www.youtube.com/watch?v=Q-FJ3XmFlT8)
[eclipseでよく使うショートカット](https://qiita.com/ynxx/items/7734dfb755bc83373d7c)
[Eclipse + Quick JUnit Plugin ショートカット一覧メモ](https://eclipse-cheatsheet.readthedocs.io/en/latest/eclipse-cheatsheet-windows.html)

最近はIntelliJも使うので、EclipseとIntelliJのショートカットの対応を確認するのに以下が役立ちました。
IntelliJ使いの方は以下を参考にすると、同じような手順でコーディングができる(かもしれません)
[Eclipse から IntelliJ IDEA に移行する - ショートカット](https://pleiades.io/help/idea/migrating-from-eclipse-to-intellij-idea.html#Shortcuts)

# おまけ 
## 個人的よく使うEclipseショートカット
ctrl + space : 入力補完
ctrl + . : エラーの箇所にジャンプ（下方向）
ctrl + 9 : テスティングペアに移動(なければ作成)
ctrl + 0 : ユニットテスト実行
ctrl + 1 : エラー箇所でのQuickFix
ctrl + t : 型階層の表示
ctrl + o : メソッド/メンバー変数を検索

## 今後使ってみたいEclipseショートカット
ctrl + , : エラーの箇所にジャンプ（上方向）
Alt + ↑ または ↓ : 行単位の移動
ctrl + 3 : クイックアクセス
ctrl + shift + T : リファクタリングメニュー
ctrl + 1 : エラーではない箇所でのQuickFix、リファクができる.「inline local variable」が選べる。てかrenameとかも選べる。