【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜

# 【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜
## あらすじ
新人がいっぱい入ってくる。新人のレベルもバラバラ。教育資料も古くなっているので、更新しましょう。
どうせなら、公開しちゃえばいいじゃん。という流れになり、新人教育用の資料を順次更新していくことにしました。

※後々、リクエストに応じて更新することが多いのでストックしておくことをおすすめします。

自分は[TEMONA株式会社](http://temona.co.jp/)でCTOをしていますが、頭でっかちに理論ばっかり学習するよりは、イメージがなんとなく掴めるように学習し、実践の中で知識を深めていく方が効率的に学習出来ると考えています。

※他の登壇やインタビュー記事は[Wantedly](https://www.wantedly.com/users/105935)から見てください。

教育スタイルとしては正しい事をきっちりかっちり教えるのではなく、未経験レベルの人がなんとなく掴めるように、資料を構成していきます。

以下のようなシリーズネタで進めます。

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea) |
|2|[【新人教育 資料】第2章 UMLまでの道 〜クラス編〜](http://qiita.com/devopsCoordinator/items/3cde12abce689ff6906b) |
|3|[【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜](http://qiita.com/devopsCoordinator/items/213e45694dfac0edcfbc) |
|4|[【新人教育 資料】第4章 UMLまでの道 〜クラス図を書いてみよう編〜](http://qiita.com/devopsCoordinator/items/8d2af381c1c469103459) |
|5|[【新人教育 資料】第5章 UMLまでの道 〜ユースケース図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/bbd57df681844308fb5d) |
|6|[【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/289f77fc83813ba7cc76)|
|7|[【新人教育 資料】第7章 UMLまでの道 〜アクティビティ図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/e4910ace92e66bece10f)|
|8|[【新人教育 資料】第8章 UMLまでの道 〜シーケンス図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/4535c3cce207b114ad6c)|

箸休めには以下をどうぞ

[【新人教育 資料】ハードウェア編](http://qiita.com/devopsCoordinator/items/1aa4a76072a61b15c56f)

では、今回もはじめていきましょう！

## ステートマシン図
ステートマシン図は1つのクラスに着目し、そのオブジェクトの状態遷移を示すものです。
オブジェクトの状態を示し、どのような条件や遷移があるかが分かるよう示します。

### 開始状態
開始状態 記号	スコープ内で開始を表します。

![新人教育 資料 UML ステートマシン図 開始](https://qiita-image-store.s3.amazonaws.com/0/74153/b7c561e4-82cd-4c09-2f21-87144709cff2.png "新人教育 資料 UML ステートマシン図 開始")

### 終了状態
スコープ内で終了を表します。
![新人教育 資料 UML ステートマシン図 終了](https://qiita-image-store.s3.amazonaws.com/0/74153/bd018209-08f2-3746-26ab-f605eee7be79.png "新人教育 資料 UML ステートマシン図 終了")

### 状態
何の状態を示すか、一言で示せる状態名及び、必要であれば下の段に状態を補足する説明を記載しましょう。

![新人教育 資料 UML ステートマシン図 状態](https://qiita-image-store.s3.amazonaws.com/0/74153/c1863cc9-cb32-fd5c-4c0f-8ea4d96a3913.png "新人教育 資料 UML ステートマシン図 状態")

### 遷移
遷移は矢印で示します。矢印の順番で状態遷移することを表現します。
![新人教育 資料 UML ステートマシン図 遷移](https://qiita-image-store.s3.amazonaws.com/0/74153/a9a9735d-bd2e-93f9-9d44-a221bb812fda.png "新人教育 資料 UML ステートマシン図 遷移")


```file:plantumlでの表記例
[*] -right-> 状態1
状態1 -right-> 状態2
状態2 -right-> [*]
```

### 合成
状態の中に、複数の状態が包括する状態を表します。
以下は自動販売機の例です。
![新人教育 資料 UML ステートマシン図 合成](https://qiita-image-store.s3.amazonaws.com/0/74153/5d1b64cc-dbad-83d3-8561-f02f4e369870.png "新人教育 資料 UML ステートマシン図 合成")

```file:plantumlでの表記例
[*] -right-> 停止

  停止 -right-> 稼働
state 稼働 {
  待機 -r-> 入金 :お金を入れる
  入金 -d-> 押下 :商品を選択する
  
  入金 -u-> 待機 :キャンセル
  押下 -d-> 待機 :商品を出す
}
```

### 領域(同時)
以下の例はキーボードのnumLockやcapslock,scrolllockなど複数同時に状態が混在する事を示しています。
区画線としては点線で表現します。PlantUMLでは「--」が領域表現です。
![新人教育 資料 UML ステートマシン図 領域 同時](https://qiita-image-store.s3.amazonaws.com/0/74153/e6f8fcf0-23b0-e2c8-ed7a-516a23efa171.png "新人教育 資料 UML ステートマシン図 領域 同時")

```file:plantumlでの表記例
[*] --> Active

state Active {
  [*] -> NumLockOff
  NumLockOff --> NumLockOn : EvNumLockPressed
  NumLockOn --> NumLockOff : EvNumLockPressed
  --
  [*] -> CapsLockOff
  CapsLockOff --> CapsLockOn : EvCapsLockPressed
  CapsLockOn --> CapsLockOff : EvCapsLockPressed
  --
  [*] -> ScrollLockOff
  ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
  ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
}
```

上記の例は
http://ja.plantuml.com/state.html#Concurrentから引用させていただきました。

##演習
幾つかやってみましょう

### 人が結婚、別居、離婚などのステートマシン図を作ってみましょう。

### 車が動作に関してのステートマシン図を作ってみましょう。

### 運転免許に関してのステートマシン図を作ってみましょう。

### iPhoneのsiriの動作に関するステートマシン図を作って見ましょう。

## あとがき
UMLのステートマシン図はどうだったでしょうか？
細かい条件やフローなどをは、別のUML図で表現するので
ステートマシン図は１つのオブジェクトの状態遷移を示すものなのでシンプルに心がけましょう。
次回は、アクティビティ図を説明したいと思います。