🌝

PlantUMLのシーケンス図の書き方まとめ

2020/09/22に公開

この記事は、PlantUMLでシーケンス図を書くときに必要になる情報をまとめたものです。

PlantUMLとは

簡単なコードによる記述でUMLの様々な図が作成できるツールです。
UMLを活用する上での課題である「メンテナンスしていくのが困難」という点を、コードで記述するという手法によって解決することを試みています。

https://plantuml.com/en/sequence-diagram

シーケンス図とは

一連の処理の実現方法を参加者間の相互作用で表すことができます。
設計時にどのクラスにどういうメッセージ(責務)を割り当てるかの検討や、既存の実装がどういう相互作用で実現されているかを整理するためなど、
色々な使い方ができる図です。

インターネット記事投稿サービスの「記事を検索する」処理をどう実現させるかを設計する想定で図を作成してみました。

問題領域寄りの図

フレームワークなど、特定の技術要素に依存しない抽象的なシーケンス図です。

@startuml
/' define participants '/
actor ユーザー
boundary ホーム画面
boundary 検索ビュー
boundary 検索結果画面
entity 記事検索
entity 記事一覧

/' messages '/
ユーザー -> ホーム画面 : access
create 検索ビュー
ホーム画面 -> 検索ビュー : display

ユーザー -> 検索ビュー : input keyword

検索ビュー -> 検索ビュー : validateKeyword
検索ビュー -> 記事検索 : search(keyword)
記事検索 -> 記事一覧 : new
記事検索 --> 検索ビュー : 記事一覧

create 検索結果画面

alt exists 記事一覧
    検索ビュー  -> 検索結果画面 : display
else
    検索ビュー -> ホーム画面 : display with message
end
@enduml

解決領域寄りの図

WEBのMVCフレームワークの「Ruby on Rails」上に適応させたシーケンス図です。

@startuml
actor ユーザー
ユーザー -> "a HomeController" : access
activate "a HomeController"
"a HomeController" -->> ユーザー : rendering 検索ビュー
deactivate "a HomeController"

ユーザー -> "an ArticleSearchResultController" : キーワードを入力して送信
activate "an ArticleSearchResultController"
"an ArticleSearchResultController" -> "an ArticleSearcher" : search(keyword)

activate "an ArticleSearcher"
"an ArticleSearcher" -> "an ArticleSearcher" : validates
"an ArticleSearcher" -->> "an ArticleSearchResultController" : IllegalArgumentException

"an ArticleSearchResultController" -> "a HomeController" : redirect
note bottom : 「キーワードを入力してください」メッセージ

"an ArticleSearcher" -> "an Article Class" : query
activate "an Article Class"
"an Article Class" -->> "an ArticleSearcher" : return Article::ActiveRecordRelation
deactivate "an Article Class"
"an ArticleSearcher" -->> "an ArticleSearchResultController" : return Article::ActiveRecordRelation
deactivate "an ArticleSearcher"

"an ArticleSearchResultController" -> "an Article::ActiveRecordRelation" : order(publish_date: desc)
activate "an Article::ActiveRecordRelation"
deactivate "an Article::ActiveRecordRelation"

"an ArticleSearchResultController" -> "an Article::ActiveRecordRelation" : page(0)
activate "an Article::ActiveRecordRelation"
deactivate "an Article::ActiveRecordRelation"

"an ArticleSearchResultController" -->> ユーザー : rendering
deactivate "an ArticleSearchResultController"
@enduml

記述方法

参加者

参加者は様々なグラフィック要素で定義できます。

@startuml
hide footbox

participant 汎用的な参加者
actor アクター
boundary バウンダリオブジェクト
control コントロールオブジェクト
entity エンティティオブジェクト
database DB
collections コレクションオブジェクト

/' 空白や記号のような通常の文字以外を使いたい場合 "" で囲う '/
participant "a Article:SpecialArticle"
@enduml

参加者の定義を省略してメッセージを記述した場合は「汎用的な参加者」の形になります。

@startuml
objectA -> objectB : message1
@enduml

UMLの参加者の表記のルールは オブジェクト名:クラス名役割名:分類子名 でして、 前半のオブジェクト名か、後半の : 以降のクラス名のどちらかを省略することができます。
上記の「Ruby on Rails」例で書いたような、オブジェクト名を a クラス名 と表現することもよくあるようです。(この場合は : 以降のクラス名を省略しています。)

