MacでのPlantUMLを使ったアクティビティ図の書き方あれこれ①

[![](https://1.bp.blogspot.com/-h49hTRpdOls/X4xFf74osjI/AAAAAAAADp4/yYCQ6OyJqC4Em0ORmZXDF0w5ab8PbI2ywCLcBGAsYHQ/s320/057_01.jpg)](https://1.bp.blogspot.com/-h49hTRpdOls/X4xFf74osjI/AAAAAAAADp4/yYCQ6OyJqC4Em0ORmZXDF0w5ab8PbI2ywCLcBGAsYHQ/s450/057_01.jpg)

# アクティビティ図について

UMLでアクティビティ図を書く機会があったので復習がてら基本的な流れをメモしておこうと思い、例で考えながら各構成要素について書き残しておこうと思います。

## アクティビティ図とは何ぞや？

処理と処理の順番を表現するために作られた表記法で、具体的な業務の流れを各人で共有し、足りないものはないか、もしくは余分な構成要素が存在しないかをお互いに認知するきっかけともなりうるので多くの開発現場で導入されています。

アルゴリズムなどの考え方もこのアクティビティ図で表現されることが多く、抽象的な流れを具体的なものに落とし込むことはITエンジニアとして重要な能力の一つでしょう。

## それでそれで？どうやって記述するの？

今回は[PlantUML](https://plantuml.com/ja/)を使って記述します。
公式サイトに記述がある通り、

>**PlantUML** は、以下のようなダイアグラムを素早く作成するためのコンポーネントです。
>-   [シーケンス図](https://plantuml.com/ja/sequence-diagram)
>-   [ユースケース図](https://plantuml.com/ja/use-case-diagram)
>-   [クラス図](https://plantuml.com/ja/class-diagram)
>-   [アクティビティ図](https://plantuml.com/ja/activity-diagram-beta)（[古い文法はこちら](https://plantuml.com/ja/activity-diagram-legacy)）
>-   [コンポーネント図](https://plantuml.com/ja/component-diagram)
>-   [状態遷移図（ステートマシン図）](https://plantuml.com/ja/state-diagram)
>-   [オブジェクト図](https://plantuml.com/ja/object-diagram)
>-   [配置図](https://plantuml.com/ja/deployment-diagram)
>-   [タイミング図](https://plantuml.com/ja/timing-diagram)
>以下のような、UML以外の図もサポートしてます。
>-   [ワイヤーフレーム](https://plantuml.com/ja/salt)
>-   [アーキテクチャ図](https://plantuml.com/ja/archimate-diagram)
>-   [仕様及び記述言語 (SDL)](https://plantuml.com/ja/activity-diagram-beta#sdl)
>-   [Ditaa](https://plantuml.com/ja/ditaa)
>-   [ガントチャート](https://plantuml.com/ja/gantt-diagram)
>-   [マインドマップ](https://plantuml.com/ja/mindmap-diagram)
>-   [WBS図(作業分解図)](https://plantuml.com/ja/wbs-diagram)
>-   [AsciiMath や JLaTeXMath による、数学的記法](https://plantuml.com/ja/ascii-math)
>-   [ER図](https://plantuml.com/ja/ie-diagram)
引用:https://plantuml.com/ja/

とある通り、様々な設計図やフロー図を素早く書けることから多くの人に使われています。

コードっぽく書けるというのが非常にありがたい点で、最初は特有の文法に慣れるのに時間がかかるかもしれませんが、慣れてしまえば非常に手早く書くことができるようになります。


# 導入

今回はVSCodeで使います。
環境的には以下を導入しましょう。

## 実行環境
-   OSX Catalina 10.15.7
-  Homebrew 2.5.6
## 導入要素

- JDK
- graphviz
- VSCode

### JDK
Javaを使えるようにしていないとそもそも使えないので以下のコマンドでインストール。

```
$ brew cask install adoptopenjdk
```

### graphviz

シーケンス図とアクティビティ図 **以外** のダイアグラムを使いたい場合は、[Graphviz software](https://plantuml.com/ja/graphviz-dot) をインストールする必要があるのでインストールしましょう。

``` terminal
$ brew install graphviz
```

### PlantUML

```
$ brew install plantuml
```

### VSCode

インストールし、拡張機能で'PlantUML'と検索すればでます。
インストールすればひとまずVSCodeの設定は終了です。

![](https://1.bp.blogspot.com/-rH-jIWfoHvs/X4w-TcdHw_I/AAAAAAAADpg/CJSD1CRDzggHr2wgov0kVlkNm0Q2vPhowCLcBGAsYHQ/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2020-10-18%2B22.08.06.png)

ちなみにVSCodeで`option+D`でリアルタイムで更新したUMLが描画されます。
便利。

# 実例
例えば、100円両替機のアクティビティ図の例は以下のようになります。
[![](https://1.bp.blogspot.com/-Ueu6PVF0etI/X4w5ywBKPEI/AAAAAAAADpU/wk6N9fltiJgYbQN3hdGsqiQCrdiDwuPkgCLcBGAsYHQ/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2020-10-18%2B21.48.46.png)](https://www.blogger.com/blog/post/edit/8364422178939404763/3262399034736676439?hl=ja#)

  

これをPlantUMLで書くと以下のようになります。

```wsd:MoneyChanger.wsd
@startuml
start
:投入金の種類を判別する;
if()then(1000円紙幣または500円硬貨)
:100円硬貨を出す;
else(それ以外)
:投入金を戻す;
endif
stop
@enduml
```

以上の要素をそれぞれ分解して考えてみましょう。

まずは最初の`@startuml`です。これは最後の要素の`@enduml`とセットで始点と終点を宣言しています。これがないと No ファイル名 Foundと表示されます。

次に`start`と`stop`です。
これは最初の`●`と最後の`◉`を表しています。
その次の`:投入金の種類を判別する;`ですが、アクティビティ図で何かしらの行動を表す**アクション**を表してます。
PlantUMLでは、

```
:アクションとして表示したい行動;
```

でアクションを表すことが出来ます。

次に

```
if()then(1000円紙幣または500円硬貨)
:100円硬貨を出す;
else(それ以外)
:投入金を戻す;
endif
```

ですが、分岐を表します。
`then`の直後に`if`の条件を書き、その場合のアクションを直後に記入します。

そして、分岐ということで`else`が必要です。
ちなみに`if`と同じ書き方で`elif`も書けますし、入れ子構造の分岐も書けます。

`else`は直後に条件を記述し、あとはアクションを書くだけです。

最後に分岐が終わったことを宣言するために`endif`を書くと分岐が認識されます。

ちなみに、最初の`if`の直後の()が空欄ですが、これは分岐の段階でのデシジョンノードに条件を記入する必要がないためで、必要であれば以下のように記入できます。

```
@startuml
start
:投入金の種類を判別する;
if(true)then(1000円紙幣または500円硬貨)
:100円硬貨を出す;
else(それ以外)
:投入金を戻す;
endif
stop
@enduml
```

こうすると以下のようになります。

![](https://1.bp.blogspot.com/-c4zMIeqevvQ/X4xCrFoJu_I/AAAAAAAADps/TELY406OXiQXxt2TSuWT42qzy6UIxUDFACLcBGAsYHQ/s0/MoneyChanger.png)

少し余談ですが、VSCodeの場合は`command+shift+P`でコマンドパレットを呼び出します。
コマンドパレットに`PlantUML`を入力し、`PlantUML:Export Current Diagram`を選択すると指定した拡張子で出力されます。
便利な機能なので覚えくと良さげです。

ここまでで基本的なアクションと分岐の書き方はまとめました。

次はループや細かいオブジェクトについての書き方を書いていきたいと思います。