07.IDE を使った Scala プログラミング　 Scala基礎コース

# 目次

* 【講義】IDE とは
* 【実習】IntelliJ IDEA CE のインストール
* 【実習】Scala プラグインのインストール
* 【実習】IDE で作るプロジェクト
* 【実習】IDE を利用した開発
* 【実習】ブレークポイント機能
* 【実習】リファクタリング機能
* 【講義】IntelliJ IDEA のその他の機能

# 【講義】IDE とは

ここまで Scala でのアプリケーションの作成方法を学んできた。
ビルド用の設定ファイルを作成したり、フォルダ階層を作成することがだんだん複雑になってきたのではないだろうか。

Scala ではアプリケーションを作成するために、コンパイルしてビルドしなくてはならないため、設定などが複雑になりやすいという問題がある。

今回は、 IDE 等ソフトウェアを使えるようになる。
IDE を使うことでビルド用の設定を毎回しなくても良くなったり、また、 GUI を使って開発やデバッグのための便利な機能を利用できるようになる。

**IDE** とは、英語で Integrated Development Environment で、日本語に訳すと統合開発環境。
統合開発環境にはエディタはもちろんのこと、ビルドシステムや、デバッグ環境などの機能が内蔵されている。

もちろん VS Code のようなエディタだけを利用した開発も可能。
ただ Scala は静的型付け言語ということもあり、コンパイルでチェックできることが多くなる。
そのため IDE を利用すると自動的にファイルの構成を変更したりするということが、機械的で安全に行いやすいというメリットがある。

そのため多くの開発者が IDE を利用して Scala の開発をしている。