@startuml
hide footbox
"オブジェクト名:クラス名" -> "オブジェクト名"
"オブジェクト名" -> ":クラス名"
@enduml

メッセージ

様々な種類のメッセージを表現することができます。

基本的なメッセージ

@startuml
objectA -> objectB : 同期メッセージ
objectA ->> objectB : 非同期メッセージ
objectB -->> objectA : リプライメッセージ

objectA -> objectA : 自分へのメッセージ
@enduml

図の外部の要素とのやりとり

@startuml
[-> objectA : 外部からのメッセージ
objectA ->] : 外部へのメッセージ
@enduml

参加者の生成と破棄

参加者を生成するメッセージの前に create 参加者名 と記述することで、生成メッセージを表現することができます。
また、参加者を破棄するメッセージの後に destroy 参加者名 と記述することで、破棄メッセージを表現することができます。

@startuml
participant objectA

create objectB
objectA -> objectB : create message
objectA -> objectB : destroy message
destroy objectB
@enduml

メッセージへの注釈

メッセージの直後に note left|right|top|bottom : メッセージ内容 と書くことによって、メッセージに注釈をつけられます。

@startuml
objectA -> objectB
note right : message1

objectB -> objectB
/' 複数行の注釈 '/
note left
  message2
  message3
end note
@enduml

アクティベーションバー

@startuml
user -> objectA : call
activate objectA

objectA -> objectB : call
activate objectB

objectB -->> objectA
deactivate objectB

objectA -->> user
deactivate objectA
@enduml

結合フラグメント

繰り返し、分岐など様々な制御構造を表現することができます。

alt

if elseの条件分岐を表現できます。

@startuml
alt x > 0
    objectA -> objectB : message1
else
    objectA -> objectC : message2
end
@enduml

opt

ある条件が成立した時だけメッセージを送るということを表現できます。

@startuml
objectA -> objectB : message1
return x

opt x > 0
    objectA -> objectC : message2
end
@enduml

loop

繰り返し処理を表現できます。

@startuml
/' ループさせる数を指定 '/
loop 記事数
    objectA -> objectB : message1
end

/' 最小値と最大値を指定 '/
loop 1, 10
    objectA -> objectB : message2
end

/' 無限ループ '/
loop
    objectA -> objectB : message3
end
@enduml

break

loopなどのbreakを内包している要素の処理を中断することを表現できます。

@startuml
loop
    objectA -> objectB : message1
    break break condition
        objectA -> objectC : message2
    end
end
@enduml

par

複数のメッセージを並行して送ることを表現できます。

@startuml
par
    objectA -> objectB : message1
    objectA -> objectB : message2
    note right : message1とmessage2は並行して送信される 
end
@enduml

critical

クリティカルな部分という表現ができます。
例えばpar内にcriticalがあると、その部分だけは並行実行しないという表現ができます。

@startuml
par
    critical
         objectA -> objectB : critical message
    end
    objectA -> objectB : parallel message1
    objectA -> objectB : parallel message2
end
@enduml

ref

ref over キーワードで他のシーケンス図への参照を表現することができます。

@startuml
participant objectA
participant objectB
participant objectC

objectA -> objectB : message1
ref over objectB,objectC : message1 details
@enduml

遅延

@startuml
objectA -> objectB : message1
...
objectB -> objectA : replay1
... abount 10 minutes ...
objectA -> objectB : message2
@enduml

間隔

@startuml
objectA -> objectB : message1
objectB -> objectA : replay1

|||

objectA -> objectB : message2
objectA -> objectB : replay2

/' ピクセル数を指定 '/
||50||

objectA -> objectB : message3
@enduml

参加者のグルーピング

@startuml
box "presentation" #LightBlue
    participant objectA
    participant objectB
end box

objectA -> objectB : message1
objectB -> objectC : message2
@enduml

指定できる色の名前は https://www.w3schools.com/colors/colors_names.asp にあります。
また、 #AABBCC のようなHEX形式で指定することもできます。

下部の参加者エリアの非表示

@startuml
hide footbox
objectA -> objectB
@enduml

タイトル

図のタイトル

title タイトル名

コード内のコメント

' 行コメント

/'
  ブロックコメント
'/

(宣伝) PlantUMLの高機能エディターを搭載したIntelliJ Pluginを作っています

https://plugins.jetbrains.com/plugin/14821-plantuml-studio

有料プラグインとして出していまして、今後もアクティブに開発を進めていく予定ですので、フィードバックをいただけるととても嬉しいです。

Discussion