やはり俺の青春ラブテレはまちがっている。Scala編

# Ya-Hello, Live Template!!

IntelliJをお使いの皆さん、Live Template略してラブテレ！(~~無理矢理ェ~~)使っていますか？

いわゆるIDEのコード補完の機能ですが、普段の面倒な入力を一瞬で片付けてくれるすごいやつです。**楽して、美しいコードを書ける**のでぜひ使いこなしてみてください！この記事の最後で、すぐにScala開発で活用できる拡張ファイルもご用意しています！

ちなみにこの記事と俺ガイルは一切関係ありません。
が、僕は圧倒的に**いろはす派**です👍！

## つまりどういう機能だってばよ

つまりはこんなことができる機能です。
![画面収録 2020-03-21 18.33.09.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566209/0f8d85b9-b40d-ca33-571d-83c58f1019f4.gif)

これはIntelliJ標準で設定されているライブテンプレートで、すぐに皆さんの環境で試すことができます。`todo`と入力して`tab`を押すとコメントアウトとTODOの文字列が展開され、すぐにコメントを打ち込めるわけですね。

ライブテンプレートは標準のものだけでなく、自身でオリジナルテンプレートを設定することができます。どんなことが便利になるのかのイメージがつくように、僕の普段の開発言語であるScalaの設定をいくつかご紹介します。

## 基礎編 - 入力を1文字で済ませる

### valやdefを1文字で書く
ライブテンプレートで設定する狙い目は当然、`普段よく書くこと`です。
例えば`val`や`def`は普段から何百回と書いているのではないでしょうか？

ライブテンプレートを設定すればこんな風に書くことができます。
`v` + `tab` => `val 変数名 = 値`
`d` + `tab` => `def 関数名(引数): 返り値 = {}`
![val編.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566209/246db456-4a55-5653-de16-0f9cb3aa3121.gif)

### 型入力を1文字で済ませる
型定義を都度要求するScalaでは何度も`String`や`Long`を入力します。
そんな型をこのように登録します。
`S` + `tab` => `String`
`I` + `tab` => `Int`
`L` + `tab` => `Long`
`O` + `tab` => `Option[]`
![型編.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566209/dd548c6f-6738-fe71-4151-2852dfd6db8b.gif)


## 応用編 - TDDで真価を発揮するラブテレ

僕の開発チームはTDDを積極的に実践しています。
つまり開発がある限り、毎週テストは必ずやってきてその多くは**パターン化できる**のです。

### FunSpec系の場合

`dr` + `tab` => describe展開
`it` + `tab` => it展開 + 期待値の入力
`mb` + `tab` => `mustBe expect`

![FunSpec.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566209/d1e0e447-2826-4a98-d79f-48946d4db890.gif)


### WordSpec系の場合

`wst` + `tab` => テストケース展開 + 期待値の入力
`mb` + `tab` => `mustBe expect`

![WordSpec.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566209/ee14baa7-97a3-99ef-0d36-0459e1526996.gif)

ちなみにWordSpec系の場合、

ライブテンプレートを使わなかった場合の入力時間：**約90秒**
ラブテンプレートを使った場合の入力時間：**約30秒**

####67%も速くなった!!!!!!

普通に打つと`must()`とか出てくる括弧を消さなくてよくなったりするので、冗談抜きに速くなります！

## 「タイピング速いから俺関係ないし」　と、思うじゃん？

タイピングがお世辞にも速くない僕は、最初はスピードアップが目的でした。
でも使ってる中でわかったのは、**IntelliJが僕の集中スイッチを入れてくれる**効果もあるということです。

コーディング中は無意識にいろんなことを考えていて、意外と集中できてない状態です。
でもライブテンプレートで`v`と打った時、サジェストされることで**「変数名をつけること」**に頭のスイッチが切り替わります。

コーディング中に真に頭を使うべきは以下のようなことだと思います。

- やりたいことを端的に表す関数名って何だろう？
- どんなテストケースなら次見た人が理解しやすいだろう？

DBfluteの久保さんの記事でも紹介されていますが、**頭のCPUはなるべく節約して、集中すべき時はIntelliJにスイッチを入れてもらう**とコーディングはもっと楽しくなると思います！

[[意外と忘れがちな優秀なプログラマーになるための10のコツ]](https://jflute.hatenadiary.jp/entry/20170924/forsuper)

では最後に、オリジナルテンプレートの設定方法もご紹介しておきますね！

## オリジナルテンプレートの設定方法

IntelliJの画面から`Preferences` -> `Editor` -> `Live Templates`と進みます。
ここに全てのライブテンプレートの設定が言語ごとにまとまっています。

<img width="740" alt="スクリーンショット 2020-03-21 18.45.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566209/efb60565-646b-33a1-41fa-c0f49cdacda3.png">


手順としては、

1. テンプレートを使いたい言語のグループを選択
2. 右端の`+`ボタンを押す
3. `1.Live Template`を選択
4. 必要項目を入力
5. `Apply` or `OK`で登録完了

必要項目は主にこの5つです。

`Abbreviation` : 補完するためのキーワード
`Description`  : このテンプレートの説明文
`Template text` : キーワード + `tab`で展開したいテンプレート
`Define` : どの言語の時にこのテンプレートを有効にするのか？
`Reformat according to style` : 展開後にフォーマッタをかけるかどうか？

`Template text`の中では`$NAME$`のように`$`で囲むことで変数化し、展開後に文字列を入力できるように設定できます。`$END$`を入れると展開後にカーソルがその部分に移動します。

なお、展開する時に`tab`以外でもこの画面の`Expand with`で設定できますよ！

## まとめ

いかがでしたでしょうか？
「ライブテンプレート楽しそうじゃん！」と思っていただいた方のために、今回紹介したテンプレートを共有できるファイルもご用意しました！xmlファイルを所定のディレクトリに配置することで共有できる仕組みのようです。

▽下記のGithubからダウンロード
[Scala_Templates.xml](https://github.com/masayaO/livetemplates)



お使いのIntelliJが2019.3のバージョンならダウンロードして下記の配下において再起動するだけで完了できます！使いにくい場合はチェックを外せばOFFにできます。簡単!
`~/Library/Preferences/IntelliJIdea2019.3/templates/`

## 参考文献
- [統計をとって高速化する Scala開発](https://www.slideshare.net/mitsukioga/scala-38854156)