cover

UML 統一塑模語言:什麼時候該畫什麼圖

UML 的價值不是圖本身,而是畫圖時逼你想清楚的那些問題。

先破除一個迷思

很多人對 UML 的印象是:

  • 「那是瀑布式開發用的東西,敏捷不需要」
  • 「畫圖很花時間,不如直接寫 code」
  • 「只有 SA 或架構師才需要會」

這些都是誤解。UML 的本質是 一套標準化的視覺語言,讓你可以用圖形表達程式碼的結構和行為。你不需要畫出完美符合規範的 UML 圖,但你需要知道:什麼樣的問題,用什麼樣的圖最容易想清楚。


UML 的兩大類別

graph TD
    A[UML 圖] --> B[結構圖<br/>靜態的:東西長什麼樣]
    A --> C[行為圖<br/>動態的:東西怎麼運作]

    B --> B1[Class Diagram]
    B --> B2[Component Diagram]
    B --> B3[Deployment Diagram]

    C --> C1[Use Case Diagram]
    C --> C2[Sequence Diagram]
    C --> C3[Activity Diagram]
    C --> C4[State Diagram]

    style B fill:#2196F3,color:#fff
    style C fill:#4CAF50,color:#fff

結構圖回答:系統的零件有哪些?它們之間的關係是什麼? 行為圖回答:這些零件怎麼互動?在什麼條件下做什麼事?


最實用的 5 種圖(按使用頻率排序)

1. Sequence Diagram(循序圖)— 最常用

回答的問題: 一個操作從頭到尾,各個元件之間怎麼互動?

使用者 → 前端 → API Gateway → Auth Service → Database
  │        │         │              │            │
  │  點擊登入  │         │              │            │
  │────────→│  POST /login  │              │            │
  │        │────────→│   驗證 token   │            │
  │        │         │─────────→│  查詢使用者   │
  │        │         │              │───────→│
  │        │         │              │←───────│
  │        │         │←─────────│            │
  │        │←────────│              │            │
  │←────────│         │              │            │

什麼時候該畫:

  • 跨多個服務的操作流程
  • Debug 時追蹤「request 到底經過了哪些地方」
  • Code review 時解釋複雜的呼叫鏈

思維價值: 畫 Sequence Diagram 會逼你想清楚:每一步的 request 和 response 是什麼?哪裡可能超時?哪裡需要錯誤處理?


2. Class Diagram(類別圖)— 最基本

回答的問題: 程式碼的結構是什麼?物件之間是什麼關係?

┌───────────────┐     ┌───────────────┐
│    User        │     │    Order       │
├───────────────┤     ├───────────────┤
│ - id: number   │     │ - id: number   │
│ - name: string │     │ - status: enum │
│ - email: string│     │ - total: number│
├───────────────┤     ├───────────────┤
│ + login()      │ 1──N│ + submit()     │
│ + logout()     │     │ + cancel()     │
└───────────────┘     └───────────────┘

什麼時候該畫:

  • 設計 domain model 的時候
  • 理解一個新 codebase 的核心物件關係
  • 重構前,先看清楚現有結構

思維價值: 關係的類型很重要——是「擁有」(has-a)、「是一種」(is-a)、還是「使用」(uses)?畫出來後你會發現很多模糊的設計決策。


3. State Diagram(狀態圖)— 最容易忽略但最有用

回答的問題: 一個物件有哪些狀態?怎麼在狀態之間轉換?

stateDiagram-v2
    [*] --> Draft
    Draft --> Submitted : 使用者提交
    Submitted --> Approved : 主管核准
    Submitted --> Rejected : 主管退回
    Rejected --> Draft : 使用者修改
    Approved --> InProgress : 開始執行
    InProgress --> Completed : 執行完成
    InProgress --> Cancelled : 使用者取消
    Completed --> [*]
    Cancelled --> [*]

什麼時候該畫:

  • 任何有「狀態」的核心物件(訂單、工單、申請表、文章)
  • 你發現 code 裡有很多 if (status === 'xxx') 的時候
  • Bug 報告裡出現「不應該出現的狀態」

思維價值: 狀態圖會逼你回答:每個狀態可以往哪走?不可以往哪走?什麼條件觸發轉換?這正是最常出 bug 的地方。


4. Use Case Diagram(使用案例圖)— 最適合溝通

回答的問題: 系統有哪些使用者角色?每個角色能做什麼事?

┌─────────────────────────────────┐
│          電商系統                  │
│                                   │
│    (瀏覽商品)   (下訂單)          │
│        ↑           ↑              │
訪客 ────┘     客戶 ──┤              │
│                     ├── (查看訂單)  │
│                     └── (評價商品)  │
│                                   │
│    管理員 ──┬── (管理商品)         │
│             └── (管理訂單)         │
└─────────────────────────────────┘

什麼時候該畫:

  • 專案初期定義系統範圍
  • 權限設計(RBAC)
  • 跟非技術人員溝通

思維價值: 逼你從使用者角度出發,而不是從技術角度。「系統能做什麼」和「使用者需要做什麼」是不同的問題。


5. Activity Diagram(活動圖)— 流程圖的進化版

回答的問題: 一個業務流程的步驟是什麼?有哪些分支和並行?

graph TD
    A[收到訂單] --> B{庫存足夠?}
    B -->|是| C[扣庫存]
    B -->|否| D[通知缺貨]
    C --> E[產生出貨單]
    C --> F[發送確認信]
    E --> G[出貨]
    F --> G
    G --> H[更新訂單狀態]

什麼時候該畫:

  • 複雜的業務流程(審批、結帳、退貨)
  • 有並行操作的場景
  • 用文字描述不清楚的流程

你不需要畫的圖

UML 有 14 種圖,但在實務中你幾乎不會用到:

  • Object Diagram — Class Diagram 的實例化,debug 用 console.log 更直接
  • Package Diagram — 看資料夾結構就好
  • Communication Diagram — Sequence Diagram 能表達同樣的事
  • Timing Diagram — 除非你做嵌入式系統

原則:只在「文字或 code 說不清楚」的時候才畫圖。


工具推薦

工具特色適合場景
Mermaid用文字語法生成圖、可嵌入 Markdown日常文件、筆記(Quartz 原生支援)
PlantUML文字語法、圖類型最齊全詳細的 SA 文件
draw.io拖拉式、免費簡報、需要美觀的正式文件
Excalidraw手繪風格、即時協作白板討論、探索性設計

務實建議: 日常用 Mermaid(直接寫在 Markdown 裡)就夠了。只有需要正式交付文件時才用 draw.io 或 PlantUML。


反思問題

  1. 你上次畫圖是什麼時候? 如果想不起來,可能代表你一直在用「寫 code 來思考」——這在簡單問題上沒問題,但複雜問題需要先視覺化。
  2. 你的系統裡,最核心的物件有狀態圖嗎? 如果沒有,試著畫一次,你很可能會發現幾個沒處理的狀態轉換。
  3. 你能不能在 5 分鐘內用 Mermaid 畫出一個功能的 Sequence Diagram? 這是衡量你對系統互動理解程度的好指標。
  4. 什麼時候「不畫圖」才是對的? 如果一句話能說清楚,就不需要圖。過度文件化跟不文件化一樣有害。

延伸閱讀