PlantUML - mermaid UML 比較（アクティビティ図・状態遷移図）

## Qiita での UML 記述（その２）

Qiita で PlantUML および mermaid が使用できるようになったということで軽く比較したいと思います。
それぞれの正式な書式については公式サイトをご確認ください。

cf. [前回（シーケンス図）](https://qiita.com/goya-hideaki/items/d149782b633f155de48a)

### アクティビティ図（フローチャート）

cf. [PlantUML legacy](https://plantuml.com/ja/activity-diagram-legacy)
cf. [PlantUML Beta](https://plantuml.com/ja/activity-diagram-beta)
cf. [mermaid](https://mermaid-js.github.io/mermaid/#/flowchart)

#### _PlantUML.1_

PlantUML でのアクティビティ図は[旧版（legacy）](https://plantuml.com/ja/activity-diagram-legacy)と[新構文（Beta）](https://plantuml.com/ja/activity-diagram-beta)がありますが、Qiita では旧版のみサポートしているようです。
PlantUML 旧版（以下、PlantUML）では進む方向を逐次指定することが可能です。

~~~text
```plantuml
(*) -up-> "First Activity"
-right-> "Second Activity"
--> "Third Activity"
-left-> (*)
```
~~~

```plantuml
(*) -up-> "First Activity"
-right-> "Second Activity"
--> "Third Activity"
-left-> (*)
```

#### _mermaid.1_

mermaid のアクティビティ図は流れの方向に応じた種類あり、基本的には左から右に進む `flowchart LR` と上から下に行く `flowchart TB`を使うことになると思います。
これらのほかに `TD`（TB と同等）、`BT`（下から上）、`RL`（右から左）があります。試した限りでは、５つとも Qiita で使用できるようです。
また、１行で連続して記述できるなど、慣れていれば書きやすい機能だと思われます。

~~~text
```mermaid
flowchart LR
   A -- text --> B -- text2 --> C
```
~~~

```mermaid
flowchart LR
   A -- text --> B -- text2 --> C
```

~~~text
```mermaid
flowchart TB
   A -- text --> B -- text2 --> C
```
~~~

```mermaid
flowchart TB
   A -- text --> B -- text2 --> C
```


#### _PlantUML.2_

条件分岐の記載ができます。
コメントで改行をしたい場合は `\n` を挟むことで対応できます。

~~~text
```plantuml
(*)  --> "check input"
If "input\nis verbose" then
--> [Yes] "turn on\nverbosity"
--> "run command"
else
--> "run command"
Endif
-->(*)
```
~~~

```plantuml
(*)  --> "check input"
If "input\nis verbose" then
--> [Yes] "turn on\nverbosity"
--> "run command"
else
--> "run command"
Endif
-->(*)
```

#### _mermaid.2_

mermaid も当然条件分岐が記載できるのですが、分岐の要素に条件文を書くと途端に巨大な菱形になり、見た目はあまりよろしくありません。
菱形の外にコメントを記載したくてもその方法はないようです。
コメントで改行をしたい場合は `<br>` を挟むことで対応できます。

~~~text
```mermaid
flowchart TB
    A[Start] --> B(check input)
    B --> C{input<br>is verbose}
    C -->|YES| D(turn on<br>verbosity)
    C -->|NO| E(Run command)
    D --> E
    E --> F[End]
```
~~~

```mermaid
flowchart TB
    A[Start] --> B(check input)
    B --> C{input<br>is verbose}
    C -->|YES| D(turn on<br>verbosity)
    C -->|NO| E(Run command)
    D --> E
    E --> F[End]
```

アクティビティ図に関しては mermaid よりも PlantUML の方が見やすいものが書けると思います。


### 状態遷移図

cf. [PlantUML](https://plantuml.com/ja/state-diagram)
cf. [mermaid](https://mermaid-js.github.io/mermaid/#/stateDiagram)


上記の公式サイトを見ていただくと分かりますが、PlantUML の状態遷移図はかなり詳細な記述が可能となっています。
可能となっていますが、逆に公式に記載されているような図を誤りなくコーディングするのはかなりの力量が求められますし、Markdown で手打ちをするよりは専用のエディタを使用した方が良いと思われます。

#### _PlantUML.3_

~~~text
```plantuml
hide empty description
[*] --> Still
Still --> [*]

Still --> Moving
Moving --> Still
Moving --> Crash
Crash --> [*]
```
~~~

```plantuml
hide empty description
[*] --> Still
Still --> [*]

Still --> Moving
Moving --> Still
Moving --> Crash
Crash --> [*]
```

#### _mermaid.3_

mermaid では `stateDiagram` と `stateDiagram-v2` という新旧の書式がありますが、現在は公式サイトでは `stateDiagram-v2` のみ解説がされており、Qiita では両方とも対応しているようなので、ここでは `stateDiagram-v2` についてのみ記載します。

~~~text
```mermaid
stateDiagram-v2
    [*] --> Still
    Still --> [*]

    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]
```
~~~

```mermaid
stateDiagram-v2
    [*] --> Still
    Still --> [*]

    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]
```


#### _PlantUML.4_

注釈の記載が可能です。

~~~text
```plantuml
[*] --> Active
Active --> Inactive

note left of Active : this is a short\nnote

note right of Inactive
  A note can also
  be defined on
  several lines
end note
```
~~~

```plantuml
[*] --> Active
Active --> Inactive
Inactive --> Active

note left of Active : this is a short\nnote

note right of Inactive
  A note can also
  be defined on
  several lines
end note
```

#### _mermaid.4_

mermaid でも注釈を記載できますが、指定した位置に表示されないことがあります。

~~~text
```mermaid
stateDiagram-v2
    [*] --> Active
    Active --> Inactive
    Inactive --> Active

    Active: this is a short<br>note
    note left of Active : this is a short<br>note
    note right of Inactive
        A note can also
        be defined on
        several lines
    end note
```
~~~

```mermaid
stateDiagram-v2
    [*] --> Active
    Active --> Inactive
    Inactive --> Active

    Active: this is a short<br>note
    note left of Active : this is a short<br>note
    note right of Inactive
        A note can also
        be defined on
        several lines
    end note
```

### まとめ

前回のシーケンス図は甲乙つけがたいところがありましたが、今回のアクティビティ図（フローチャート）と状態遷移図については出力結果だけを見ると PlantUML の方が見やすい図表として描画されると思います。

mermaid も一見綺麗なものになるのですが、小回りが利かないものになり、痒い所に手が届かない気がします。

また、状態遷移図のところで書いた通り、本格的な UML 図を書くのであれば専門のツールを使用した方が圧倒的に便利なので、Markdown で記載するのは飽くまで簡易的なものと割り切った方が良いとは思います。

（いつ頃正式採用されたかは知りませんが、）Qiita で PlantUML と mermaid が採用されて UML が記載しやすくなったのは確かだと思うので、機会があれば利用していきたいと思います。