【程式設計師小知識】使用PlantUML畫UML(下) 時序圖

語言: CN / TW / HK

theme: smartblue highlight: androidstudio


小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動。

UML 序列圖

序列圖是僅次於類圖的最常用 UML 圖。 序列圖將互動關係表示為一個二維圖,縱向是時間軸,時間沿豎線向下延伸;橫向軸代表了在協作中各個角色,一般是一個 Class 的物件,用一條虛線代表各角色的生命線,生命線上用矩形豎條表示是否處於活躍狀態。物件之間可以傳送同步或非同步訊息。

相對於類圖,序列圖可能更能體現 PlantUML 的價值

同步訊息

```pu @startuml Alice -> Bob: Hi Bob --> Alice: Hi

Alice -> Bob: Is this a pen? Bob --> Alice: No! This is an apple!! @enduml ```

  • 序列圖基本構成: <角色> <訊息型別> <角色> : <訊息內容>
  • 訊息型別中 -> 表示同步訊息
  • --> 虛線表示返回訊息

非同步訊息

```pu @startuml Alice ->> Bob: Hi Alice ->> Bob: Is this a pen? Alice ->> Bob: Is this a pen?? Alice ->> Bob: Is this a pen??? Alice ->> Bob: Is this a pen????

Bob -> Alice: This is an apple!!! @enduml ```

--> 代表非同步訊息

角色生命線

```pu @startuml participant Alice participant Bob participant Carol

Carol -> Bob: Who is Alice? Bob -> Alice: Are you Alice? @enduml ```

  • 多個participant 會按照從左往右的順序顯示各角色生命線
  • 如果沒有任何 participant, 則會角色出現的順序顯示從左往右顯示其生命線

角色圖例

pu @startuml actor Actor boundary Boundary control Control entity Entity database Database collections Collections @enduml

除了 participant 之外, 使用其他關鍵字可以表示特殊的角色型別

發給自己的訊息

pu @startuml Aclie -> Aclie: do something by yourself Aclie -> Aclie: do something by yourself Aclie -> Aclie: do something by yourself Aclie -> Aclie: do something by yourself @enduml

訊息序號

pu @startuml Alice -> Bob: Hi autonumber Bob -> Carol: Hi Carol -> Dave: Hi Bob -> Dave: Hi @enduml

有時候需要為訊息新增序號以表示順序,可以在第一個訊息前新增 autonumber,後續訊息自動新增序號。

起始序號與增量

pu @startuml autonumber 3 Alice -> Bob: Hi Bob -> Carol: Hi autonumber 2 3 Carol -> Dave: Hi Bob -> Dave: Hi @enduml

autonumber <開始序號> <增量> 用來指定其實序號和序號遞增的增量

訊息序號暫停

pu @startuml autonumber Alice -> Bob: Hi autonumber stop Bob -> Carol: Hi Carol -> Dave: Hi autonumber resume Bob -> Dave: Hi Carol -> Dave: Hi @enduml

  • autonumber stop: 自動序號暫停
  • autonumber resume: 自動序號繼續

訊息組

pu @startuml Alice -> Bob: Is this a pen? alt yes Alice <-- Bob: Yes! This is a pen!! else no Alice <-- Bob: No! This is an apple!!!!! end @enduml

  • 有時候需要多個訊息表示一組相關的邏輯,此時可以使用預置的關鍵字來表示各種邏輯,例如
  • alt/else
  • opt
  • loop
  • par
  • break
  • critical
  • 關鍵詞之後新增表示邏輯的文字,例如 yes, no等
  • 訊息資訊的縮排不是必須的,但是加上可讀性更好

訊息組巢狀

訊息組內可以巢狀其他訊息組,如下: pu @startuml Alice -> Bob: Is this a pen? alt yes Alice <-- Bob: Yes! This is a pen!! else no Alice <-- Bob: Noooooooo! This is an apple!!!!! loop ∞ Alice -> Bob: Oh sorry! By the way, is this a pen? Alice <-- Bob: No!!!! end end @enduml

自定義訊息組

除了使用預置關鍵字的訊息組,還可以使用任意名字自定義一個訊息組 pu @startuml group copy Alice -> Bob: Is this a pen? Alice <-- Bob: No! This is an apple!! end @enduml

group 之後新增訊息組的名字

生命線活躍狀態

```pu @startuml activate Alice Alice -> Bob

activate Bob Bob -> Carol

activate Carol Bob <-- Carol

deactivate Carol Alice <-- Bob

deactivate Bob @enduml ```

  • activate <name> 指定name的生命線進入活躍狀態
  • deactive <name> 指定name的生命線退出活躍狀態

巢狀活躍狀態

```pu @startuml activate Alice Alice -> Bob

activate Bob Bob -> Bob activate Bob Bob -> Carol

activate Carol Bob <-- Carol

deactivate Carol Alice <-- Bob

deactivate Bob @enduml ```

activate 中繼續 activate 可以巢狀活躍狀態

建立角色和生命線

pu @startuml Alice -> Bob create Carol Bob -> Carol: new Bob -> Carol Bob <-- Carol Alice <-- Bob @enduml

create <name> 用來建立一個角色和其生命線,此時訊息箭頭會執行角色圖例

參考、引用

pu @startuml Alice -> Bob ref over Bob, Carol: ... Alice <-- Bob ref over Alice ... ... end ref @enduml

可以在時序圖中新增參考資訊 - ref over <生命線名稱> : <內容> : reference 的範圍和參考內容 - ref over ... end ref: 可以換行寫參考內容

邊界線

```pu @startuml == Foo == Alice -> Bob Alice <-- Bob

== Bar == Bob -> Carol Bob <-- Carol @enduml ```

== <name> == 新增邊界線,跨越所有角色的生命線

外部訊息

```pu @startuml

@enduml ```

訊息箭頭的前後使用 [] ,表示一個來自外部或者指向外部的訊息

訊息間隔

```pu @startuml Alice -> Bob Alice <-- Bob

Alice -> Bob Alice <-- Bob ||| Alice -> Bob Alice <-- Bob ||80|| Alice -> Bob Alice <-- Bob @enduml ```

  • 訊息之間加 ||| , 會適當拉開訊息間隔
  • ||<pixel>||:pixel可以指定具體間隔的畫素數

備註

pu @startuml Alice -> Bob note left: Hello Alice <-- Bob note right: World Alice -> Alice note left Hello World end note @enduml

  • 訊息後緊跟 note left 或者 note right 表示在相應位置新增備註,注意note 不能指定 top 或 bottom
  • note <left|right> ... end note 可以換行寫備註
  • 備註內容支援 Creole 格式,Creole 的語法類似 Markdown

Creole 語法示例

```pu @startuml note left --標題-- = 標題1 == 標題2 === 標題3

--列表-- * 列表1 * 列表2 ** 列表2-1

# 有序列表1 # 有序列表2 ## 有序列表2-1

--字型-- * 粗體 * //斜體// * ""等寬字型(monospace)"" * --刪除線-- * 下劃線

--表格-- |= |= Column1 |= Column2 | |1 |Value1-1 |Value1-2 | |2 |Value2-1 |Value2-2 |

--HTML-- * 設定顏色 * 色號 * 背景色 * 字號 * 粗體

--目錄-- |build.gradle |_src |_main |_java |... |_... |_test

end note @enduml ```

姊妹篇: 使用PlantUML畫UML (上) 類圖