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専科
PlantUML - ユースケース図
UML としては
ユースケース図はクラス図の特化したものであるため、 PlantUML でも クラス図 とほとんど同じように書けます。

@startuml{plantuml_usecase_sample.png} title <size:18>ユースケース図のサンプル</size> left to right direction actor :社員: as user actor :総務: as admin actor :データベース: as DB note "次のバージョンで\n対応" as next user <|-- admin : 汎化 package "勤怠管理システム" <<Rect>> usecase (<u>勤怠入力</u>\n 拡張点\n 早退、遅刻) as input user -- (出社) (出社) -- input input <.. (早退理由入力) : <<extend>> (早退理由入力) .. next (早退理由入力) -- DB user -- (帰宅) (帰宅) -- input input ..> (社員認証) : <<include>> (社員認証) -- DB admin -- (勤怠変更) (勤怠変更) ..> (社員認証) : <<include>> (勤怠変更) -- DB end package @endumlタイトル(title)、 HTML タグ に関してはシーケンス図、 ノート(note) に関してはクラス図の説明を参照してください。
ユースケース
ユースケースは ( ) または usecase キーワードで記述します。(ユースケース名)( ) はクオートの役目もしているので、 usecase キーワードを使う場合も記号のような英数字以外の文字を使う場合には ( ) で囲みます。
usecase ユースケース名
また、 シーケンス図、クラス図のように別名(as)、ステレオタイプなども使えます。 (ただし、色指定はできません)
@startuml{plantuml_usecase_def.png} (First usecase) (機能) usecase Payment usecase (Long name\nusecase) as Long usecase (check in) as ci <<Command>> @enduml

PlantUML では UML ダイアログの指定はありません。 ( ) や usecase などの定義でユースケース図と判断します。
アクター
棒人間を使いたい場合は ( ), usecase ではなく : :, actor を使用します。: : 省略時もアクターと判断されますが、 ユースケース図と判断できるキーワードは何か入れておく必要があります。
@startuml{plantuml_usecase_actor.png} :First actor: :ユーザー: actor DB actor :Long name\nactor: as Long Client as cl <<Human>> @enduml

関係
ユースケース間の関係を記述は次の形式で記述します。ユースケース名 -- ユースケース名 [: ラベル]ユースケース間を結ぶ線には --(実線) 以外にも クラス図で使えるもの と同じものが使用できます。
関係の記述で書いたユースケース、アクターは前述の定義がなくても 自動的に作成されます。
@startuml{plantuml_usecase_relation.png} (アプリケーションの使用) as use User - (開始) User -- use : 関係を表すラベル :Main Admin: --- use : 複数行の\nラベル @enduml

レイアウト
- 線の長さ
-
関係の線は -, --, --- というようにいくつ書いてもかまいません。
この長さ(文字数)はレイアウトの向きと相対的な長さに使われます。
文字数 向き 1 横 2 縦 @startuml{plantuml_usecase_line_length.png} User - (Usecase 1) User -- (Usecase 2) User --- (Usecase 3) @enduml
- レイアウトの方向
-
配置の方向は線の長さで変わるのですが、これ変えるためには以下のキーワードを使用します。
キーワード 方向 left to right direction 水平 top to bottom direction 垂直
User -- (Usecase A) User -- (Usecase B)
left to right direction User -- (Usecase A) User -- (Usecase B)
- 配置の方向
-
-position- と書く事によって、関係の方向を直接指定することもできます。
position には以下のキーワードが使えます。方向 キーワード 上 up, u 下 down, d, do 左 left, l, le 右 right, r, ri @startuml{plantuml_usecase_line_direction.png} User -up- (上) User -do- (下) User -le- (左) User -ri- (右) @enduml
サブジェクト
サブジェクトとは、開発対象であるシステムです。 これを表現するには package キーワードを使用します。@startuml{plantuml_usecase_subject.png} left to right direction actor :利用者: as user actor :図書館職員: as admin package "図書館" <<Rect>> { user -- (本を借りる) (本を借りる) -- admin user -- (本を返却する) (本を返却する) -- admin (本を登録する) -- admin } @enduml

パッケージはデフォルトでは Folder スタイルのため、 ステレオタイプで Rect スタイルに変更しています。 これは skinparam を使って指定することもできます。
汎化、包含、拡張
ユースケース図では関連をより特殊化した関係が使われることがあります。関係 | 記述 |
---|---|
汎化 | <|-- |
包含 | 依存(<..)、ラベルを <<include>> |
拡張 | 依存(<..)、ラベルを <<extend>> |
汎化
クラス図の汎化 と同じで、抽象化(継承の逆)した関係です。@startuml{plantuml_usecase_generalization.png} :社員: <|-- :総務: (本を借りる) <|-- (自動貸し出し) (本を借りる) <|-- (手動貸し出し) @enduml

包含
包含はあるユースケースが他のユースケースを利用する場合に使用します。@startuml{plantuml_usecase_include.png} (勤怠入力) .> (社員認証) : <<include>> @enduml

拡張
拡張は包含と違い、ある条件の時だけ利用する場合に使用します。@startuml{plantuml_usecase_extend.png} (勤怠入力) .> (早退理由入力) : <<extend>> @enduml

UML では利用する条件を 拡張点(Extension points) として記入します。 PlantUML では特に拡張点用の記述は用意されていないのですが、 がんばって書くと次のようになります。
@startuml{plantuml_usecase_extend2.png} usecase (<u>勤怠入力</u>\n拡張点\n早退、遅刻) as input input .> (早退理由入力) : <<extend>> @enduml

参考
このページの記述には以下のサイトを参考にさせていただきました。- PlantUML の本家のページ
- Use Case図
- [Think IT] 第2回:ユースケース図を学ぼう! (1/3)
- 誤解しがちなモデリングの技:第 5 回:ユースケース図にまつわるアレコレ | 豆蔵ソフト工学ラボ