【SequenceDiagrams】シーケンス図の書き方

#シーケンス図ってなに？
システムの設計を視覚的に理解できるように、クラス・オブジェクト間のやりとりを表現する図

#構成要素
・ライフライン(Lifeline)・・・使用するオブジェクトやクラスを表現する。オブジェクトとクラスのどちらか一方は省略可
<img width="156" alt="スクリーンショット 2017-05-12 14.29.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/c6c68958-e274-9606-b68a-8994a3ffeee6.png">

・実行仕様(ExecutionSpecification)・・・生成されているライフラインが実行状態であることを意味する
<img width="70" alt="スクリーンショット 2017-05-12 14.29.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/d9a84231-6979-b424-b84d-e6fa5790b43f.png">

・停止(Stop)・・・ライフライン自体の消滅を意味する
<img width="79" alt="スクリーンショット 2017-05-12 14.29.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/411e61b3-4a2e-37d1-4749-63b85bcfdac9.png">

・同期(Synchronous)メッセージ・・・送り先のライフラインの実行に同期されるメッセージ
<img width="135" alt="スクリーンショット 2017-05-12 14.29.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/13fdc11e-68ec-a4f8-3db6-37074c9897b5.png">

・非同期(Asynchronous)メッセージ・・・送り先のライフラインの実行に同期されないメッセージ
<img width="130" alt="スクリーンショット 2017-05-12 14.30.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/4423e93c-2cd1-8b66-5595-bfbb973a0c23.png">

・応答(Reply)メッセージ・・・送り先のライフラインから送り手への戻り値を意味する
<img width="133" alt="スクリーンショット 2017-05-12 14.30.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/bd6cad64-4faa-2d60-3536-11e642bd597c.png">

・ファウンド(found)メッセージ・・・図解上にない送り手からのメッセージ
<img width="141" alt="スクリーンショット 2017-05-12 14.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/00cc63cf-8093-fe35-d01f-ca867587e9bf.png">

・ロスト(lost)メッセージ・・・意図された送り手に送られていない、もしくは受け手が図解上にないメッセージ
<img width="145" alt="スクリーンショット 2017-05-12 14.30.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/3afdf68b-4608-0037-5752-e06e10661247.png">

#複合フラグメント
・ref・・・参照、別のシーケンス図を参照することを示す。

・alt・・・条件分岐、２つ以上の条件分岐を示す。それぞれの条件を[]内に記述。

・opt・・・条件判断、ある条件下でのみ行われる処理を示す。その条件は[]内に記述。

・par・・・並行処理、２つの処理を並行して行うことを示す。

・loop・・・反復処理、繰り返し処理が行われることを示す。loop[開始点,終了点]で反復の開始と終了を指定する。

・break・・・中断、ある条件のとき処理を中断することを示す。その条件は[]内に記述。

・critical・・・クリティカルセッション、処理を保護していることを示す。

・assert・・・[]内の条件の妥当性が成り立たなければならないことを定義していることを示す。

・neg・・・通常起こり得ない処理であることを示す。

・ignore・・・{}内のメッセージでは重要な処理でないことを示す。

・consider・・・{}内のメッセージが重要な処理であることを示す。

#シーケンス図の書き方
今回はWebSequenceDiagramsを使ってシーケンス図を作成したいと思います。
https://www.websequencediagrams.com/
ブラウザ上でシーケンス図を作成することが出来ます。
有料版もありますが、基本的なものは無料版で十分作れます。

###基本的な操作

```
A -> B : メッセージ
A ->> B : メッセージ
B --> A : メッセージ
```

<img width="168" alt="スクリーンショット 2017-05-12 16.16.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/8636a4cd-51fa-b391-1295-a8d4ba89ed90.png">

上から同期メッセージ、非同期メッセージ、応答メッセージとなります。
同じライフライン上で処理を行うと時はA->Aとすれば出来ます。

###実行仕様をつける
文字の前に+・・・実行仕様の最初
何もつけない・・・実行仕様の途中
文字の前に-・・・実行仕様の終わり
に矢印が来るように作成できます。

```
A->+B:メッセージ
A->B:メッセージ
B-->-A:メッセージ
```
<img width="192" alt="スクリーンショット 2017-05-12 17.29.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/2d3c09bf-6df1-a646-4fd1-4bc479dc3d84.png">

###実行の結果で、ライフラインを作成する

```
A->*B
```

###ライフラインを停止する

```
destroy A
```

###メモをシーケンス図上につける

```
note left of A : メッセージ
note right of A :メッセージ
note over A　：メッセージ
note over A,B:メッセージ
```

<img width="315" alt="スクリーンショット 2017-05-12 16.53.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/56bd2c0e-3fc8-fec6-284b-65b1e23adcec.png">


###複合フラグメント
・alt・・・alt 条件1 else 条件2 end
・opt・・・opt 条件 end
・loop・・・loop 条件 end
と記入すると作成できます。
以下例です。

```
A->B: ボールを投げる
alt キャッチ成功
B->A: 投げ返す
else キャッチ失敗
B->A: 謝る
opt
   loop 10times
      A->B: 殴る
   end
end
end
```

<img width="299" alt="スクリーンショット 2017-05-12 16.40.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/180764/4cbb5e45-ed85-43d4-37e0-47dc28597c65.png">

＊refなどは有料版のみのようです…

##感想
シーケンス図を作成することで構造を視覚的に理解できるようになり、かなりわかりやすくなりますね。
システムを作る前に作成することで、エンジニアの作業効率は上がるだろうと思います。
また、修正段階においてもどこの構造のどの部分を修正するべきかがわかりやすく、修正後の形をシーケンス図で一旦作成することで作業前に完成をイメージできるかと思います。

今回シーケンス図作成にWebSequenceDiagramsを使いましたが、
いちいち図形を挿入して矢印を引っ張って…という作業がないのでとても簡単にシーケンス図が作成できるなと感じました。