PlantUML の使い方

テキストから UML を生成する PlantUML についての解説記事を書いてみました。


今回は PlantUML の使い方の説明です。
  1. PlantUML とは
  2. インストール
  3. 日本語
  4. コマンドライン
  5. Doxygen との連携
  6. Doxygen 連携用スクリプト
  7. その他のツールとの連携
  8. オンラインデモ

PlantUML とは

最近、プログラムの設計書などで UML を使うのが浸透してきていますが、 この UML を書くのはわりと面倒です。
CASE ツール, Doxygen などでは、クラス図を自動生成してくれますが、 ユースケース図やシーケンス図は自分で書く必要があります。

PlantUML はテキストから UML のダイアログを作成するフリーのツールです。 これを使えば UML をテキストでサクサク書けるようになります。 テキスト派としてはうれしいツールです。


例えば、次のようなテキストからシーケンス図が作成できます。
@startuml plantuml_simple.png

Foo -> Bar : メッセージ
Foo <-- Bar

@enduml
simple sample

PlantUML には次のような利点があります。
  • 素早く書ける
    • UML 図の作成がかなり速くなります。
      WYSIWYG のわかりやすさを否定する気はありませんが、 キーボードとマウスの往復はやはり面倒なものです。
      また、ツールと組み合わせれば、図を確認しながら書く事もできます。

  • ソースのコメントに書ける
    • ソースに書けるので、 Doxygen と組み合わせてドキュメントを作成するといったこともできます。
      設計書と実際のソースとの乖離というのはよくあることです。 コメントとの乖離もめずらしくないですが、 比較的乖離の危険性は少なくなります

  • マージが可能
    • Git など最近 はやりの分散型バージョン管理システムではファイルをロックすることができません。 そのため、バイナリや XML ファイルの管理には不向きです。
      PlantUML はテキストで書くので、分散型バージョン管理システムでも使えます

  • ツールとの連携
    • コマンドラインプログラムなので、 Doxygen を始め、 Word, Redmine といったいろいろなアプリケーションとの連携もできます。


いいところばかりではなく、欠点もあります。
  • 細かいレイアウトができない
    • レイアウトはある程度、自分で考えて作ってくれるので、 速く書ける分、自由にレイアウトすることができません。

  • 記法を覚える必要がある
    • わりと直感的に書けるようになっているため、 覚えるのはそれほど大変ではありませんが、 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
別の場所にインストールされている場合などで、上記以外のパスの dot を使いたい時には次の 2 つの方法のどちらかでパスを指定します。
  • 環境変数 GRAPHVIZ_DOT
  • 起動時のオプション -graphvizdot
dot がちゃんと使えるようになっているかどうかは、以下のコマンドで確認できます。
 $ 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 と連携して使用するためには、以下の手順となります。
  1. コメント内に UML 定義を記述
    • 定義部分は Doxygen 用のコメントとならないようにする
    • PlantUML の出力画像を表示するように指定
  2. PlantUML で画像ファイルを作成
  3. 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 を同じフォルダーに置いてください。

次のような使い方ができます。
  1. ショートカットをディスクトップに作成し、 Doxyfile をドラッグ &ドロップ
  2. Doxyfile を .doxy のような拡張子で作成し、関連付け
  3. Doxyfile のあるフォルダーにコピーして、ダブルクリック
2, 3 番目の場合はバッチファイル内の plantuml.jar と run_umldoxy.rb のパスをフルパスに書き直してください。
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 と同じフォルダーに置いてください。

なお、スクリプト内部で行っている処理を詳しく書くと次のようなものです。
  1. Doxyfile の解析
  2. Doxyfile の一時ファイルを作成
    • PlantUML 用の AREAS を設定
    • IMAGE_PATH が指定されていない場合は Doxyfile のフォルダー直下の images フォルダーを指定
  3. PlantUML を実行
    • Graphviz(dot) のパスが DOT_PATH で指定されていれば、そちらを使用
    • IMAGE_PATH を出力フォルダーに指定
    • INPUT, FILE_PATTERNS から入力ファイルを指定
  4. Doxygen を実行

その他のツールとの連携

doxygen 以外にも Word や Redmine など連携できるアプリがあります。

オンラインデモ

ネット上で確認できるオンラインデモサーバーが用意されています。 日本語にも対応していて、 ちょっと UML の記述を試して見るのに便利です。

 

PlantUML - シーケンス図

PlantUML におけるシーケンス図の書き方について説明します。
  1. メッセージ
  2. ライフライン
  3. ノート(コメント)
  4. 複合フラグメントとグループ化
  5. シーケンス図の修飾
  6. 参考

