PlantUML の使い方
- PlantUML の使い方 (今回)
- シーケンス図
- クラス図
- ユースケース図
- アクティビティ図
- 状態遷移(ステートマシン)図
- コンポーネント図
- skinparam
- PlantUML 実行用のバッチファイル
今回は PlantUML の使い方の説明です。
PlantUML とは
最近、プログラムの設計書などで UML を使うのが浸透してきていますが、 この UML を書くのはわりと面倒です。CASE ツール, Doxygen などでは、クラス図を自動生成してくれますが、 ユースケース図やシーケンス図は自分で書く必要があります。
PlantUML はテキストから UML のダイアログを作成するフリーのツールです。 これを使えば UML をテキストでサクサク書けるようになります。 テキスト派としてはうれしいツールです。
例えば、次のようなテキストからシーケンス図が作成できます。
@startuml plantuml_simple.png Foo -> Bar : メッセージ Foo <-- Bar @enduml

PlantUML には次のような利点があります。
- 素早く書ける
-
UML 図の作成がかなり速くなります。
WYSIWYG のわかりやすさを否定する気はありませんが、 キーボードとマウスの往復はやはり面倒なものです。
また、ツールと組み合わせれば、図を確認しながら書く事もできます。
-
UML 図の作成がかなり速くなります。
- ソースのコメントに書ける
-
ソースに書けるので、 Doxygen
と組み合わせてドキュメントを作成するといったこともできます。
設計書と実際のソースとの乖離というのはよくあることです。 コメントとの乖離もめずらしくないですが、 比較的乖離の危険性は少なくなります。
-
ソースに書けるので、 Doxygen
と組み合わせてドキュメントを作成するといったこともできます。
- マージが可能
-
Git など最近
はやりの分散型バージョン管理システムではファイルをロックすることができません。
そのため、バイナリや XML ファイルの管理には不向きです。
PlantUML はテキストで書くので、分散型バージョン管理システムでも使えます。
-
Git など最近
はやりの分散型バージョン管理システムではファイルをロックすることができません。
そのため、バイナリや XML ファイルの管理には不向きです。
- ツールとの連携
-
コマンドラインプログラムなので、
Doxygen を始め、 Word, Redmine といったいろいろなアプリケーションとの連携もできます。
-
コマンドラインプログラムなので、
Doxygen を始め、 Word, Redmine といったいろいろなアプリケーションとの連携もできます。
いいところばかりではなく、欠点もあります。
- 細かいレイアウトができない
-
レイアウトはある程度、自分で考えて作ってくれるので、
速く書ける分、自由にレイアウトすることができません。
-
レイアウトはある程度、自分で考えて作ってくれるので、
速く書ける分、自由にレイアウトすることができません。
- 記法を覚える必要がある
-
わりと直感的に書けるようになっているため、
覚えるのはそれほど大変ではありませんが、
WYSIWYG のツールに比べると覚えることは多くなります。
記法の説明も行っているので、このブログの記事が参考になればと思います。
-
わりと直感的に書けるようになっているため、
覚えるのはそれほど大変ではありませんが、
WYSIWYG のツールに比べると覚えることは多くなります。
対応している UML 図には以下のようなものがあります。 各 UML 図の書き方に関しては次回以降をご覧ください。
- シーケンス図
- クラス図
- オブジェクト図
- ユースケース
- アクティビティ図
- 状態遷移図
- コンポーネント図
出力は PNG, SVG などに対応しています。
シーケンス図の場合は ASCII アートでの出力もできます。 ただ、日本語を使用すると位置がそろいません。
,---. ,---. |Foo| |Bar| `-+-' `-+-' | message | |------------->| | | | | |<- - - - - - -| ,-+-. ,-+-. |Foo| |Bar| `---' `---'
インストール
PlantUML は Java で書かれたツールで、クロスプラットホームで使えます。Java
OpenOffice や Eclipse などがインストールされていれば、 Java(JRE) も入っているでしょう。 ない場合は以下のサイトからダウンロードしてインストールしてください。PlantUML
PlantUML の jar ファイルは PlantUML のダウンロードページからダウンロードし、 好きなところに置いておきます。Graphviz(dot)
シーケンス図以外の UML を使う場合には Graphviz(dot) が必要になります。 dot はデフォルトでは以下の実行ファイルが呼び出されます。OS | 実行ファイル |
---|---|
Windows | C:\Program Files\Graphviz X.XX\bin\dot.exe |
Unix 系 | /usr/bin/dot |
- 環境変数 GRAPHVIZ_DOT
- 起動時のオプション -graphvizdot
$ java -jar "plantuml.jarのパス" -testdot
日本語
シーケンス図では日本語もそのまま使えます。ただし、テキスト形式(ASCII アート)で出力したい場合には使えません。
シーケンス図以外では dot を使用します。 Windows であればほぼ問題ないと思いますが、 Graphviz(dot) のフォントが日本語を表示できるものに設定されてある必要があります。
ただし、 SVG で出力する場合にはフォントの設定に関係なく日本語も OK です。
コマンドライン
PlantUML はソースコードのコメント内やテキストファイルに書かれた定義を元に画像ファイルを生成します。コマンドは以下の形式です。$ java -jar "plantuml.jarのパス" [option] 入力ファイル [...]
なお、あまり使い勝手がいいとは言えませんが、 GUI もあります。
-gui オプションを指定して起動するか、 Windows で jar ファイルをクリックすると起動します。
追記
plantuml.jar の指定を省略できるように bat ファイルを作成しました。入力ファイル
入力ファイルにはファイルまたはディレクトリー(フォルダー)を指定します。ディレクトリーを指定した場合にはディレクトリー内の以下の拡張子のファイルが対象となります。
- txt
- c, cpp, h
- java
- tex
- html, htm
$ java -jar plantuml.jar "dummy/**.cpp"
dummy のフォルダー、サブフォルダー内の cpp ファイルが対象
出力ファイル
出力ファイルは UML の定義に書かれたファイル名で、 入力ファイルからの相対パス の位置に出力されます。入力ファイル: sample.txt
@startuml images/sample.png Foo -> Bar : メッセージ Foo <-- Bar @endumlコマンド:
$ java -jar plantuml.jar d:\home\foo\src\sample.txt
d:\home\foo\src\images\sample.png ファイルが生成
ソースファイルなどに定義を記述する場合は、 階層構造を持っていると出力先がバラバラになってしまいます。
こういった場合には -o オプションを使って出力先をフルパスで指定します。
コマンド:
$ java -jar plantuml.jar -o d:\home\foo\doc d:\home\foo\src\sample.txt
d:\home\foo\doc\images\sample.png ファイルが生成
出力フォーマット
出力フォーマットはデフォルトでは PNG の画像ファイルです。 これを変更する場合には -tformat のオプションを使用します。オプション | 出力フォーマット |
---|---|
-tsvg | SVG 画像 |
-teps | EPS(Encapsulated PostScript) 画像 (Doxygen の latex 出力などで使用) |
-ttxt | ASCII アート [シーケンス図] |
-tutxt | 罫線などに Unicode を使った文字アート [シーケンス図] |
-txmi | XMI [クラス図] |
-thtml | html ファイル [クラス図] |
例えば、定義で sample.png というファイル名にして、-tsvg を指定すると sample.png という名前の SVG ファイルが出力されます。
その他オプション
その他の役に立ちそうなオプションを紹介しておきます。オプション | 説明 |
---|---|
-h[elp] | ヘルプを表示 |
-v[erbose] | verbose モード。処理中の内容を出力します。 |
-config FILE | 各ダイアグラムで共通して読み込むファイルの指定。 配色、フォントなどを共通して変更したい場合(skinparam)に使用します。 |
-version | バージョンの出力。 |
-checkversion | PlantUML の更新チェック。 新しいバージョンが出ているかサイトにチェックしに行きます。 |
-p[ipe] | 入力を標準入力、出力を標準出力に変更。 他のツールと連携時に役に立ちます。 |
-language | PlantUML のキーワードの一覧を出力。 Emacs などで PlantUML 用のモードを作る場合に使われます。 |
Doxygen との連携
Doxygen と連携して使用するためには、以下の手順となります。- コメント内に UML 定義を記述
- 定義部分は Doxygen 用のコメントとならないようにする
- PlantUML の出力画像を表示するように指定
- PlantUML で画像ファイルを作成
- Doxygen を実行
(プロジェクトルート)/ ├ src/ ソースフォルダー └ doc/ ドキュメントフォルダー ├ images/ 画像フォルダー └ Doxyfile Doxygen の設定ファイル
コードの記述
Doxygen のコメント外で UML 定義をし、 それから作成される画像を @image で指定して、表示させます。/// @image html plantuml_simple.png "UML のサンプル" /// // @startuml plantuml_simple.png // Foo -> Bar : メッセージ // Foo <-- Bar // @enduml
次は Doxygen の条件コマンド(@if, @endif) を使った例です。 DontIgnorePlantUMLCode が定義されていないので、 @if の中身が無視されてるようになっています。
/// @image html plantuml_simple.png "UML のサンプル" /// /// @if DontIgnorePlantUMLCode /// @startuml plantuml_simple.png /// Foo -> Bar : メッセージ /// Foo <-- Bar /// @enduml /// @endif
さらに Doxygen のエイリアス(ALIASES)の機能を使うと、もう少し簡単にコードを書けます。
Doxyfile への追加行 :
ALIASES = "startuml{1}=@image html \1\n@image rtf \1\n@image latex \1\n@if DontIgnorePlantUMLCode" ALIASES += "enduml=@endif"ソースコードでの記述 :
/// @startuml{plantuml_simple.png}
/// Foo -> Bar : メッセージ
/// Foo <-- Bar
/// @enduml
(注) @startuml と { の間にはスペースは入れない。
PlantUML の実行
doxygen の画像用フォルダーは Doxyfile の IMAGE_PATH で指定します。 これを出力先フォルダーとして PlantUML を実行し、画像を作成します。$ java -jar "plantuml.jar のパス" -o "Doxygen の Image フォルダー" 入力ファイル [...]例:
$ java -jar plantuml.jar -o doc\image src\**.h src\**.cpp
Doxygen の実行
画像を準備したあとは通常通り Doxygen を実行します。$ cd doc $ doxygen Doxyfile
Doxygen, PlantUML 連携スクリプト
Doxygen との連携ってややこしいと思った方もいるのではないでしょうか。実際めんどくさいので、 PlantUML 、 Doxygen の実行を一発でできるような Ruby スクリプトを作成しました。 ALIASES の設定などもスクリプト内で自動で行っています。 スクリプトの引数に plantuml.jar と Doxyfile を渡して実行します。
ruby run_umldoxy.rb "plantuml.jar のパス" [Doxyfile]
このスクリプトを使う場合は以下の点に注意してください。
- Doxyfile に書く各パスは絶対パスか Doxyfile からの相対パス
- コードの記述はエイリアスを使った形式
- java, doxygen に PATH を通す(通常インストール時に設定されます)
また、この Ruby スクリプトを Windows でも使いやすくするようにバッチファイル(run_umldoxy.bat) も作成しています。
使用する場合は plantuml.jar, run_umldoxy.rb, run_umldoxy.bat を同じフォルダーに置いてください。
次のような使い方ができます。
- ショートカットをディスクトップに作成し、 Doxyfile をドラッグ &ドロップ
- Doxyfile を .doxy のような拡張子で作成し、関連付け
- Doxyfile のあるフォルダーにコピーして、ダブルクリック
REM Tool settings SET PLANTUML_JAR=c:\jar\plantuml.jar SET RUN_UMLDOXY_RB=c:\jar\run_umldoxy.rb
skinparam の記述などで config ファイルを使いたい場合は config.txt の名前で、 run_umldoxy.rb と同じフォルダーに置いてください。
なお、スクリプト内部で行っている処理を詳しく書くと次のようなものです。
- Doxyfile の解析
- Doxyfile の一時ファイルを作成
- PlantUML 用の AREAS を設定
- IMAGE_PATH が指定されていない場合は Doxyfile のフォルダー直下の images フォルダーを指定
- PlantUML を実行
- Graphviz(dot) のパスが DOT_PATH で指定されていれば、そちらを使用
- IMAGE_PATH を出力フォルダーに指定
- INPUT, FILE_PATTERNS から入力ファイルを指定
- Doxygen を実行
その他のツールとの連携
doxygen 以外にも Word や Redmine など連携できるアプリがあります。- MS Word
- Eclipse
- Emacs
- Redmine
- PlantUML 編集用エディター
- その他
オンラインデモ
ネット上で確認できるオンラインデモサーバーが用意されています。 日本語にも対応していて、 ちょっと UML の記述を試して見るのに便利です。PlantUML - シーケンス図

@startuml{plantuml_seq_sample.png} title シーケンス図のサンプル hide footbox actor ユーザー as user participant 制御部 as control <<Control>> participant "<u>Loader</u>" as model <<Model>> participant 画面 as view <<View>> #98FB98 user -> control : 検索 activate control create model control -> model : << new >> control -> model : データ検索 activate model control <-- model : 検索結果 note right : ヒットしたものをリストで返します。 deactivate model destroy model control -> view : 表示(検索結果) activate view deactivate control loop 1, データ数 view -> view : データの表示 end view --> user deactivate view @enduml
メッセージ
メッセージは以下の形式で記述します。送り手 -> 受け手 : メッセージ名
受け手 <- 送り手 : メッセージ名
@startuml{plantuml_seq_base.png} Alice -> Bob: メッセージ @enduml

メッセージ種別と矢印の形状
メッセージ種別にあわせて、矢印の形状を変えることができます。記号 | 種別 | 説明 |
---|---|---|
<-, -> | 同期メッセージ | 戻りを待つメッセージ。通常のメッセージです。 |
<--, --> | 戻りメッセージ | メッセージの送り先からの戻り値 |
<<-, ->> | 非同期メッセージ | 同期されないメッセージ |
@startuml{plantuml_seq_arrow.png} Alice -> Bob: 同期メッセージ Alice <-- Bob: 戻りメッセージ Alice ->> Chuck: 非同期メッセージ @enduml

自己メッセージ
対象を同じにすれば、自己メッセージとなります。@startuml{plantuml_seq_self.png} Alice -> Alice: 自己メッセージ @enduml

外部とのメッセージ
送り手や受け手がダイアグラム上にない場合は [ または ] を使用します。@startuml{plantuml_seq_out.png} [-> A: DoWork A ->] : Request A<--] [<- A: Done @enduml

ライフライン
ライフラインの要素はメッセージの出現順に左から表示されます。要素名に記号などの英数字以外を使う場合には "(ダブルクオート) で囲みます。 日本語もシーケンス図の場合は不要です。(他の UML 図では必要)
ちなみにメッセージ名には " は不要で、書くとそのまま表示されます。
また、as キーワードで別名を付けることができます。
@startuml{plantuml_seq_lifeline.png} Alice -> "Bob : Human" Alice -> 太郎 Alice -> "I have a really\nlong name" as Long Alice <-- Long @enduml

ライフラインの定義
表示位置を変えたい場合や付加情報をつけたい場合には participant(actor) キーワードでライフラインの要素の定義を記述します。- 表示順の変更
-
participant の定義順に左から配置されます。
@startuml{plantuml_seq_participant.png} participant Bob participant Alice Alice -> Bob Alice <-- Bob @enduml
- アクター
-
棒人間を使いたい場合は participant ではなく actor を使用します。
@startuml{plantuml_seq_actor.png} actor Alice Alice -> Bob Alice <-- Bob @enduml
- 色
-
背景色を変えたい場合は
#色名 または #RGB値 で指定します。
@startuml{plantuml_seq_color.png} actor Bob #silver participant Alice participant "I have a really\nlong name" as Long #99FF99 Alice -> Bob Alice <-- Bob Alice -> Long Alice <-- Long @enduml
- ステレオタイプ
-
- ステレオタイプを記述したい場合は << ステレオタイプ名 >> を末尾に付けます。
@startuml{plantuml_seq_stereotype.png} participant "Famous Bob" as Bob << Generated >> participant Alice << Testable >> Bob->Alice: First message @enduml
- ステレオタイプを記述したい場合は << ステレオタイプ名 >> を末尾に付けます。
作成と消滅
オブジェクトの作成と生成には create, destroy キーワードを使用します。@startuml{plantuml_seq_newdestroy.png} participant "Main Window" as main create Loader main -> Loader : << 作成 >> main <-- Loader destroy Loader @enduml

実行状態
ライフラインの実行状態は activate と deactivate キーワードで指定します。@startuml{plantuml_seq_activate.png} User -> Foo: 処理を実行 activate Foo User <-- Foo deactivate Foo User -> Bar: 処理を実行 activate Bar #FFBBBB Bar -> Bar: 内部処理 activate Bar #DarkSalmon create Object Bar -> Object: << 作成 >> activate Object Bar <-- Object deactivate Object destroy Object deactivate Bar User <-- Bar: 完了 deactivate Bar @enduml

ノート
UML 図におけるコメントはノート(注意書き)を使います。このノートの記述方法を説明します。ちなみに PlantUML の記述でのコメントは '(シングルクオート) で始まる行です。
メッセージのノート
メッセージのノートはメッセージの直下に記述します。 記述は以下のような形式です。note 位置 [色] : コメント
note 位置 [色]位置は right または left で指定します。
コメント
end note
背景色を変えたい場合は #色名、#RGB 値 で指定します。
@startuml{plantuml_seq_notes.png}
'この行は PlantUML のコメントで無視されます。
Alice->Bob : hello
note left : 最初のメッセージに対するノート
Bob->Alice : ok
note right #aqua : 次のメッセージに対するノート
Bob->Bob : I am thinking
note left #FFAAAA
ブロックを使って定義した
複数行の長いノート
end note
@enduml

ライフラインのノート
ライフラインに対してノートを付ける場合には以下のキーワードを使用します。- note right of
- note left of
- note over
@startuml{plantuml_seq_notes_lifeline.png} participant Alice participant Bob note right of Alice: Alice の右側に表示 note left of Alice #aqua Alice の左側に表示 色も変更 end note note over Alice: Alice にまたがって表示 note over Alice, Bob : Bob と Alice の両方に\nまたがって表示 note over Bob, Alice #FFAAAA ブロックを使って定義した 複数行の名前のノート end note @enduml

複合フラグメントとグループ化 シーケンス図では、制御構造を表現するために複合フラグメントを使用します。 以下の表は PlantUML で使える複合フラグメントです。
キーワード | 意味 |
---|---|
alt/else | 条件分岐 |
opt | 条件を満たした場合のみ実行する処理 |
par | 並列処理 |
loop | ループ処理 |
break | 中断処理 |
critical | マルチスレッド環境などでの排他制御 |
キーワード [条件など]PlantUML では行頭の空白は無視するので、任意にインデントをつけることができます。
メッセージ
end
alt/else
条件分岐には alt および else を使用します。 正常系と異常系の処理といったシーケンスを書く場合などに使われます。@startuml{plantuml_seq_cf_alt.png} actor ユーザー as user participant ログイン画面 as login participant ユーザー情報 as userinfo user -> login : ログイン login -> userinfo : 認証チェック login <-- userinfo : チェック結果 alt 認証成功 user <- login : メインメニューを表示 else 認証失敗 user <- login : エラーメッセージを表示 end @enduml

opt
条件を満たした場合にのみ実行する処理には opt を使用します。 条件分岐と似ていますが、 else の処理がありません。@startuml{plantuml_seq_cf_opt.png} actor ユーザー as user participant メイン画面 as main opt 管理権限あり main -> main : 管理用メニューを追加 end user <- main : メニューを表示 @enduml

par
並列処理には par および else を使います。@startuml{plantuml_seq_cf_par.png} actor Bob Bob -> めざまし : 止める Bob <-- めざまし par Bob -> 歯ブラシ : 磨く Bob <-- 歯ブラシ else Bob -> 新聞: 読む Bob <-- 新聞 end @enduml

loop
ループ(繰り返し)処理は loop です。 loop の後は任意の文字列が使えますが、 UML としては [開始、終了] の形式で書かれます@startuml{plantuml_seq_cf_loop.png} actor 客 as guest loop 1, 商品数 guest -> 店員 : 商品 店員 -> レジ : バーコード入力 end 店員 <-- レジ : 合計金額 guest <-- 店員 : 合計金額 guest -> 店員 : お金 店員 -> レジ : お金 店員 <-- レジ : レシート guest <-- 店員 : レシート guest <-- 店員 : 商品 @enduml

break
break は中断処理を意味しており、 ループ処理などと一緒に使います。@startuml{plantuml_seq_cf_break.png} actor "客(未成年)" as guest loop 1, 商品数 guest -> 店員 : 商品 break 商品 = 酒 guest <- 店員 : 販売を拒否 end 店員 -> レジ : バーコード入力 end 店員 <-- レジ : 合計金額 guest <-- 店員 : 合計金額 guest -> 店員 : お金 店員 -> レジ : お金 店員 <-- レジ : レシート guest <-- 店員 : レシート guest <-- 店員 : 商品 @enduml

critical
マルチスレッド環境などで、排他制御の処理には critical を使います。@startuml{plantuml_seq_cf_critical.png} actor ユーザー as user participant 画面 as view participant データ as doc create view user -> view : 表示 view -> doc : データの読み取り view <-- doc : データ user <-- view user -> view : データの変更 user <-- view user -> view : 保存 critical view -> doc : データの書き込み view <-- doc end user <-- view destroy view @enduml

グループ化
PlantUML にない複合フラグメントを使いたい場合や単に処理をグループ化したい場合には、 group キーワードを使用します。ただし、条件などの説明を記述することはできません。
group グループ名
メッセージ
end
@startuml{plantuml_seq_cf_group.png} actor Bob Bob -> めざまし : 止める Bob <-- めざまし group 朝の準備 par Bob -> 歯ブラシ : 磨く Bob <-- 歯ブラシ else Bob -> 新聞: 読む Bob <-- 新聞 end Bob -> 服 : 着替える Bob <-- 服 end @enduml

シーケンス図の装飾
シーケンス図の見栄えなどの付加的な変更するための方法を説明します。タイトル
シーケンス図にタイトルを付けるには title キーワードを使います。title タイトル
title
タイトル
end title
@startuml{plantuml_seq_title.png} title 簡単なシーケンス図の例 Alice -> Bob: 認証要求 Bob --> Alice: 認証応答 @enduml

フッターの除去
フッターを取り除くには hide footbox キーワードを記述します。@startuml{plantuml_seq_footbox.png} hide footbox title フッターの除去 Alice -> Bob: 認証要求 Bob --> Alice: 認証応答 @enduml

スペース
スペースは以下の形式で記述します。|||
|| スペースのピクセル値 ||
@startuml{plantuml_seq_space.png} Alice -> Bob: message 1 Bob --> Alice: ok ||| Alice -> Bob: message 2 Bob --> Alice: ok ||45|| Alice -> Bob: message 3 Bob --> Alice: ok @enduml

分離線
分離線は以下の形式で記述します。== ラベル ==
@startuml{plantuml_seq_divider.png} == 初期化 == Alice -> Bob: 認証要求 Bob --> Alice: 認証応答 == 後処理 == Alice -> Bob: タスク開放 Alice <-- Bob @enduml

ボックス
box キーワードによって、ライフラインをボックスで囲むことができます。box [ラベル] [色]
participant または actor による定義
end box
@startuml{plantuml_seq_box.png} box "社内" #LightBlue actor エンジニア participant サポート end box participant 顧客 顧客 -> サポート : 問い合わせ サポート -> エンジニア : 問い合わせ エンジニア --> サポート : 回答 サポート --> 顧客 : 回答 @enduml

HTML タグ
ライフライン名、メッセージ名、ノート、タイトルといった要素の文字列では、 以下の HTML タグを使用することができます。タグ | 説明 |
---|---|
<b> | 太字 |
<u>, <u:色> | 下線 |
<w>, <w:色> | 波線の下線 |
<s>, <s:色> | 取り消し線 |
<color:色> | 文字色 |
<back:色> | 背景色 |
<size:ピクセル値> | フォントサイズ |
<img src="ファイルパス">, <img:ファイルパス> | 画像 |
@startuml{plantuml_seq_html.png} title <size:24><w>HTML タグ</w> のサンプル (<img:blogicon.png>)</size> end title participant Alice participant "The <i>Famous</i> Bob" as Bob Alice -> Bob : <u>かしこまった</u>挨拶 note right of Alice Alice の<u:blue>右</u>側に <back:cadetblue>表示</back>するノート end note note left of Bob <s:red>Alice</s> Bob の<b>左</b>側に <color:#118888>表示</color>するノート end note @enduml

参考
このページの記述には以下のサイトを参考にさせていただきました。PlantUML - クラス図
クラス図は Doxygen や CASE ツール等でも生成できますが、 パッケージなども書けますし、大まかな構成を記述する際に役に立ちます。

@startuml{plantuml_class_sample.png} title <size:18> クラス図 のサンプル </size> class Canvas package Geometry abstract Figure { #{static} const size_t ParseBufferSize = 256 +{abstract} size_t getPointsNum() +{static} Figure *ParseString(const char *str) } Figure "0..*" o- "1" Canvas : 集約 Figure <|-- Rect : 汎化 Figure <|-- Polygon Rect <|-- Ellipse end package @endumlタイトル(title)、 HTML タグ に関してはシーケンス図の説明を参照してください。
クラスの関係
クラスの関連は以下の形式で書きます。クラス名 線種の記号 クラス名 [: ラベル]クラス名に英数字以外を使いたい場合は "(ダブルクオート) で囲みます。
日本語の場合は " がないとうまく表示されない場合があるので、囲っておいた方が安全です。
@startuml{plantuml_class_relation.png} ClassA -- "Class B" "クラスC" -- "Class\nD" : 関係 @enduml

クラスの関係と線種
クラス間の関係と線種は次のようになります。記号 | 線種 | 関係 |
---|---|---|
-- | 実線 | 関連 |
<-- | 矢印 実線 | |
<|-- | 白抜き矢印 実線 | 汎化 |
<|.. | 白抜き矢印 破線 | 実現 |
o-- | 白抜き菱形 実線 | 集約 |
*-- | 黒塗り菱形 実線 | コンポジション、合成 |
<.. | 矢印 破線 | 依存 |
.. | 破線 | (ノートで使用されます) |
デフォルトはシーケンス図で、シーケンス図にない記号がつかわれたり、 次章のクラス定義があった場合にクラス図となります。
- 関連
-
クラス間になんらかの関連がある関係です。一番意味の広い関係です。
矢印は誘導可能性です。 矢印の方向にのみ関連があります。 実装レベルでいえば、ヘッダーをインクルードする必要があるかといった関係になります。
矢印がない場合は方向が不明であるか、双方向に関連しています。
@startuml{plantuml_class_assocation.png} Control -- View Control --> Model @enduml
- 汎化と実現
-
汎化は抽象化ともいい、継承(is-a)関係の逆になります。
汎化も関連の一種です。 継承の方がわかりやすいですが、 基底クラスは派生クラスを関知しないため、矢印の向きにあう汎化となります。
基底クラスがインターフェースや抽象クラスで、 派生クラスがその振る舞いを実装する場合、特に実現といいます。
@startuml{plantuml_class_is_a.png} "図形" <|-- "四角形" : 汎化 Comparable <|.. ComplexNumber : 実現 @enduml
- 集約と合成
-
集約は全体と部分といった包含(has-a)関係です。
合成は結合の強い集約で、全体と部品といった関係になります。
@startuml{plantuml_class_has_a.png} "駐車場" o-- "自動車" : 集約 "車" *-- "タイヤ" : 合成 "車" *--> "エンジン" : 合成(矢印付き) @enduml
- 依存
- 変更すると他方にも変更が生じるような関係です。
@startuml{plantuml_class_depend.png} "残量メーター" ..> "燃料タンク" : 依存 @enduml
線の長さと矢印の向き
例えば関連の矢印の場合 <-, <--, <--- というように - や . はいくつ書いてもかまいません。この長さ(文字数)はレイアウトの向きと相対的な長さに使われます。
文字数 | 向き |
---|---|
1 | 横 |
2 | 縦 |
@startuml{plantuml_class_linelength.png} Foo - Bar1 Foo -- Bar2 Foo --- Bar3 @enduml

また、 -position- と書く事によって、関係の方向を明示的に指定することもできます。 position には以下のキーワードが使えます。
方向 | キーワード |
---|---|
上 | up, u |
下 | down, d, do |
左 | left, l, le |
右 | right, r, ri |
@startuml{plantuml_class_line_direction.png} Foo -up-> 上 Foo -do-> 下 Foo -le-> 左 Foo -ri-> 右 @enduml

多重度
関係の多重度を記述する場合には関係の前後に記述します。クラス名 "多重度" 線種 "多重度" クラス名 [: ラベル]
@startuml{plantuml_class_multi.png} Car "1" *-- "4" Tire "車" "1" o-- "0..*" "駐車場" : 1 対 多 @enduml

クラス定義
クラス定義は省略するできますが、 class キーワードで明示的に記述することもできます。シーケンス図と同様に色名の指定、別名(as)を付けることもできます。 ただし、この場合は "" で囲う必要があります。
@startuml{plantuml_class_define.png} class Rect class "Figure" as fig #E0FFFF fig <|-- Rect @enduml

メンバーの追加
属性(メンバー変数)やメソッド(メンバー関数)は : を使って追加するか、クラス定義時に {} 内に記述します。クラス名 : メンバー
class クラス名 {属性かメソッドはメンバーの () の有無で判断しています。
メンバー
}
@startuml{plantuml_class_member.png} class Node { size_t getElementNum() Element *getElement(size_t id) std::vector<Element*> m_elements } Element <|-- Node Element: getName() @enduml

可視性
private などの可視性の指定はメンバーの前に記号を付けます。記号 | 可視性 |
---|---|
- | private |
# | protected |
~ | package private |
+ | public |
@startuml{plantuml_class_visibility.png} class Foo { -m_field #method1() ~method2() +method3() } @enduml

可視性のアイコンを表示したくない場合には skinparam で指定してください。
抽象(純粋仮想)関数とクラスメンバー
メソッドが抽象(純粋仮想)関数 の場合には {abstract} をつけます。クラス変数やクラス関数の場合には {classifier} または {static} で指定します。
@startuml{plantuml_class_abst.png} class Figure { {abstract} size_t getPointsNum() {static} Figure *ParseString(const char *str) {static} const size_t ParseBufferSize = 256 } @enduml

特殊クラスの定義
クラス定義は class キーワードだけでなく、特殊な型(クラス)用のキーワードも用意されています。キーワード | 型 |
---|---|
abstract, abstract class | 抽象クラス |
interface | インターフェースクラス |
enum | 列挙型 |
@startuml{plantuml_class_specclass.png} enum FigureType { FigureType_unknown=-1 FigureRect FigurePolygon FigureEllipse } abstract Figure class Rect interface Comparable { {abstract} int compare(Comparable *other) } Figure <|-- Rect Rect .|> Comparable @enduml

スポットとステレオタイプ
シーケンス図と同様にクラス定義の後にステレオタイプを書く事ができます。また、ステレオタイプで C, I, A, E 以外のスポットを指定することができます。
class クラス名 <<(スポット文字, 色) [ステレオタイプ名]>>
@startuml{plantuml_class_spot.png} class System << (S,#FF7700) Singleton >> class Date << (D,violet) >> @enduml

ロリポップ
インターフェースクラスを実現する場合で、 インターフェイスを提供しているということを強調するために、 ロリポップ(棒付きキャンディー)で省略表記することがあります。PlantUML でロリポップとして表示するには、関係の線種に ()-- を使います。
@startuml{plantuml_class_lollipop.png} Comparable ()-- RationalNumber @enduml

ただし、インターフェースを介して利用するクラスとインターフェース間の関係ではロリポップを使ったリンクはできません。

テンプレート(ジェネリック)
テンプレート(ジェネリック)クラスは < > を使って表現します。@startuml{plantuml_class_template.png} class HashMap<Key:Class, Value:Class> { Value &getValue(const Key &key) } HashMap *- Element @enduml

パッケージ
パッケージ定義
パッケージを記述する場合には package キーワードを使用します。package パッケージ名 {
クラス定義や関係
}
package パッケージ名クラス定義と同様に色指定なども使用できます。
クラス定義や関係
end package
@startuml{plantuml_class_pkgdef.png} package "Classic Collections" #DDDDDD { Object <|-- ArrayList } package net.sourceforge.plantuml Object <|-- Demo1 Demo1 *- Demo2 end package @enduml

パッケージスタイル
パッケージのスタイルはデフォルトのフォルダースタイルだけでなく、 ステレオタイプで指定することによって、形状を変えることができます。@startuml{plantuml_class_pkgstyle1.png} package node <<Node>> { class Class1 } package rect <<Rect>> { class Class2 } package "folder (default)" <<Folder>> { class Class3 } @enduml
@startuml{plantuml_class_pkgstyle2.png} package frame <<Frame>> { class Class4 } package cloud <<Cloud>> { class Class5 } package database <<Database>> { class Class6 } @enduml


ネームスペース
同じ名前のクラス名をネームスペースで分けて定義することはあると思います。 これをクラス図で実現するには namespace キーワードを使用します。 namespace キーワードは package と同じようなスタイルで記述します。ネームスペースをまたいだクラス関係を記述する場合には . (ピリオド) でつないで "ネームスペース名"."クラス名" といった形式でクラスを指定します。
@startuml{plantuml_class_namespace.png} abstract class AbstractPerson namespace net.dummy #DDDDDD .AbstractPerson <|-- Person 'ネームスペース外のクラスは指定するには前に . 'つけていないとネームスペース内で新しいクラス要素を作る Meeting o-- Person .AbstractPerson <|- Meeting end namespace namespace net.foo { net.dummy.Person <|- Person .AbstractPerson <|-- Person net.dummy.Meeting o-- Person } AbstractPerson <|-- net.auto.Person 'namespace の定義なしで作成 @enduml

ノート
クラスに対するノート
クラスに対してノート(コメント)を付けることができます。note position of クラス : コメント
クラス定義position には以下のキーワードのいづれかを指定します。
note position : コメント
- top
- bottom
- left
- right
@startuml{plantuml_class_noteclass.png} class Bar note right Bar に対する クラス end note Foo - Bar note top of Foo : Foo に対する\nノート 'right を指定するとエラー @enduml

この方法では表示できない方向にノートを付けるとエラー終了してしまいます。 次の方法でノートを付ける方がお勧めです。
関係を使ったノート
別名をつけてノートの要素を作り、 それをクラスにリンクさせることによってコメントをつけます。@startuml{plantuml_class_noterelation.png}
abstract Object
Object <|--- ArrayList
note "Object に対するノート" as NO
Object . NO
note as N2
複数の対象に
関連づけられたノート
end note
Object .. N2
N2 .. ArrayList
note "対象が指定されていない\n フローティングノート" as NF
'使わない場合でも別名をつけないと解析エラー
@enduml

リンクへのノート
クラスの関係の記述の直下にノートを書くと関係のリンクへのノートとなります。クラス関係の記述
note [position] on link : コメント
@startuml{plantuml_class_notelink.png} class Dummy Dummy --> Foo : A link note on link #red: 赤い背景色のノート Dummy --> Bar : Another link note right on link #E0FFFF 右側に配置した ノート end note @enduml

オブジェクト図
オブジェクト図はクラス図とほぼ同じです。class の代わりにobject を使うとオブジェクト図となります。 ただし、 ブロックによる定義では英数字しか使えないため、 それ以外の文字を使いたい場合は一度 as で別名を付けた後、メンバーを追加する必要があります。
@startuml{plantuml_class_object.png} object foo { id = 1234 name = "Alice" } object "<u>bar:Bar</u>" as bar bar : id = 4321 bar : name = "Bob" @enduml

パッケージ図
PlantUML にはパッケージ図は特に用意されていません。 しかし、空のパッケージやパッケージ間のリンクもできるため、 クラス図で代用することができます。ただし、パッケージ - クラス間のリンクはできません。
@startuml{plantuml_class_package_diagram.png} package 検索処理 end package package 描画処理 { } 検索処理 .> 描画処理 : <<import>> package "入出力処理" as io { } 検索処理 ..> io : <<access>> package データベース { } io +-- データベース @enduml

参考
このページの記述には以下のサイトを参考にさせていただきました。- PlantUML の本家のページ
- UML 超入門_第 2 章
- UML クラス図: ガイドライン
- 連載:【改訂版】初歩の UML 第 5 回
- パッケージ図(Package Diagram) - UML入門 - IT専科