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

#【新人教育 資料】第8章 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)

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

## シーケンス図
シーケンス図とは、クラスやオブジェクト間のやりとりを時間軸に沿って表現します。

### ライフライン
ライフラインは四角でにライフライン名(クラスやオブジェクト）を示します。

![UML シーケンス図 ライフライン](https://qiita-image-store.s3.amazonaws.com/0/74153/d45a6cfc-4f36-d692-5dfc-3740ffbb16de.png "UML シーケンス図 ライフライン")

### 実行仕様(イベント)
ライフラインでイベントが実行中であることを表現します。ライフラインの線の上に白い箱で表現します。

![UML シーケンス図 実行仕様　イベント](https://qiita-image-store.s3.amazonaws.com/0/74153/27a67359-cc0e-8147-523e-c24aeddc15e7.png "UML シーケンス図 実行仕様　イベント")

#### 開始

```files:plantumlでの表記例
activate ライフライン名
```

#### 終了

```files:plantumlでの表記例
deactivate ライフライン名
```

### メッセージ
矢印の向きでライフライン先へ同期されるメッセージを表現します。メッセージ名は具体的な関数や内容を記載するようにしましょう。

![UML シーケンス図 メッセージ](https://qiita-image-store.s3.amazonaws.com/0/74153/bce2dc24-ec65-baa1-dce6-732b4a633462.png "UML シーケンス図 メッセージ" )

plantumlでは「->」で表現されます。

```files:plantumlでの表記例
ライフライン名 -> ライフライン名 : メッセージ名
```

### 応答メッセージ
応答メッセージは点線で表現されます。
![UML シーケンス図 応答メッセージ](https://qiita-image-store.s3.amazonaws.com/0/74153/a8558d7d-0fb9-4a2d-99c7-980fae79ecf7.png "UML シーケンス図 応答メッセージ")

plantumlでは「-->」で表現されます。

```files:plantumlでの表記例
ライフライン --> ライフライン名 : メッセージ名
```
### 例) ログインに関するシーケンス図
ユーザがシステムにログインするというシーケンス図を掲載してみました。
以下のようになります。

![UML シーケンス図 ログイン](https://qiita-image-store.s3.amazonaws.com/0/74153/61e5e433-08c1-b800-aae9-c2ffdce9b88c.png "UML シーケンス図 ログイン")

実際には条件分岐や並列処理、条件など細かい処理があると思います。
そういう表現は後述で説明します。

```files:plantumlでの表記例
activate ユーザ
  ユーザ -> ログイン : ログインする
  activate ログイン
    ログイン -> ユーザ情報 : ユーザ存在するか?
      activate ユーザ情報
        ユーザ情報 --> ログイン
      deactivate ユーザ情報
    ユーザ情報 -> 権限情報 : 権限があるか?
      activate 権限情報
        権限情報 --> ログイン
      deactivate 権限情報
    ログイン --> ユーザ
  deactivate ログイン
```

### 複合フラグメント
シーケン図において、複雑な処理を表現するために、複合フラグメントというものが定義されています。
以下に掲載したもの以外にもありますが、よく使いそう、かつplantumlが対応しているものだけ掲載してます。

|フラグメント|読み|意味|
|:-----------|-----------|-----------|
|alt| オルタナティブ|分岐処理を表現|
|opt| オプション|条件を満たした場合のみ実行される処理を表現|
|loop| ループ|ループ（繰り返し）処理を表現|
|par| パラレル|並列処理を表現|
|ref| 相互作用使用|別のシーケンス図を参照することを表現|
|break| ブレイク|処理の中断を表現|
|critical|  クリティカル|マルチスレッド環境での同期処理など、排他制御を表現|

いくつか具体的な例を見てみましょう。

#### alt 分岐処理の表現
ログインするユースケースには、ログインが失敗するか、成功するかの主シナリオが存在します。
シーケンス図で条件分岐はaltで表現されます。

```files:plantumlでの表記例
alt 条件1
  処理1
else 条件2
  処理2
end
```

##### 例)ログイン処理の成功と失敗の主シナリオ 
![UML シーケンス図 主シナリオ](https://qiita-image-store.s3.amazonaws.com/0/74153/cdde17e0-f2d2-9bd3-9a5e-72880a936783.png "UML シーケンス図 主シナリオ")


```files:plantumlでの表記例
activate ユーザ
  ユーザ -> ログイン : ログインする
  activate ログイン
    ログイン -> ユーザ情報 : ユーザ存在するか?
      activate ユーザ情報
        ユーザ情報 --> ログイン
      deactivate ユーザ情報
    ユーザ情報 -> 権限情報 : 権限があるか?
      activate 権限情報
        権限情報 --> ログイン
      deactivate 権限情報
      alt 認証[成功]
        ログイン --> ユーザ : /dashboradにリダイレクト
        deactivate ログイン
      else 認証[失敗]
        ログイン --> ユーザ :認証失敗のメッセージを表示
      end
  deactivate ログイン
```

#### ref 相互作用使用 別参照
シーケンス図を簡略化するため、他のシーケンス図を参照して欲しい時があります。
そんな時はrefを使いましょう。

```files:plantumlでの表記例
ref over ライフライン名,ライフライン名 :シーケンス図名
```

##### 例)ログイン処理の権限確認を別参照

![UML シーケンス図 権限チェック 別参照](https://qiita-image-store.s3.amazonaws.com/0/74153/925c685b-66b1-a5ab-6f41-69b2cb9bab34.png "UML シーケンス図 権限チェック 別参照")

```files:plantumlでの表記例
activate ユーザ
  ユーザ -> ログイン : ログインする
  activate ログイン
  ログイン -> ユーザ情報 :ログイン処理
  ref over ユーザ情報,権限情報 :権限チェック
  ユーザ情報 --> ログイン
      alt 認証[成功]
        ログイン --> ユーザ : /dashboradにリダイレクト
        deactivate ログイン
      else 認証[失敗]
        ログイン --> ユーザ :認証失敗のメッセージを表示
      end
  deactivate ログイン
```

### opt 条件による実行の表現
特定の条件を満たした場合に実行されるシーケンスを表現します。

```files:plantumlでの表記例
opt 条件
  処理
end
```

##### 例)会員未登録の場合のシーケンスを追加

![UML シーケンス図 会員未登録 opt 条件](https://qiita-image-store.s3.amazonaws.com/0/74153/b8d62988-4752-c03f-20d9-3a38e67cbbee.png "UML シーケンス図 会員未登録 opt 条件")


## それ以外の表現

### delay 非同期の遅延処理
非同期の処理において、遅延してから処理されるものを表現します。

### 遅延を示す(遅延に関する任意記載なし)

```files:plantumlでの表記例
シーケンス
...
シーケンス
```

#### 遅延を示す(遅延に関する任意記載あり)
```files:plantumlでの表記例
シーケンス
...任意記載...
シーケンス
```

#### 例)会員登録時のダブルオプトインのメールを1分後に送信する場合
今となってはこんな処理はしないかもしれませんが。。。
※ガラケー自体などは、画面処理している最中にメールがくると強制的に操作中断が行われる可能性もあったので1分後などにしたりした

![UML シーケンス図 非同期 遅延](https://qiita-image-store.s3.amazonaws.com/0/74153/76644831-307a-81ac-233e-13aaa1bf237f.png "UML シーケンス図 非同期 遅延")

### group シーケンスのグループ化
グループを表現したい時に使用します。

```files:plantumlでの表記例
group ラベル
  処理
end
```

### ライフラインの省略

ライフラインを省略したい時に使用します。

#### メッセージ
```files:plantumlでの表記例
ライフライン ->]: メッセージ名
```

#### 応答メッセージ
```files:plantumlでの表記例
ライフライン <--]: メッセージ名
```

![UML シーケンス図 ライフラインの省略 API](https://qiita-image-store.s3.amazonaws.com/0/74153/32d567fb-f134-0f19-3014-e5403fe8784b.png "UML シーケンス図 ライフラインの省略 API")