sequence sample
@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
base sample(SVG を使っています。 IE 9 以上または他のモダンブラウザで見てください)

メッセージ種別と矢印の形状

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

Alice -> Bob: 同期メッセージ
Alice <-- Bob: 戻りメッセージ

Alice ->> Chuck: 非同期メッセージ

@enduml
arrow sample

自己メッセージ

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

Alice -> Alice: 自己メッセージ

@enduml
self message sample

外部とのメッセージ

送り手や受け手がダイアグラム上にない場合は [ または ] を使用します。
@startuml{plantuml_seq_out.png}

[-> A: DoWork

A ->] : Request
A<--]

[<- A: Done

@enduml
found lost sample

ライフライン

ライフラインの要素はメッセージの出現順に左から表示されます。

要素名に記号などの英数字以外を使う場合には "(ダブルクオート) で囲みます。 日本語もシーケンス図の場合は不要です。(他の UML 図では必要)
ちなみにメッセージ名には " は不要で、書くとそのまま表示されます。

また、as キーワードで別名を付けることができます。
@startuml{plantuml_seq_lifeline.png}

Alice -> "Bob : Human"
Alice -> 太郎
Alice -> "I have a really\nlong name" as Long
Alice <-- Long

@enduml
lifeline name sample

ライフラインの定義

表示位置を変えたい場合や付加情報をつけたい場合には participant(actor) キーワードでライフラインの要素の定義を記述します。
表示順の変更
participant の定義順に左から配置されます。
@startuml{plantuml_seq_participant.png}
participant Bob
participant Alice

Alice -> Bob
Alice <-- Bob

@enduml
participant sample
アクター
棒人間を使いたい場合は participant ではなく actor を使用します。
@startuml{plantuml_seq_actor.png}
actor Alice

Alice -> Bob
Alice <-- Bob

@enduml
actor sample
背景色を変えたい場合は #色名 または #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
color sample
ステレオタイプ
ステレオタイプを記述したい場合は << ステレオタイプ名 >> を末尾に付けます。
@startuml{plantuml_seq_stereotype.png}
participant "Famous Bob" as Bob << Generated >>
participant Alice << Testable >>

Bob->Alice: First message

@enduml
stereotype sample

作成と消滅

オブジェクトの作成と生成には create, destroy キーワードを使用します。
@startuml{plantuml_seq_newdestroy.png}
participant "Main Window" as main

create Loader
main -> Loader : << 作成 >> 
main <-- Loader
destroy Loader

@enduml
new destroy sample

実行状態

ライフラインの実行状態は activatedeactivate キーワードで指定します。
@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
activate sample

ノート

UML 図におけるコメントはノート(注意書き)を使います。このノートの記述方法を説明します。

ちなみに PlantUML の記述でのコメントは '(シングルクオート) で始まる行です。

メッセージのノート

メッセージのノートはメッセージの直下に記述します。 記述は以下のような形式です。
note 位置 [色] : コメント
note 位置 [色]
  コメント
end note
位置は right または left で指定します。
背景色を変えたい場合は #色名#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
notes message sample

ライフラインのノート

ライフラインに対してノートを付ける場合には以下のキーワードを使用します。
  • 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
notes lifeline sample

複合フラグメントとグループ化 シーケンス図では、制御構造を表現するために複合フラグメントを使用します。 以下の表は PlantUML で使える複合フラグメントです。

キーワード 意味
alt/else 条件分岐
opt 条件を満たした場合のみ実行する処理
par 並列処理
loop ループ処理
break 中断処理
critical マルチスレッド環境などでの排他制御
次の形式で記述します。
キーワード [条件など]
  メッセージ
end
PlantUML では行頭の空白は無視するので、任意にインデントをつけることができます。

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
alt sample

opt

条件を満たした場合にのみ実行する処理には opt を使用します。 条件分岐と似ていますが、 else の処理がありません。
@startuml{plantuml_seq_cf_opt.png}
actor ユーザー as user
participant メイン画面 as main

opt 管理権限あり
  main -> main : 管理用メニューを追加
end

user <- main : メニューを表示

@enduml
opt sample

par

並列処理には par および else を使います。
@startuml{plantuml_seq_cf_par.png}
actor Bob

Bob -> めざまし : 止める
Bob <-- めざまし

par
  Bob -> 歯ブラシ : 磨く
  Bob <-- 歯ブラシ
else
  Bob -> 新聞: 読む
  Bob <-- 新聞
end

@enduml
par sample

loop

ループ(繰り返し)処理は loop です。 loop の後は任意の文字列が使えますが、 UML としては [開始、終了] の形式で書かれます
@startuml{plantuml_seq_cf_loop.png}
actor 客 as guest

loop 1, 商品数
  guest -> 店員 : 商品
  店員 -> レジ : バーコード入力
end
店員 <-- レジ : 合計金額
guest <-- 店員 : 合計金額
guest -> 店員 : お金
店員 -> レジ : お金
店員 <-- レジ : レシート
guest <-- 店員 : レシート
guest <-- 店員 : 商品

@enduml
loop sample

break

break は中断処理を意味しており、 ループ処理などと一緒に使います。
@startuml{plantuml_seq_cf_break.png}
actor "客(未成年)" as guest

loop 1, 商品数
  guest -> 店員 : 商品
  break 商品 = 酒
    guest <- 店員 : 販売を拒否
  end
  店員 -> レジ : バーコード入力
end
店員 <-- レジ : 合計金額
guest <-- 店員 : 合計金額
guest -> 店員 : お金
店員 -> レジ : お金
店員 <-- レジ : レシート
guest <-- 店員 : レシート
guest <-- 店員 : 商品

@enduml
break sample

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
critical sample

グループ化

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
group sample

シーケンス図の装飾

シーケンス図の見栄えなどの付加的な変更するための方法を説明します。

タイトル

シーケンス図にタイトルを付けるには title キーワードを使います。
title タイトル
title
  タイトル
end title
@startuml{plantuml_seq_title.png}

title 簡単なシーケンス図の例

Alice -> Bob: 認証要求
Bob --> Alice: 認証応答

@enduml
title sample

フッターの除去

フッターを取り除くには hide footbox キーワードを記述します。
@startuml{plantuml_seq_footbox.png}

hide footbox
title フッターの除去

Alice -> Bob: 認証要求
Bob --> Alice: 認証応答

@enduml
remove footer sample

スペース

スペースは以下の形式で記述します。
|||
|| スペースのピクセル値 ||
@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
space sample

分離線

分離線は以下の形式で記述します。
== ラベル ==
@startuml{plantuml_seq_divider.png}

== 初期化 ==

Alice -> Bob: 認証要求
Bob --> Alice: 認証応答

== 後処理 ==

Alice -> Bob: タスク開放
Alice <-- Bob

@enduml
divider sample

ボックス

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

顧客 -> サポート : 問い合わせ
サポート -> エンジニア : 問い合わせ

エンジニア --> サポート : 回答
サポート --> 顧客 : 回答

@enduml
box sample

HTML タグ

ライフライン名、メッセージ名、ノート、タイトルといった要素の文字列では、 以下の HTML タグを使用することができます。
タグ 説明
<b> 太字
<u>, <u:色> 下線
<w>, <w:色> 波線の下線
<s>, <s:色> 取り消し線
<color:色> 文字色
<back:色> 背景色
<size:ピクセル値> フォントサイズ
<img src="ファイルパス">, <img:ファイルパス> 画像
色は要素の背景色のように RGB 値または色名で指定します。ただし、色名の前に # は付けません。
@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
html tag sample

参考

このページの記述には以下のサイトを参考にさせていただきました。
 

PlantUML - クラス図

PlantUML でのクラス図の記法についての解説です。
クラス図は Doxygen や CASE ツール等でも生成できますが、 パッケージなども書けますし、大まかな構成を記述する際に役に立ちます。
  1. クラスの関係
  2. クラス定義
  3. パッケージ
  4. ノート
  5. オブジェクト図
  6. パッケージ図
  7. 参考
Class diagram sample
@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
Relation sample

クラスの関係と線種

クラス間の関係と線種は次のようになります。
記号 線種 関係
-- 実線 関連
<-- 矢印 実線
<|-- 白抜き矢印 実線 汎化
<|.. 白抜き矢印 破線 実現
o-- 白抜き菱形 実線 集約
*-- 黒塗り菱形 実線 コンポジション、合成
<.. 矢印 破線 依存
.. 破線 (ノートで使用されます)
PlantUML では UML のどの図を使うかの指定はありません。
デフォルトはシーケンス図で、シーケンス図にない記号がつかわれたり、 次章のクラス定義があった場合にクラス図となります。

関連
クラス間になんらかの関連がある関係です。一番意味の広い関係です。

矢印は誘導可能性です。 矢印の方向にのみ関連があります。 実装レベルでいえば、ヘッダーをインクルードする必要があるかといった関係になります。
矢印がない場合は方向が不明であるか、双方向に関連しています。
@startuml{plantuml_class_assocation.png}

Control -- View
Control --> Model

@enduml
Assocation sample
汎化と実現
汎化は抽象化ともいい、継承(is-a)関係の逆になります。
汎化も関連の一種です。 継承の方がわかりやすいですが、 基底クラスは派生クラスを関知しないため、矢印の向きにあう汎化となります。

基底クラスがインターフェースや抽象クラスで、 派生クラスがその振る舞いを実装する場合、特に実現といいます。
@startuml{plantuml_class_is_a.png}

"図形" <|-- "四角形" : 汎化
Comparable <|.. ComplexNumber : 実現

@enduml
is a sample
集約と合成
集約は全体と部分といった包含(has-a)関係です。
合成は結合の強い集約で、全体と部品といった関係になります。
@startuml{plantuml_class_has_a.png}

"駐車場" o-- "自動車" : 集約
"車" *-- "タイヤ" : 合成
"車" *--> "エンジン" : 合成(矢印付き)

@enduml
has a sample
依存
変更すると他方にも変更が生じるような関係です。
@startuml{plantuml_class_depend.png}

"残量メーター" ..> "燃料タンク"  : 依存

@enduml
depend sample

線の長さと矢印の向き

例えば関連の矢印の場合 <-, <--, <--- というように - や . はいくつ書いてもかまいません。
この長さ(文字数)はレイアウトの向きと相対的な長さに使われます。
文字数 向き
1
2
@startuml{plantuml_class_linelength.png}

Foo - Bar1
Foo -- Bar2
Foo --- Bar3

@enduml
linelength sample

また、 -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
Line direction sample

多重度

関係の多重度を記述する場合には関係の前後に記述します。
クラス名 "多重度" 線種 "多重度" クラス名 [: ラベル]
@startuml{plantuml_class_multi.png}

Car "1" *-- "4" Tire
"車" "1" o-- "0..*" "駐車場" : 1 対 多

@enduml
Multiplicity sample

クラス定義

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

fig <|-- Rect

@enduml
Class define sample

メンバーの追加

属性(メンバー変数)やメソッド(メンバー関数)は : を使って追加するか、クラス定義時に {} 内に記述します。
クラス名 : メンバー
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
Member sample

可視性

private などの可視性の指定はメンバーの前に記号を付けます。
記号 可視性
- private
# protected
~ package private
+ public
@startuml{plantuml_class_visibility.png}
class Foo {
    -m_field
    #method1()
    ~method2()
    +method3()
}
@enduml
Visibility sample
可視性のアイコンを表示したくない場合には 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
Abstract Static sample

特殊クラスの定義

クラス定義は 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
Special class sample

スポットとステレオタイプ

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

@enduml
Spot sample

ロリポップ

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

@startuml{plantuml_class_lollipop.png}

Comparable ()-- RationalNumber

@enduml
Lollipop sample

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

テンプレート(ジェネリック)

テンプレート(ジェネリック)クラスは < > を使って表現します。
@startuml{plantuml_class_template.png}

class HashMap<Key:Class, Value:Class> {
    Value &getValue(const Key &key)
}

HashMap *- Element

@enduml
Template sample

パッケージ

パッケージ定義

パッケージを記述する場合には 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
Package define sample

パッケージスタイル

パッケージのスタイルはデフォルトのフォルダースタイルだけでなく、 ステレオタイプで指定することによって、形状を変えることができます。
@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
Package style sample 1 Package style sample 2

ネームスペース

同じ名前のクラス名をネームスペースで分けて定義することはあると思います。 これをクラス図で実現するには 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
Namespace sample

ノート

クラスに対するノート

クラスに対してノート(コメント)を付けることができます。
note position of クラス : コメント
クラス定義
note position : コメント
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
Notes for class sample
この方法では表示できない方向にノートを付けるとエラー終了してしまいます。 次の方法でノートを付ける方がお勧めです。

関係を使ったノート

別名をつけてノートの要素を作り、 それをクラスにリンクさせることによってコメントをつけます。
@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
Notes by relation sample クラスの関係の記述の直下にノートを書くと関係のリンクへのノートとなります。
クラス関係の記述
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
Notes for link sample

オブジェクト図

オブジェクト図はクラス図とほぼ同じです。
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
Object diagram sample

パッケージ図

PlantUML にはパッケージ図は特に用意されていません。 しかし、空のパッケージパッケージ間のリンクもできるため、 クラス図で代用することができます。
ただし、パッケージ - クラス間のリンクはできません。
@startuml{plantuml_class_package_diagram.png}

package 検索処理
end package

package 描画処理 {
}

検索処理 .> 描画処理 : <<import>>

package "入出力処理" as io {
}

検索処理 ..> io : <<access>>

package データベース {
}

io +-- データベース

@enduml
Package diagram sample

参考

このページの記述には以下のサイトを参考にさせていただきました。
 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
73位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
10位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

08月 | 2012年09月 | 10月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。