僕的Plant UMLのススメ【図形描画編】
はじめに
こんにちは。
このブログも開始から無事1ヶ月経過しました。
本日は前回(UML知識&環境構築 for mac編)、前々回(Style編)に続いて、いよいよPlantUMLで図形の描画に関しての記述をまとめていきます。
僕的PlantUMLのススメ
- Style編 (前々回)
- UML知識&環境構築 for mac編 (前回)
- 図形描画編 (今回)
構成
PlantUMLは様々な図を表現することができますが、ここでは@ogomrさんの「PlantUML Cheat Sheet」*1に則って、大きく振る舞い図と状態図に分けて解説していきます。
また、可能な限りサンプルを用意していますが、図を含むサンプルは記述が長くなりすぎるので、基本的には▶Sample
みたいな感じで閉じていますので、利用したい方は開いてみてください。
ではいつものようにネタ画像とともに、どうぞ。
目次
目次一覧
1. 全般
1-1. コメント
ここで書くコメントは、PlantUML
での記述中にメモとして残すコメントです。
なので、図には反映されません。
本記事ではわかりやすさのため、サンプルのPlantUML
上にコメントを残していきますので、最初にご紹介します。
書き方
1行のみのコメント
`
複数行のコメント
/` HOGE FUGA `/
sample
@startuml ` 1行のみのコメント ` 簡潔かつわかりやすく書くことが大事 /` 複数行に渡るコメント ガッツリ説明を入れる場合などに使う `/ @enduml
1-2. タイトル・ヘッダー・フッター
項目 | 説明 |
---|---|
title |
ページにタイトルを付ける |
header |
ページにヘッダーを付ける |
footer |
ページにフッターを付ける |
Sample
@startuml ' 表示スタイルの設定 skinparam Shadowing false skinparam Monochrome true ' ==============本題は以下から============= header 僕的Plantumlのススメ\n(ヘッダー) title サンプルのヘッダー\n改行はこちら footer 僕的Plantumlのススメ\n(フッター) ' どのパラメータも \n により改行を入れることができる (hoge) -> (fuga) @enduml
1-3. ページ分割
newpage
を入れることでグラフを分割して、ページを分けることができる
newpage
前後ではスタイルやヘッダー・フッター・タイトルなどすべて受け継がないので、同一ファイル内で複数の画像を生成するというイメージのほうがあっているかも‥
1-4. ノート(メモ)
PlantUMLではあらゆる要素に対して、メモを差し込むことができる。
キーワードは note
で、様々な方法でノートの挿入が可能になっている。
また、差し込んだメモ内には次のHTMLタグなどを利用することができる。
利用可能タグ一覧
<b>
- 太文字指定
<u>
- アンダーライン
<i>
- 斜字体
<s>
,<del>
,<strike>
打ち消し線
<font color="HOGEHOGE">
または<color:#HOGEHOGE>
- 文字色変更
<font size="NN">
または<size:nn>
- フォントサイズ変更
<img src="file">
または<img:file>
- 画像の挿入 *2
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義 !include ./const_contents.plantuml skinparam Shadowing false ' タイトル title ノート(メモの使い方) /'単純なノート 他の要素に直接繋げない場合、名前を付ける必要があるので注意 '/ note "単純なノート" as sinmpeNote ' 複雑なノート note as complexNote 複雑なノート 改行するとそのまま改行される === ' ===で二重線を引くことができる - <b>太文字</b> - **「*」も使える** - <u>アンダーライン</u> - __「_」も使える__ - ~~「~」で波線も使える~~ - <i>斜字体</i> - //「/」も使える// - <s>打ち</s> <del>消し</del> <strike>線</strike> - --「-」も使える-- - <font color="indigo">文字色変更</font> - <size:11>フォントサイズ変更</size> - 画像の挿入 --- ' ---で境界線を引くことができる <img https://pbs.twimg.com/profile_images/3228282688/4a3c9e25b9831f3d74c357cae6c90636_reasonably_small.png> end note /'エレメントとノートを関連付ける 1. 関連付けるエレメントの直後にnoteを入れる 2. ノートに名前をつけ、線でつなぐ '/ (上note) note top: 上にノートをくっつける (右note) note right: 右にノートをくっつける (下note) note bottom 下にノートをくっつける 複数行もできる end note (左note) note left 左にノートをくっつける 複数行もできる end note complexNote ... (右note) complexNote --- (上note) (上note) -right-> (右note) (右note) -down-> (下note) (下note) -left-> (左note) (左note) -up-> (上note) @enduml
1-5. 表示順序
描画の順番を左右方向か、上下方向化を指定する。
defaultは上下方向。
key | sample |
---|---|
top to bottom direction |
|
left to right direction |
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義 !include ./const_contents.plantuml !include ./const_style.plantuml ' タイトル title 表示順序変更\ntop to bottom(default) top to bottom direction (001) --> (002) (002) --> (003) newpage ' ヘッダー・フッターを読み込み & スタイル定義 !include ./const_contents.plantuml !include ./const_style.plantuml ' タイトル title 表示順序変更\nleft to right left to right direction (001) --> (002) (002) --> (003) @enduml
1-6. ライブラリー
PlantUMLではスタンダードライブラリーとして AWS
やAzure
、Cloud Insight
などのLibraryが用意されており、実際にPlantUMLで利用することができる。
Sample
@startuml !include ./const_contents.plantuml !include <aws/common> !include <aws/Storage/AmazonS3/AmazonS3> !include <aws/Storage/AmazonS3/bucket/bucket> skinparam Shadowing false title ライブラリーインポート(AWS) AMAZONS3(s3_internal) AMAZONS3(s3_partner,"Vendor's S3") s3_internal <- s3_partner @enduml
2. 振る舞い図
2-1. 全般
2-1-1. シーケンス番号付
振る舞い図における順序において、上から順に番号付をしてくれる機能。
autonumber <連番開始数(省略可)> <数字送りの幅> "<フォーマット>"
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title シーケンス番号付 autonumber HOGE -> FUGA : 自動連番開始 HOGE <- FUGA : 連番を一時停止 autonumber stop HOGE -> FUGA : 停止中 autonumber resume "<b>[0]" HOGE -> FUGA : フォーマットを変えて再開 HOGE <- FUGA : 再停止 autonumber stop HOGE -> FUGA : 停止中 autonumber 1 10 "<b>0.0: " HOGE -> FUGA : 連番振り直し HOGE <- FUGA : 連番間隔を10に設定 @enduml
2-1-2. 境界線・遅延・間隔
key | 名称 |
---|---|
== <境界線名称> == |
境界線 |
... |
遅延 |
||<間隔px>|| |
間隔 |
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title 境界線・遅延・間隔 ' 境界線 == 境界線 == FUGA --> HOGE: Authentication Request HOGE --> FUGA: Authentication Response ' 遅延 ... FUGA --> HOGE: Another authentication Request HOGE --> FUGA: another authentication Response ' 間隔50px ||50|| FUGA --> HOGE: Another authentication Request HOGE --> FUGA: another authentication Response @enduml
2-1-3. 条件
エンジニアの方なら見慣れた if
やelse
を使う処理。
サンプルを見るのが一番早いやつ。
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title 条件文 start if (A or B) then (A) :Aを選んだらこっち; elseif (A or B) then (B) :Bを選んだらこっち; stop else :どれも選ばなかったらこっち; stop endif stop @enduml
2-1-4. 繰り返し
ある条件がクリアするまで繰り返す。
繰り返しには後判定
と前判定
の2パターンがある。
key | 繰り返しパターン | 詳細 (処理Aを繰り返す場合) |
---|---|---|
repeat while |
後判定 | Aの処理が終了した後に繰り返すかどうかの判定をする |
while |
前判定 | Aの処理を実施する前に実施するかどうかの判定をする |
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title 繰り返し start ' 後判定 repeat :HOGE; repeat while (繰り返す?) ' 前判定 while (繰り返す?) :FUGA; endwhile stop @enduml
2-1-5. 並列処理
複数の処理を同時並行で処理する場合の記述する。
フォークノードやジョインノード等と呼ばれる。
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title 並列処理 start if (並列処理する?) then (yes) fork :並列タスク1; fork again :並列タスク2; end fork else (no) :非同期タスク1; :非同期タスク2; endif stop @enduml
2-2. ユースケース図
ユースケース図ではいろいろな記号を使うので、それぞれの書き方をまとめます。
名称 | キーワード | 省略記法 | サンプル |
---|---|---|---|
ユースケース | usecase ユースケース |
(ユースケース省略記法) |
|
アクター | actor アクター |
:アクター省略記法: |
|
ステレオタイプ | <<ステレオタイプ>> |
||
関連(矢印) | -> ,--> ,..|> |
なし |
矢印サンプル
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title 矢印 left to right direction :アクター1: -> (ユースケース1) :アクター1: -------> (ユースケース2) :アクター1: ..|> :アクター2: : <<extend>> :アクター2: ..|> :アクター3: : <<include>> :アクター3: -left-> (左) :アクター3: -right-> (右) :アクター3: -up-> (上) :アクター3: -down-> (下) @enduml
ユースケース図Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title ユースケース図 left to right direction actor 顧客 as 顧客 <<ユーザー>> actor 受付 as 受付 <<ユーザー>> actor 受付システム as 受付システム <<システム>> rectangle チェックアウト { 顧客 --> (チェックアウト) (チェックアウト) <-- 受付 (チェックアウト) ..|> (支払い) : <<include>> (問い合わせ) ..|> (チェックアウト) : <<extends>> (問い合わせ) -down-> 受付システム } @enduml
2-3. アクティビティ図
アクティビティ図にも記号が複数あるのでそれぞれまとめます。
名称 | キーワード | 省略記法(ベータ版) | サンプル |
---|---|---|---|
アクティビティ | "アクティビティ" | :アクティビティ; | |
初期ノード | (*)--> |
start | |
終端ノード | -->(*) |
stop | |
動線 | |<動線名称>| |
|<動線名称>| |
導線Sample
上記導線Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title 動線 |α| start |β| :1; |γ| |δ| :2; |ε| :3; |γ| :4; |β| stop @enduml
Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title アクティビティ図 |自宅| start :起床; fork if (時間の猶予) then (ある) :朝ごはんを準備; :朝食; else (ない) endif fork again :テレビをつける; :天気を確認; end fork :出勤の準備; if (終日の天気) then (雨模様) :電車を確認; |屋外| :家を出る; :電車に乗る; |会社| :会社ビルに\n到着; else (晴れ) |屋外| :家を出る; :自転車の状態を確認; :自転車に乗る; while (移動) :自転車で移動; endwhile (会社ビルに到着) |会社| endif :エレベーターに乗る; :執務室階へ移動; :勤怠をつける; stop @enduml
3. 状態図
3-1. クラス図
クラスの関連を示す矢印の記法は3種類あります。
Type | key |
---|---|
関連(Association) | --- |
集約(Aggregation) | o-- |
コンポジション (Composition) |
*-- |
依存(Dependency) | <.. |
汎化(Generalization) | <|-- |
実現(Realization) | <|... |
また、下記のように接続するクラスと関連の矢印の間に"
で1
や*
などの多重度をラベルとしてつけることができます。
Class01 "1" --- "1..n" Class02
関連矢印Sample
サンプル図は上記のもの
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title Class 関連矢印 rectangle 関連\n(Association) { Association01 "0" -- "*" Association02 } rectangle 集約\n(Aggrefation) { Aggrefation01 "1" --o "*" Aggrefation02 } rectangle コンポジション\n(Composition) { Composition01 "1" --* "1..n" Composition02 } rectangle 依存\n(Dependency) { Dependency01 "*" ..> "*" Dependency02 } rectangle 汎化\n(Generalization) { Generalization01 "1..n" --|> "*" Generalization02 } rectangle 実現\n(Realization) { Realization01 "1" ..|> "1" Realization02 } @enduml
クラスは上記で説明した関連を使えば勝手に作成されますが、中身を詳細に書こうと思うと、きちんと定義して上げる必要があります。
定義の仕方は大きく「最初に{}
を使ってフィールドとメソッドを作る方法」と「宣言した後にそれぞれのエレメント等を定義する方法」、2パターンあります。
クラス宣言Sample
サンプル図は上記のもの
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title Class Class 先に宣言するクラス { data : String setData() : Void } 先に宣言するクラス "1" - "1" 後で要素を追加するクラス 後で要素を追加するクラス : data : Object[] 後で要素を追加するクラス : getData() : String @enduml
クラスの中にはデータ・もしくはfunctionの可視性を定義することができます。
Type | Key | 内容 |
---|---|---|
private プライベート |
- |
宣言クラスのみアクセス可能 |
package private パッケージプライベート |
~ |
宣言クラスと同パッケージのみアクセス可能 |
protected プロテクト |
# |
宣言クラス・サブクラスのみアクセス可能 |
public<パブリック> | + |
すべてのクラスからアクセス可能 |
可視性(Visiility)Sample
サンプル図は上記のもの
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml skinparam Shadowing false title 可視性(Visibility) Class Visibility { - privateData : String - privateFunction() : Void # protextedData : String # protextedFunction() : Void ~ packagePrivateData : String ~ packagePrivateFunction() : Void + publicData : String + publicFunction() : Void } @enduml
クラス図はパッケージとしてまとめることができます。
パッケージSample
図は上記
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title パッケージ package Nodeパッケージ <<Node>> { class NodeClass } package 四角パッケージ <<Rectangle>> { class RectangleClass } package フォルダーパッケージ <<Folder>> { class FolderClass } package フレームパッケージ <<Frame>> { class CrameClass } package クラウドパッケージ <<Cloud>> { class CloudClass } package データベースパッケージ <<Database>> { class DatabaseClass } @enduml
クラスで使われる目印文字を指定して利用することができます。
目印文字指定Sample
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml skinparam Shadowing false title 目印文字 Class Hash <<(H,#00bfff)>> Class Analysis <<(A,#fa8072)>> Class Joke <<(J,#f0f8ff)>> Class Idea <<(I,#00ff7f)>> Class Member <<(M,#ffb6c1)>> Class Event <<(E,#00ced1)>> @enduml
3-2. コンポーネント図
関連や矢印等の書き方はクラス図と同じ。
[]
内でくくるとコンポーネントの表記に変わる。
コンポーネント図Sample
上記の図
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml skinparam componentStyle uml2 title コンポーネント図 package "認証認可パッケージ" { [認証] [ユーザー操作] } cloud "CloudファンクションAPI" { [認証API] [ユーザーAPI] } database "BigQuery" { [ユーザーデータ] [閲覧情報] } [認証] <--> [認証API] [ユーザー操作] --> [認証API] [ユーザー操作] <--> [ユーザーAPI] [認証API] <--> [ユーザーデータ] [ユーザーAPI] <--> [ユーザーデータ] [ユーザーAPI] <--> [閲覧情報] @enduml
3-3. オブジェクト図
オブジェクト図はPlantUML上の記述方法がほぼほぼクラス図と同じで、「クラス図からファンクション部分がなくなったもの」という認識で十分です。
使い方も Object
というキーワードを入れると後はClass図のときと同様に利用することができます。
Sample
図は上記
@startuml ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml skinparam Shadowing false top to bottom direction title Object図 rectangle 関連 { rectangle 実現\n(Realization) { Object Realization01 Object Realization02 Realization01 "1" .|> "1" Realization02 } rectangle 汎化\n(Generalization) { Object Generalization01 Object Generalization02 Generalization01 "1..n" -|> "*" Generalization02 } rectangle 依存\n(Dependency) { Object Dependency01 Object Dependency02 Dependency01 "*" .> "*" Dependency02 } rectangle コンポジション\n(Composition) { Object Composition01 Object Composition02 Composition01 "1" -* "1..n" Composition02 } rectangle 集約\n(Aggrefation) { Object Aggrefation01 Object Aggrefation02 Aggrefation01 "1" -o "*" Aggrefation02 } rectangle 関連\n(Association) { Object Association01 Object Association02 Association01 "0" - "*" Association02 } } rectangle 可視性 { Object Visibility { - privateData : String # protextedData : String ~ packagePrivateData : String + publicData : String } } rectangle パッケージ { package データベースパッケージ <<Database>> { Object DatabaseObject } package クラウドパッケージ <<Cloud>> { Object CloudObject } package フレームパッケージ <<Frame>> { Object CrameObject } package フォルダーパッケージ <<Folder>> { Object FolderObject } package 四角パッケージ <<Rectangle>> { Object RectangleObject } package Nodeパッケージ <<Node>> { Object NodeObject } } 可視性 -[hidden]le- パッケージ 関連 -[hidden]do- パッケージ @enduml
4. その他
実はPlantUMLはUMLだけではなく様々なものを扱うことができます。
今回はその中でも使い勝手の良いものをいくつかご紹介します。(サンプルと書き方だけですが…。)
4-1. マインドマップ
@startmindmap
@endmindmap
を使う。
Markdownのリストみたいな書き方。
子要素にする場合は親要素の直後に「親要素の*
の数+1」個の*
を先頭につけて記述。
テキストのみを表示する場合は最後の*
の後に_
を入れる
Sample
図は上記
@startmindmap ' ヘッダー・フッターを読み込み & スタイル定義ファイル読み込み !include ./const_contents.plantuml !include ./const_style.plantuml title マインドマップ * <&star>星のカービィ ** サウンド *** ボイス ****_ 大本 眞基子(カービィ他) ****_ 桜井 政博(デデデ 64, スマブラ) ****_ 緒方 賢一(デデデ アニメ) ****_ 熊崎 信也(デデデ USD, Wii, トリデラ) ****_ 私市 淳(メタナイト) ****_ 齋藤 彩夏(ワドルディ) *** 効果音 ****_ 安藤浩和 ****_ 石川淳 ****_ 小笠原雄太 *** 音楽 ****_ 安藤浩和 ****_ 石川淳 ****_ 小笠原雄太 ** テキスト *** システムメッセージ ****_ 子供向け ****_ 伏線を張りまくる ****_ ネタを作る *** ナレーション ****_ 毛糸のカービィのみナレーションあり ****_ 津賀 有子 *** セリフ ****_ 備えあれば嬉しいな! ****_ 才能は無くても根気だけはある物好きは腐るほどいるでゲス ****_ 環境破壊は気持ちいいぞい ** グラフィック *** 背景 ****_ 美しい系のきれい ****_ 違和感がない程度に異常 *** オブジェクト ****_ 限りなく少ない ****_ ワドルディが時々コントしてる *** カメラワーク ****_ 固定 *****_ 基本2D移動 left side ** 世界観 *** コンテキスト ****_ カービィの周りは平和 ****_ なにげにシリーズを通して深い *** キャラクター ****_ 基本的に可愛らしいビジュアル *** イベント ****_ ギミック多め ****_ HAL部屋 ****_ 裏切り ****_ 敵の敵は味方 *** ストーリー ****_ 可愛らしさ優先 ****_ 割とエグい設定 ****_ 世界の危機(いつもの) ** システム *** 自由度 ****_ 増え続けるコピー能力 ****_ 基本ストーリーをなぞる ****_ 移動に関する自由はほぼ無い *** 操作性 ****_ コピー能力によりコマンド有り ****_ ノーマルの場合は単純明快 *** ゲームバランス ****_ 基本初心者向け ****_ 上級者向けのモードあり @endmindmap
4-2. ツリー
木構造のウィジェットを作る感じで利用可能。
ワイヤーを作る機能に付随している(@startsalt
と@endsalt
で囲む)。
Sample
@startsalt { {T + World ++ America +++ Canada +++ USA ++++ New York ++++ Boston +++ Mexico ++ Europe +++ Italy +++ Germany ++++ Berlin ++ Africa } } @endsalt
4-3. 算術表記
PlantUMLではAsciiMathやJLaTeXMathの構文が利用可能。
Sample
@startuml :<math>int_0^1f(x)dx</math>; :<math>x^2+y_1+z_12^34</math>; note right Try also <math>d/dxf(x)=lim_(h->0)(f(x+h)-f(x))/h</math> <latex>P(y|\mathbf{x}) \mbox{ or } f(\mathbf{x})+\epsilon</latex> end note @enduml
4-4. ワイヤーフレーム
ツリー構造のところで記述したとおり、@startsalt
と@endsalt
で囲んで記述する。
チープなUIだが、いろいろ書くことができる。
Smaple
@startsalt {+ {* ファイル | 編集 | 表示 | ウィンドウ | ヘルプ} {/ ブログ記事編集 | 僕的URMのススメ | PlanUML言語 } { { 保存種別: | ^日時を指定して予約投稿^ } [X] サムネイル画像を変更する [X] Twitterと連携し、投稿されたらツイートする [ ] 投稿時にメールを送信する } [Close] } @endsalt
おわりに
今回も、信じられないくらい長文になりましたが、なんとかPlantUMLシリーズ書ききることができました。
今回ご紹介したPlantUMLはまだいろいろな機能があります。(私はあまり使わないのですが…)
PlantUML自体の記述方法は簡単ですが、使いこなそうと思うと一気に難しくなります。
触れる機会が多いほど、当たり前にかけるようになってくるので、是非仕事だけじゃなく個人的でも、趣味でもいろいろなところで使ってみてください。
ではまた次回。
参考
- @ogomr, Qiita - PlantUML Cheat Sheet -, 最終閲覧 2019-11-04
- PlantUML言語リファレンスガイド, 最終閲覧 2019-11-04
- PlantUMLを使ったUMLの使い方 -PlantUML言語リファレンスガイド(Versin 1.2019.9)-, 最終閲覧 2019-11-04