Scala が利用できる IDE にも様々なものがあるが、ここでは [IntelliJ IDEA](https://www.jetbrains.com/idea/) と Scala プラグインを利用した開発を紹介する。
なお、 IntelliJ IDEA は「インテリジェイ・アイデア」と読む。

IntelliJ IDEA は、 [JetBrains 社](https://www.jetbrains.com/) が開発している IDE 。
Java 用の IDE として根強い人気を誇っている。
雄郎で多機能な Ultimate Edition とオープンソースで無料の Community Edition がある。

Community Edition であっても Scala プラグインをインストールして、 Scala の開発をできるため、ここでは、 Community Edition を利用していく。

# 【実習】IntelliJ IDEA CE のインストール

スキップする

# 【実習】Scala プラグインのインストール

スキップする

# 【実習】IDE で作るプロジェクト

ここからプロジェクトを作成していく。
「 Welcome to IntelliJ IDEA 」ダイアログが表示されているところで、 New Project を選択する。

無事 Scala プラグりんがインストールされていれば、左側のリストの選択項目の中に Scala が存在するので、 Scala を選択した後、右側のリストの sbt を選択して Next をクリックしよう。

プロジェクトの詳細を決めるダイアログが表示される。

| 設定項目 | 設定内容 |
|:-:|:-:|
| Name | idea-study |
|  Location	| 上の項目の Name を入力すると自動的に設定されます。 `~/IdeaProjdects/idea-study`　|
| JDK | 以前インストールした JDK のフォルダを選択します。選択肢になければ、Add から追加します。 `/Library/Java/JavaVirtualMachines/jdk-11.0.2.jdk/Contents/Home/` できるだけ最新のものを利用しましょう。 |
| sbt | 1.2.6 （選択肢にない場合は、最新のものを使いましょう） |
| Scala | 2.12.7 |

以上で、その他のチェックボックスはすべてデフォルトの設定で、 Finish ボタンをクリックする。

するとプロジェクトが作られ始める。
プロジェクトの作成は、 IDE がバックグラウンドで sbt を利用して様々なモジュールのダウンロードを行っている。
完成には 10 分程かかることがある。

またその進行状況は、ウィンドウの右下で表示されるので、気長に待とう。

その間に、 IntelliJ IDEA の説明をする。

まず最初に、「 Tip of the Day 」と書かれたダイアログが表示される。

これは今日の豆知識のようなもので、 IDEA の利用方法などを教えてくれる。
せっかくなので、 Next Tip ボタンをクリックして、どのような活用法があるのか見てみよう。

英語で分からないときには、 Google 翻訳などの Web 翻訳を活用しながら意味を理解してみよう。

何個か使い方を確認したら Close ボタンを選択する。

最初の画面のエディタの灰色の背景のところに大きく

```
Go to File Ctrl + Shift + N
Resent Files Ctrl + E
Navigateion Bar Alt + Home
Drop files here to open
Search Everywhere Double ⇧
Go to File ⇧⌘O
Resent Files  ⌘E
Navigateion Bar  ⌘↑
Drop files here to open
```

と書いてあるのではないだろうか。
これは、オブジェクト、クラス なんであっても Shift を 2 回押すと検索できる機能や、ファイルを見つける機能、最近開いたファイルを見つける機能、ナビゲーションバーを表示する機能のショートカットが紹介されている。

試しに、 Shift を 2 度押し String と入力して、サジェストから出てきた String.java を選択してみよう。
表示されないがタブは見える場合、「 Files 」タブを選択すると表示されるはず。

Java API における String という型のソースコードが中央の表示エリアに表示されるだろう。

このように IDEA では、実装をしながら気になった型の定義などをいつでも検索できる。
この Shift を 2 回押す検索機能は、今後よく使うので覚えておこう。

この IDEA はツールウィンドウと呼ばれる複数のウィンドウを使い分けながらソフトウェアを開発する。
一番左下にある、四角が 2 枚かさなっているようなアイコンをクリックするか、カーソルを合わせてみよう。
すると利用できるツールウィンドウのリストが表示される。

デフォルトでは、左側に Project というプロジェクトフォルダの中身が表示されるツールウィンドウが表示されている。
ここで、 Structure を選択してみよう。
すると、先ほど表示していた String という型が持っていたすべてのメソッドやフィールドと呼ばれる変数が表示されている。

このように、 Structure は型の定義の概要を知るのに非常に便利な機能。

さて、ここまでやってみたところで、 sbt のビルドが終わっただろうか。
IDA の右下でインジゲーターなどが表示されていなければ完了している。

# 【実習】IDE を利用した開発

今度は、 Project のツールウィンドウで、 `idea-study` フォルダを選択して開いてみよう。
フォルダはツリー状の UI で表現されている。

`idea-study` 以下には、 sbt プロジェクトを作成するのに必要なファイルやフォルダが自動的に作成されている。

自動的に作成されたものは、 `project` フォルダ、 `src` フォルダ、 `build.sbt` など。

では、早速簡単なプログラムを実装してみよう。

`src/main/scala` フォルダを選択しよう。
このフォルダには、 Scala で書かれたソースコードが含まれるようにする。

`scala` を選択した状態で、右クリックから New > Scala Class を選択する。

「 Create New Scala Class 」ダイアログにて Name を `Main` 、 Kind を `Object` として、 Enter キーを押す。

すると、 `src/main/scala/Main.scala` ができる。
内容は、

```scala:src/main/scala/Main.scala
object Main {

}
```

以上のようになっている。
Main 等オブジェクトを定義するコードが作成されている。
このように Scala では、 GUI を操作することでコードのテンプレートを作成できる。

次に Main オブジェクトに、 App トレイトをミックスインするように実装してみよう。

```scala:src/main/scala/Main.scala
object Main extends App {

}
```

VS Code と違って入力時に、様々なコード補間のアシスト画面が表示されたのではないだろうか。

そして App と書いた部分に、 Command キーを押しながらクリックしてみよう。

するとエディタにてタブが新たに開き、

```scala
trait App extends DelayedInit {
```

と書かれた Scala の App の定義のコードにジャンプできるのではないだろうか。

このように、 IDE では利用している型や変数や関数などの定義を簡単に見られる機能が備わっている。

なおショートカットで、 Command + b で定義にジャンプすることもできる。

タブを Main.scala に戻して、今度は以下のようにコードを書いてみよう。

```scala:src/main/scala/Main.scala
object Main extends App {
  val a = 2
  val b = 3
  println(s"答えは${a * b}")
}
```

定数 a と変数 b を宣言して、「答えは ${ a と b をかけた数} 」と出力している。
これを実行してみよう。

Main.scala のタブのエディタ内で右クリックをして、 Run 'Main' を選択しよう。
これで、ビルドと実行が行われる。

すると、 IDEA の画面の下半分に Run という名前のツールウィンドウが表示された、

```:Run
/Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/bin/java ...
答えは6

Process finished with exit code 0
```

と表示されたのではないだろうか。

このように IDE では実行とビルドも IDE 内で行って開発を行っていく。

そして今度は、エディタ内の右クリックから、 Scala REPL... を選択してみよう。
今度は、 Run というツールウィンドウ内に REPL が表示される。

```scala:Run_REPL
Welcome to Scala 2.12.7 (OpenJDK 64-Bit Server VM, Java 1.8.0_292).
Type in expressions for evaluation. Or try :help.

scala> 
```

さらにここで `Main.a` と入力して、 Command + Enter を入力してみよう。
すると、入力された式が評価されて、

```scala:Run_REPL
scala> Main.a
res1: Int = 0
```

のように表示され、 REPL も IDEA を利用して使うことができる。
また気づいたかもしれないが、 REPL で記述する際にも、コード補完を利用できる。

なおこの REPL は、 Run ツールウィンドウの Scala Console タブ内の左側の赤い四角のアイコンをクリックすることで終了させることができるので、終了させておこう。

なお、先ほどのコードの `App` の部分をわざと `Ap` にしてコンパイルエラーが起こるようにしてみよう。

```scala:src/main/scala/Main.scala
object Main extends Ap {
  val a = 2
  val b = 3
  println(s"答えは${a * b}")
}
```

すると、 `Ap` が赤く表示され、エディタの右側のスクロールバーのところに赤いラインが現れる。
その上にカーソルを合わせてツールチップを表示させると、

```
Cannot resolve symbol Ap
```

と表示されるのではないだろうか。
これは Ap というシンボルが解決できないという意味。
IDE では、編集をするたびに常にその内容がコンパイル可能かどうかをチェックしてくれる。
そのため、より安全にソースコードを編集できる。

確認したら、 `Ap` は `App` に戻しておこう。

# 【実習】ブレークポイント機能

IDEA は開発の他にもデバッグに関しても高度な機能を提供してくれる。
今度は、 **プレークポイント** という機能を試してみよう。

先ほど書いたコードを表示させているエディタの、

```scala
val a = 2
```

の左側のエリアをクリックして、赤い丸のアイコンが表示されるようにしよう。

この赤い丸は、プレークポイントを設定しているという目印になる。
ブレークポイントとは、プログラムの動作をそこで一時停止させるポイント。

そして、右クリックから Debug `Main` というメニューを選択する。

するとコードが実行されて、先ほどの `val a = 2` のところで、実行が止まる。

またこのタイミングで IDEA の下側には Debug ツールウィンドウが表示される。
このプログラムが止まっている時に、 Debugger と書いてある行のツールチップで「 Step Over 」と書かれているボタンを押すことで、 1 行ずつ処理を進めることができる。

このように 1 行 1 行しょりを進めることをステップ実行という。

一行進めると、 Variables という変数一覧が表示されるエリアに

```
a = 2
```

と表示されて、

```scala
val b = 3
```

の行に実行が移ったことが分かる。
更にもう一度 Step Over ボタンをクリックしよう。
すると、 Variables には、

```
a = 2
b = 3
```

と表示されて、実行された行が

```scala
  println(s"答えは${a * b}")
```

こちらに移動したのではないだろうか。

このように IDEA ではプレークポイントを使ったデバッグ機能を使うことで、ソースコードがどのように動いているのか一行一行確かめることができる。

最後に、このブレークポイントで止めているモードを抜けるために、左側の緑色の三角形の「 Resume Program 」とツールチップの出るボタンをクリックする。
これでステップ実行が終了して、プログラムがそのまま実行される。

なおコンソール出力の結果は、 Debugger タブの隣の Console タブに表示される。

ブレークポイントを取り除くためには、

```scala
  val a = 2
```

の左側にある赤い丸をもう一度クリックする必要がある。
クリックして取り除いておこう。

# 【実習】リファクタリング機能

IDE が持っている機能をもう1つ紹介する。
それは **リファクタリング機能** 。

例えば、特定の処理に対して意味づけをして、それをメソッドに切り出したいということがあるだろう。
IDEA はそのような処理を自動でやってくれる。

```scala
  println(s"答えは${a * b}")
```

以上の行を選択した状態で、右クリック、 Refactor の Extract Method... を選択しよう。

これは、選択した処理をメソッドに切り出すリファクタリング。

「 Extract Method 」ダイアログにて Method Name を、 printMulti と入力しよう。
そして OK ボタンをクリックする。
すると、自動的にリファクタリングがなされて、以下のようなコードになる。

```scala:src/main/scala/Main.scala
object Main extends App {
  val a = 2
  val b = 3
  printMulti

  private def printMulti = {
    println(s"答えは${a * b}")
  }
}
```

このようなメソッドへの切り出しだけではなく、クラスや定数、関数名などの変更も自動的に全て行ってくれる。
そちらもやってみよう。

今度は `val b = 3` という記述の b という定数だけを選択して、右クリック、 Refactor の Rename... を選択しよう。

b が編集できる状態になるので、バックスペースで 1 文字消して、 z に変更してみよう。
すると他の変数のも自動的に整合性が合うように編集され、以下のようになる。

```scala:src/main/scala/Main.scala
object Main extends App {
  val a = 2
  val z = 3
  printMulti

  private def printMulti = {
    println(s"答えは${a * z}")
  }
}
```

きちんと定数 z の宣言だけでなく、 println 関数の引数の部分でも変更が行われていることが分かる。

これが IDE によるリファクタリング。
Scala は静的型付き言語なので、単純な変数名という文字列が置換されるのではなく、コンパイル時にきちんと Scala のコードで変数として扱われている部分だけが置換されるようにリファクタリングされる。

この機能を使うことで、一度に何百、何千という数のファイルを一瞬で安全に編集できる。

一度このような IDE の編集スタイルに慣れると、より髙い生産性を持ってプログラミングを行うことが可能。

# 【講義】IntelliJ IDEA のその他の機能

なお IDEA には、紹介していないが他にも便利な機能がたくさんある。

* 自動整形
* ScalaDoc というコードコメントから作られるドキュメントの表示
* 関数などの呼び出し階層の表示
* 利用していない変数、定数の表示
* コンパイルできないコードの原因の表示
* 問題のあるコードの修正のやり方の表示、自動修正
* ライブテンプレートというコード断片の利用
* Git などの VCS (Version Control System) との統合

など。

これらは、「 Tip of the Day 」にも表示されることがあるので、少しずつ覚えていこう。

またコード補完やライブテンプレートを利用できれば、正確な文法を忘れた際にも IDE が補助してくれる。
そのため、開発者は目的を達するためのプログラミングに集中できる。

# まとめ

* IDE は Scala を書くための複雑な設定を自動化してくれる
* IntelliJ IDEA では、様々な記述の定義元を調べることができる
* IntelliJ IDEA では、ブレークポイントやリファクタリング機能を利用できる

# 挑戦

## 初級

```scala:src/main/scala/Main.scala
object Main extends App {
  val a = 2
  val z = 3
  println(s"a = ${a}")
  printMulti
  private def printMulti = {
    println(s"答えは${a * z}")
  }
}
```

## 中級

```scala:src/main/scala/Main.scala
object Main extends App {
  javax.swing.JOptionPane.showConfirmDialog(null, "おげんきですか？")
}
```