統一建模語言(UML)教學手冊

目錄

  1. UML 基礎概念

  2. 常用 UML 圖表教學

  3. 實務應用情境

  4. 專案實作指引

  5. 工具介紹

  6. 實務範例:學生管理系統

  7. 認證考試準備

  8. 附錄

  9. 檢查清單


1. UML 基礎概念

1.1 什麼是 UML?

統一建模語言(Unified Modeling Language, UML) 是一種標準化的圖形建模語言,用於軟體系統的視覺化、設計和文件化。

UML 的起源與發展

  • 1994-1997年:由 Grady Booch、James Rumbaugh 和 Ivar Jacobson 三位大師共同開發
  • 1997年:成為物件管理組織(OMG)的標準
  • 目標:統一不同的物件導向建模方法

1.2 UML 的用途與價值

主要用途

  1. 系統分析:理解業務需求與系統邊界
  2. 系統設計:規劃軟體架構與模組關係
  3. 溝通工具:團隊成員間的共同語言
  4. 文件化:記錄系統設計決策
  5. 維護支援:協助後續的系統維護

在軟體開發專案中的價值

  • ✅ 降低溝通成本:統一的視覺語言
  • ✅ 提高設計品質:強迫思考系統結構
  • ✅ 減少開發風險:提前發現設計問題
  • ✅ 便於團隊協作:清楚的角色與責任劃分
  • ✅ 支援敏捷開發:輕量級的文件化方式

1.3 UML 圖表分類

UML 2.5 版本定義了 14 種標準圖表,主要分為兩大類:

graph TD
    A[UML 圖表] --> B[結構圖 Structure Diagrams]
    A --> C[行為圖 Behavior Diagrams]
    
    B --> B1[類別圖 Class Diagram]
    B --> B2[物件圖 Object Diagram]
    B --> B3[元件圖 Component Diagram]
    B --> B4[部署圖 Deployment Diagram]
    B --> B5[包圖 Package Diagram]
    B --> B6[複合結構圖 Composite Structure Diagram]
    B --> B7[輪廓圖 Profile Diagram]
    
    C --> C1[用例圖 Use Case Diagram]
    C --> C2[活動圖 Activity Diagram]
    C --> C3[狀態機圖 State Machine Diagram]
    C --> C4[序列圖 Sequence Diagram]
    C --> C5[通訊圖 Communication Diagram]
    C --> C6[時序圖 Timing Diagram]
    C --> C7[互動概覽圖 Interaction Overview Diagram]

1.4 實務注意事項

新進同仁建議學習順序

  1. 第一階段:用例圖、類別圖、序列圖
  2. 第二階段:活動圖、狀態圖
  3. 第三階段:元件圖、部署圖

常見誤區避免

❌ 過度設計:不是每個細節都需要建模
❌ 為了畫圖而畫圖:UML 是工具,不是目的
❌ 忽略維護:圖表需要與程式碼同步更新
❌ 複雜化:保持簡潔,突出重點

1.5 🎯 練習與自我檢測

📝 練習題

題目 1:基礎概念選擇題 UML 是哪三位大師共同開發的? A) Martin Fowler、Kent Beck、Eric Evans B) Grady Booch、James Rumbaugh、Ivar Jacobson
C) Gang of Four (GoF) D) Linus Torvalds、Richard Stallman、Tim Berners-Lee

題目 2:圖表分類題 請將下列 UML 圖表正確分類為「結構圖」或「行為圖」:

  • 用例圖:_______
  • 類別圖:_______
  • 序列圖:_______
  • 元件圖:_______
  • 活動圖:_______

題目 3:應用場景題 你被指派設計一個新的線上訂餐系統。請列出你會在專案不同階段使用哪些 UML 圖表,並說明原因。

✅ 解答與解析

解答 1:B) Grady Booch、James Rumbaugh、Ivar Jacobson 解析:這三位被稱為「Three Amigos」,他們分別創造了 Booch method、OMT 和 OOSE,最後統一發展成 UML。

解答 2:圖表分類

  • 用例圖:行為圖 - 描述系統功能行為
  • 類別圖:結構圖 - 描述系統靜態結構
  • 序列圖:行為圖 - 描述物件間互動行為
  • 元件圖:結構圖 - 描述系統架構結構
  • 活動圖:行為圖 - 描述業務流程行為

解答 3:線上訂餐系統範例

  • 需求分析階段:用例圖 - 定義系統功能範圍
  • 概念設計階段:類別圖 - 識別核心業務實體
  • 流程設計階段:活動圖 - 設計訂餐流程
  • 互動設計階段:序列圖 - 設計系統互動
  • 架構設計階段:元件圖 - 規劃系統架構
  • 部署設計階段:部署圖 - 規劃實體部署

🎬 推薦學習資源

📺 影片教學

🌐 互動式學習平台

📱 行動學習應用

  • UML 圖表速查 App (手機隨時查閱)
  • 程式設計面試準備 App (包含 UML 相關題目)

🏆 學習成就檢查表

  • 我能說出 UML 的全名和主要用途
  • 我能區分結構圖和行為圖的差異
  • 我能列出至少 5 種常用的 UML 圖表
  • 我了解在什麼情況下應該使用哪種圖表
  • 我能向同事解釋為什麼要使用 UML

2. 常用 UML 圖表教學

2.1 用例圖(Use Case Diagram)

定義與用途

用例圖用於描述系統功能需求,展示系統與外部使用者(Actor)之間的互動關係。

主要元素

  • 參與者(Actor):系統外部的使用者或其他系統
  • 用例(Use Case):系統提供的功能或服務
  • 系統邊界:定義系統範圍
  • 關係:包含、擴展、泛化關係

符號說明

graph LR
    A[👤 顧客<br/>Actor] --> B((購買商品<br/>Use Case))
    C[👤 管理員<br/>Actor] --> D((管理庫存<br/>Use Case))
    C --> E((查看報表<br/>Use Case))
    
    B --> F((處理付款<br/>Use Case))
    F -.->|include| G((驗證信用卡<br/>Use Case))
    
    style A fill:#e1f5fe
    style C fill:#e1f5fe
    style B fill:#fff3e0
    style D fill:#fff3e0
    style E fill:#fff3e0
    style F fill:#fff3e0
    style G fill:#fff3e0

實務範例:線上購物系統

graph TB
    subgraph "線上購物系統"
        UC1((瀏覽商品))
        UC2((搜尋商品))
        UC3((加入購物車))
        UC4((結帳))
        UC5((註冊會員))
        UC6((登入系統))
        UC7((查看訂單))
        UC8((管理商品))
        UC9((處理訂單))
        UC10((查看銷售報表))
    end
    
    Customer[👤 顧客] --> UC1
    Customer --> UC2
    Customer --> UC3
    Customer --> UC4
    Customer --> UC5
    Customer --> UC6
    Customer --> UC7
    
    Admin[👤 管理員] --> UC8
    Admin --> UC9
    Admin --> UC10
    Admin --> UC6
    
    UC4 -.->|include| UC6
    UC3 -.->|include| UC6
    UC7 -.->|include| UC6

繪製技巧

  1. 識別參與者:誰會使用這個系統?
  2. 列出用例:系統要提供什麼功能?
  3. 建立關係:參與者如何與用例互動?
  4. 定義邊界:什麼在系統內,什麼在系統外?

實務注意事項

  • ✅ 用例名稱使用動詞開頭
  • ✅ 一個用例代表一個完整的業務流程
  • ✅ 避免過於技術性的描述
  • ❌ 不要把用例當作功能清單

2.2 類別圖(Class Diagram)

定義與用途

類別圖是最常用的 UML 圖表,用於描述系統中類別的結構以及類別之間的關係。它是物件導向設計的核心工具。

主要元素

  • 類別(Class):具有相同屬性和方法的物件集合
  • 屬性(Attribute):類別的特徵或資料
  • 方法(Method):類別能執行的行為或操作
  • 關係(Relationship):類別之間的連接

類別表示法

┌─────────────────┐
│   類別名稱      │
├─────────────────┤
│ - 屬性1: 型別   │
│ + 屬性2: 型別   │
├─────────────────┤
│ + 方法1(): 型別 │
│ - 方法2(): void │
└─────────────────┘

可見性修飾符:

  • + public(公開)
  • - private(私有)
  • # protected(保護)
  • ~ package(套件)

實務範例:學生管理系統

classDiagram
    class Student {
        -studentId: String
        -name: String
        -email: String
        -birthDate: Date
        +getStudentId(): String
        +getName(): String
        +setName(name: String): void
        +enroll(course: Course): void
    }
    
    class Course {
        -courseId: String
        -courseName: String
        -credits: int
        -instructor: String
        +getCourseId(): String
        +getCourseName(): String
        +addStudent(student: Student): void
        +removeStudent(student: Student): void
    }
    
    class Enrollment {
        -enrollmentDate: Date
        -grade: String
        -status: String
        +getGrade(): String
        +setGrade(grade: String): void
        +getStatus(): String
    }
    
    class Department {
        -deptId: String
        -deptName: String
        -location: String
        +getDeptName(): String
        +addCourse(course: Course): void
    }
    
    Student "1" --o "many" Enrollment : enrolls in
    Course "1" --o "many" Enrollment : has enrollments
    Department "1" --o "many" Course : offers
    

類別關係類型

關係類型符號說明範例
關聯 Association──一般的使用關係學生 ── 課程
聚合 Aggregation◇──部分-整體關係(弱)部門 ◇── 員工
組合 Composition◆──部分-整體關係(強)房子 ◆── 房間
泛化 Generalization────▷繼承關係學生 ────▷ 人
實現 Realization┈┈┈▷介面實現類別 ┈┈┈▷ 介面
依賴 Dependency┈┈┈>使用關係控制器 ┈┈┈> 服務

繪製技巧

  1. 從核心類別開始:識別系統中最重要的實體
  2. 添加屬性:每個類別需要什麼資料?
  3. 定義方法:每個類別能做什麼?
  4. 建立關係:類別之間如何協作?
  5. 檢查一致性:確保關係合理且完整

實務注意事項

  • ✅ 類別名稱使用名詞,方法名稱使用動詞
  • ✅ 適當使用抽象類別和介面
  • ✅ 考慮設計模式的應用
  • ❌ 避免過度複雜的繼承階層
  • ❌ 不要忽略封裝原則

2.3 序列圖(Sequence Diagram)

定義與用途

序列圖用於描述物件之間在時間順序上的互動過程,特別適合展示複雜的業務流程和系統互動。

主要元素

  • 參與者(Actor):系統外部的使用者
  • 物件(Object):系統內部的物件實例
  • 生命線(Lifeline):物件的生命週期
  • 訊息(Message):物件間的互動
  • 啟用框(Activation Box):物件處於活躍狀態的時間

訊息類型

  • 同步訊息 ─────> :呼叫者等待回應
  • 非同步訊息 ┈┈┈┈> :呼叫者不等待回應
  • 回傳訊息 <┈┈┈┈ :回傳結果
  • 自我訊息 ─┐ └─> :物件呼叫自己的方法

實務範例:線上購物結帳流程

sequenceDiagram
    participant Customer as 👤 顧客
    participant WebUI as 🖥️ 網頁介面
    participant CartService as 🛒 購物車服務
    participant PaymentService as 💳 付款服務
    participant OrderService as 📋 訂單服務
    participant Database as 🗃️ 資料庫
    
    Customer->>+WebUI: 點擊結帳按鈕
    WebUI->>+CartService: 取得購物車內容
    CartService->>+Database: 查詢購物車資料
    Database-->>-CartService: 回傳購物車清單
    CartService-->>-WebUI: 回傳商品清單和總金額
    
    WebUI->>Customer: 顯示結帳頁面
    Customer->>+WebUI: 輸入付款資訊並確認
    
    WebUI->>+PaymentService: 處理付款請求
    PaymentService->>PaymentService: 驗證信用卡資訊
    
    alt 付款成功
        PaymentService-->>WebUI: 付款成功確認
        WebUI->>+OrderService: 建立訂單
        OrderService->>+Database: 儲存訂單資料
        Database-->>-OrderService: 確認儲存成功
        OrderService->>+CartService: 清空購物車
        CartService->>+Database: 刪除購物車資料
        Database-->>-CartService: 確認刪除
        CartService-->>-OrderService: 清空完成
        OrderService-->>-WebUI: 訂單建立成功
        WebUI-->>Customer: 顯示成功頁面
    else 付款失敗
        PaymentService-->>-WebUI: 付款失敗訊息
        WebUI-->>-Customer: 顯示錯誤訊息
    end

進階概念

1. 迴圈(Loop)
sequenceDiagram
    participant Service as 服務
    participant Database as 資料庫
    
    loop 處理每個商品
        Service->>Database: 更新庫存
        Database-->>Service: 確認更新
    end
2. 條件分支(Alt)
sequenceDiagram
    participant User as 使用者
    participant System as 系統
    
    User->>System: 登入請求
    
    alt 認證成功
        System-->>User: 登入成功
    else 認證失敗
        System-->>User: 登入失敗
    end
3. 可選項(Opt)
sequenceDiagram
    participant Customer as 顧客
    participant System as 系統
    
    Customer->>System: 提交訂單
    
    opt 需要發送通知
        System->>System: 發送確認郵件
    end
    
    System-->>Customer: 訂單確認

繪製技巧

  1. 識別關鍵角色:誰參與了這個流程?
  2. 定義開始事件:流程從什麼開始?
  3. 追蹤訊息流:按時間順序列出互動
  4. 處理異常情況:考慮錯誤和替代路徑
  5. 簡化複雜度:將複雜流程分解成多個圖

實務注意事項

  • ✅ 從左到右排列物件,按照互動頻率
  • ✅ 使用清楚的訊息標籤
  • ✅ 適當使用組合片段(alt、opt、loop)
  • ❌ 避免過多的物件在同一個圖中
  • ❌ 不要忽略錯誤處理流程

2.4 活動圖(Activity Diagram)

活動圖的基本概念

活動圖用於描述業務流程或系統行為的工作流程,強調活動的執行順序和條件控制。

活動圖的組成元素

  • 開始節點:流程的起點(實心圓)
  • 結束節點:流程的終點(實心圓加外圓)
  • 活動:具體的動作或任務(圓角矩形)
  • 決策節點:條件分支點(菱形)
  • 合併節點:多個分支的匯合點(菱形)
  • 分岔節點:並行活動的開始(粗黑線)
  • 結合節點:並行活動的結束(粗黑線)

實務範例:線上訂單處理流程

flowchart TD
    Start([開始]) --> A[客戶提交訂單]
    A --> B{驗證訂單資料}
    B -->|有效| C[檢查庫存]
    B -->|無效| D[顯示錯誤訊息]
    D --> End1([結束])
    
    C --> E{庫存是否充足?}
    E -->|充足| F[計算總價]
    E -->|不足| G[通知客戶缺貨]
    G --> H{客戶選擇}
    H -->|等待補貨| I[加入等待清單]
    H -->|取消訂單| End1
    I --> End1
    
    F --> J[處理付款]
    J --> K{付款是否成功?}
    K -->|成功| L[確認訂單]
    K -->|失敗| M[付款失敗通知]
    M --> End1
    
    L --> N[更新庫存]
    L --> O[安排出貨]
    L --> P[發送確認郵件]
    
    N --> Q[完成訂單處理]
    O --> Q
    P --> Q
    Q --> End2([結束])
    
    style Start fill:#90EE90
    style End1 fill:#FFB6C1
    style End2 fill:#90EE90
    style B fill:#FFE4B5
    style E fill:#FFE4B5
    style H fill:#FFE4B5
    style K fill:#FFE4B5

活動圖的進階應用

1. 並行活動(Fork/Join)
flowchart TD
    A[開始處理訂單] --> B[===]
    B --> C[驗證客戶資料]
    B --> D[檢查商品庫存]
    B --> E[計算運費]
    
    C --> F[===]
    D --> F
    E --> F
    F --> G[生成最終訂單]
2. 泳道圖(Swimlane)
flowchart TD
    subgraph "客戶"
        A[提交訂單]
        H[確認收貨]
    end
    
    subgraph "系統"
        B[處理訂單]
        C[安排出貨]
        F[更新狀態]
    end
    
    subgraph "倉庫"
        D[揀貨]
        E[包裝]
    end
    
    subgraph "物流"
        G[配送]
    end
    
    A --> B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
    G --> H

活動圖建模技巧

  1. 明確起終點:清楚標示流程的開始和結束
  2. 邏輯清晰:決策條件要明確具體
  3. 避免複雜:單一圖表不要包含過多細節
  4. 標示責任:使用泳道分離不同角色的活動
  5. 考慮例外:包含錯誤處理和異常路徑

活動圖設計注意事項

  • ✅ 活動名稱使用動詞開頭
  • ✅ 決策條件要明確且互斥
  • ✅ 考慮所有可能的執行路徑
  • ✅ 適當使用並行活動提高效率
  • ❌ 避免過度複雜的決策樹
  • ❌ 不要忽略異常處理路徑

2.5 狀態圖(State Diagram)

狀態圖基礎概念

狀態圖用於描述物件在其生命週期中的狀態變化,以及觸發狀態轉換的事件。

狀態圖核心元素

  • 狀態:物件在某個時間點的條件(圓角矩形)
  • 初始狀態:起始狀態(實心圓)
  • 最終狀態:結束狀態(雙圓圈)
  • 轉換:狀態之間的變化(箭頭)
  • 事件:觸發轉換的條件
  • 護衛條件:轉換的額外條件
  • 動作:進入或離開狀態時執行的操作

實務範例:訂單狀態管理

stateDiagram-v2
    [*] --> 草稿 : 建立訂單
    
    草稿 --> 待確認 : 提交訂單
    草稿 --> [*] : 取消訂單
    
    待確認 --> 已確認 : 確認訂單
    待確認 --> 草稿 : 退回修改
    待確認 --> [*] : 取消訂單
    
    已確認 --> 備貨中 : 開始備貨
    已確認 --> [*] : 取消訂單(特殊情況)
    
    備貨中 --> 已出貨 : 完成備貨並出貨
    備貨中 --> 暫停 : 庫存不足
    
    暫停 --> 備貨中 : 庫存補充
    暫停 --> [*] : 取消訂單
    
    已出貨 --> 運送中 : 物流取件
    
    運送中 --> 已送達 : 客戶簽收
    運送中 --> 退貨中 : 配送失敗
    
    退貨中 --> 已退貨 : 退貨完成
    退貨中 --> 運送中 : 重新配送
    
    已送達 --> 已完成 : 確認收貨
    已送達 --> 退貨中 : 申請退貨
    
    已退貨 --> [*]
    已完成 --> [*]
    
    note right of 待確認 : 等待客服確認\n檢查商品庫存\n驗證客戶資料
    note left of 備貨中 : 揀貨、包裝\n準備出貨
    note right of 已出貨 : 已移交物流\n等待配送

狀態圖高級功能

1. 複合狀態
stateDiagram-v2
    [*] --> 線上
    
    state 線上 {
        [*] --> 空閒
        空閒 --> 忙碌 : 接收任務
        忙碌 --> 空閒 : 任務完成
        
        state 忙碌 {
            [*] --> 處理中
            處理中 --> 暫停 : 暫停請求
            暫停 --> 處理中 : 恢復處理
            處理中 --> [*] : 處理完成
        }
    }
    
    線上 --> 離線 : 登出
    離線 --> 線上 : 登入
    離線 --> [*] : 結束
2. 帶護衛條件的轉換
stateDiagram-v2
    [*] --> 待處理
    
    待處理 --> 處理中 : 開始處理 [有可用資源]
    待處理 --> 等待 : 開始處理 [無可用資源]
    
    等待 --> 處理中 : 資源可用
    
    處理中 --> 已完成 : 處理完成 [結果正確]
    處理中 --> 錯誤 : 處理完成 [結果錯誤]
    處理中 --> 待處理 : 重新開始
    
    錯誤 --> 待處理 : 修正後重試
    錯誤 --> [*] : 放棄處理
    
    已完成 --> [*]

狀態圖設計方法

  1. 識別關鍵狀態:物件的主要生命階段
  2. 定義轉換事件:什麼條件會觸發狀態改變
  3. 考慮護衛條件:轉換的額外限制條件
  4. 包含異常狀態:錯誤和特殊情況的處理
  5. 簡化複雜度:使用複合狀態組織相關狀態

狀態圖設計準則

  • ✅ 狀態名稱使用形容詞或名詞
  • ✅ 事件名稱使用動詞
  • ✅ 確保所有狀態都可達且可離開
  • ✅ 考慮併發狀態的同步問題
  • ❌ 避免過多的狀態導致圖表複雜
  • ❌ 不要忽略初始和最終狀態

2.6 元件圖(Component Diagram)

元件圖概述

元件圖用於描述系統的軟體架構,展示軟體元件之間的依賴關係和介面。

元件圖構成要素

  • 元件:可獨立部署的軟體單元(矩形加元件圖示)
  • 介面:元件提供或需要的服務(圓圈或棒棒糖符號)
  • 提供介面:元件對外提供的服務
  • 需求介面:元件依賴的外部服務
  • 依賴關係:元件之間的使用關係

實務範例:線上購物系統架構

graph TB
    subgraph "表現層"
        WebUI[Web UI 元件]
        MobileApp[Mobile App 元件]
        AdminPanel[Admin Panel 元件]
    end
    
    subgraph "業務邏輯層"
        UserMgmt[使用者管理元件]
        ProductMgmt[商品管理元件]
        OrderMgmt[訂單管理元件]
        PaymentMgmt[付款管理元件]
    end
    
    subgraph "資料存取層"
        UserDAO[使用者 DAO 元件]
        ProductDAO[商品 DAO 元件]
        OrderDAO[訂單 DAO 元件]
    end
    
    subgraph "外部服務"
        PaymentGateway[付款閘道]
        EmailService[郵件服務]
        SMSService[簡訊服務]
    end
    
    subgraph "資料庫層"
        MySQL[(MySQL 資料庫)]
        Redis[(Redis 快取)]
    end
    
    WebUI --> UserMgmt
    WebUI --> ProductMgmt
    WebUI --> OrderMgmt
    
    MobileApp --> UserMgmt
    MobileApp --> ProductMgmt
    MobileApp --> OrderMgmt
    
    AdminPanel --> UserMgmt
    AdminPanel --> ProductMgmt
    AdminPanel --> OrderMgmt
    
    UserMgmt --> UserDAO
    ProductMgmt --> ProductDAO
    OrderMgmt --> OrderDAO
    OrderMgmt --> PaymentMgmt
    
    PaymentMgmt --> PaymentGateway
    UserMgmt --> EmailService
    OrderMgmt --> SMSService
    
    UserDAO --> MySQL
    ProductDAO --> MySQL
    OrderDAO --> MySQL
    
    UserMgmt --> Redis
    ProductMgmt --> Redis
    
    style WebUI fill:#E3F2FD
    style MobileApp fill:#E3F2FD
    style AdminPanel fill:#E3F2FD
    style UserMgmt fill:#FFF3E0
    style ProductMgmt fill:#FFF3E0
    style OrderMgmt fill:#FFF3E0
    style PaymentMgmt fill:#FFF3E0
    style UserDAO fill:#E8F5E8
    style ProductDAO fill:#E8F5E8
    style OrderDAO fill:#E8F5E8

介面設計範例

graph LR
    subgraph "訂單管理元件"
        OrderComponent[訂單管理]
    end
    
    subgraph "付款管理元件"
        PaymentComponent[付款管理]
    end
    
    subgraph "庫存管理元件"
        InventoryComponent[庫存管理]
    end
    
    OrderComponent -->|IPaymentService| PaymentComponent
    OrderComponent -->|IInventoryService| InventoryComponent
    
    PaymentComponent -->|IOrderCallback| OrderComponent
    InventoryComponent -->|IStockNotification| OrderComponent
    
    style OrderComponent fill:#FFE0B2
    style PaymentComponent fill:#C8E6C9
    style InventoryComponent fill:#BBDEFB

元件設計原則

  1. 分層架構:按照系統層次組織元件
  2. 介面定義:明確元件間的契約
  3. 依賴方向:高層元件依賴低層元件
  4. 模組化:將相關功能組織在同一元件
  5. 重用性:設計可重用的通用元件

元件圖最佳實務

  • ✅ 元件名稱要反映其主要職責
  • ✅ 介面要有清楚的契約定義
  • ✅ 避免循環依賴
  • ✅ 考慮元件的可測試性
  • ❌ 不要讓元件過於龐大
  • ❌ 避免過度耦合的設計

2.7 部署圖(Deployment Diagram)

部署圖簡介

部署圖用於描述系統的實體架構,展示軟體元件在硬體節點上的分佈情況。

部署圖基本元件

  • 節點:執行環境或硬體設備(立體方塊)
  • 軟體元件:部署在節點上的軟體
  • 通訊路徑:節點間的連接關係
  • 部署規格:部署的具體配置資訊

實務範例:Web 應用系統部署

graph TB
    subgraph "用戶端"
        Browser[瀏覽器<br/>Chrome/Firefox/Safari]
        Mobile[行動裝置<br/>iOS/Android App]
    end
    
    subgraph "CDN 層"
        CDN[CDN 節點<br/>CloudFlare<br/>靜態資源快取]
    end
    
    subgraph "負載均衡器"
        LB[負載均衡器<br/>Nginx<br/>SSL 終止<br/>請求分發]
    end
    
    subgraph "應用服務器集群"
        App1[應用服務器 1<br/>Ubuntu 20.04<br/>Java Spring Boot<br/>8GB RAM, 4 CPU]
        App2[應用服務器 2<br/>Ubuntu 20.04<br/>Java Spring Boot<br/>8GB RAM, 4 CPU]
        App3[應用服務器 3<br/>Ubuntu 20.04<br/>Java Spring Boot<br/>8GB RAM, 4 CPU]
    end
    
    subgraph "資料庫集群"
        DBMaster[(主資料庫<br/>MySQL 8.0<br/>Ubuntu 20.04<br/>16GB RAM, 8 CPU<br/>SSD 500GB)]
        DBSlave1[(從資料庫 1<br/>MySQL 8.0<br/>Ubuntu 20.04<br/>8GB RAM, 4 CPU<br/>SSD 250GB)]
        DBSlave2[(從資料庫 2<br/>MySQL 8.0<br/>Ubuntu 20.04<br/>8GB RAM, 4 CPU<br/>SSD 250GB)]
    end
    
    subgraph "快取層"
        Redis1[(Redis 主節點<br/>Ubuntu 20.04<br/>4GB RAM, 2 CPU)]
        Redis2[(Redis 從節點<br/>Ubuntu 20.04<br/>4GB RAM, 2 CPU)]
    end
    
    subgraph "檔案存儲"
        Storage[檔案服務器<br/>MinIO<br/>Ubuntu 20.04<br/>4GB RAM, 2 CPU<br/>HDD 2TB]
    end
    
    subgraph "監控系統"
        Monitor[監控服務器<br/>Prometheus + Grafana<br/>Ubuntu 20.04<br/>8GB RAM, 4 CPU]
    end
    
    Browser -->|HTTPS| CDN
    Mobile -->|HTTPS| CDN
    CDN -->|HTTP| LB
    
    LB -->|HTTP| App1
    LB -->|HTTP| App2
    LB -->|HTTP| App3
    
    App1 -->|JDBC| DBMaster
    App2 -->|JDBC| DBMaster
    App3 -->|JDBC| DBMaster
    
    App1 -->|JDBC Read| DBSlave1
    App2 -->|JDBC Read| DBSlave2
    App3 -->|JDBC Read| DBSlave1
    
    DBMaster -.->|複製| DBSlave1
    DBMaster -.->|複製| DBSlave2
    
    App1 -->|Redis Protocol| Redis1
    App2 -->|Redis Protocol| Redis1
    App3 -->|Redis Protocol| Redis1
    
    Redis1 -.->|複製| Redis2
    
    App1 -->|HTTP| Storage
    App2 -->|HTTP| Storage
    App3 -->|HTTP| Storage
    
    App1 -->|Metrics| Monitor
    App2 -->|Metrics| Monitor
    App3 -->|Metrics| Monitor
    DBMaster -->|Metrics| Monitor
    Redis1 -->|Metrics| Monitor
    
    style Browser fill:#E3F2FD
    style Mobile fill:#E3F2FD
    style CDN fill:#FFF3E0
    style LB fill:#E8F5E8
    style App1 fill:#FFEBEE
    style App2 fill:#FFEBEE
    style App3 fill:#FFEBEE
    style DBMaster fill:#F3E5F5
    style DBSlave1 fill:#F3E5F5
    style DBSlave2 fill:#F3E5F5

雲端部署範例

graph TB
    subgraph "AWS 雲端架構"
        subgraph "可用區域 A"
            ALB[應用負載均衡器<br/>Application Load Balancer]
            
            subgraph "Web 層"
                EC2_A1[EC2 實例<br/>t3.medium<br/>Web Server]
                EC2_A2[EC2 實例<br/>t3.medium<br/>Web Server]
            end
            
            subgraph "應用層"
                ECS_A[ECS 容器<br/>Spring Boot App<br/>Docker]
            end
        end
        
        subgraph "可用區域 B"
            subgraph "Web 層"
                EC2_B1[EC2 實例<br/>t3.medium<br/>Web Server]
            end
            
            subgraph "應用層"
                ECS_B[ECS 容器<br/>Spring Boot App<br/>Docker]
            end
        end
        
        subgraph "資料層"
            RDS[RDS MySQL<br/>Multi-AZ<br/>db.t3.large]
            ElastiCache[ElastiCache Redis<br/>cache.t3.medium]
            S3[S3 儲存桶<br/>靜態檔案]
        end
        
        subgraph "監控與日誌"
            CloudWatch[CloudWatch<br/>監控與警報]
            CloudTrail[CloudTrail<br/>API 日誌]
        end
    end
    
    Internet[網際網路] --> ALB
    ALB --> EC2_A1
    ALB --> EC2_A2
    ALB --> EC2_B1
    
    EC2_A1 --> ECS_A
    EC2_A2 --> ECS_A
    EC2_B1 --> ECS_B
    
    ECS_A --> RDS
    ECS_B --> RDS
    ECS_A --> ElastiCache
    ECS_B --> ElastiCache
    ECS_A --> S3
    ECS_B --> S3
    
    ECS_A --> CloudWatch
    ECS_B --> CloudWatch
    RDS --> CloudWatch
    ElastiCache --> CloudWatch

部署圖設計要點

  1. 分層展示:從用戶端到後端分層描述
  2. 標示規格:包含硬體配置和軟體版本
  3. 網路連接:明確標示通訊協定和端口
  4. 備援設計:展示高可用性配置
  5. 安全考量:標示防火牆和安全邊界

部署圖設計指南

  • ✅ 包含實際的硬體規格資訊
  • ✅ 標示網路協定和端口號
  • ✅ 考慮高可用性和災難恢復
  • ✅ 標示安全邊界和訪問控制
  • ❌ 不要忽略網路延遲和頻寬限制
  • ❌ 避免過度簡化複雜的網路拓撲

3. 實務應用情境

3.1 專案生命週期中的 UML 應用

需求分析階段

  • 主要圖表:用例圖
  • 應用時機:與客戶討論需求時
  • 輸出成果:系統功能清單、使用者角色定義

系統設計階段

  • 主要圖表:類別圖、序列圖、活動圖
  • 應用時機:架構設計和詳細設計時
  • 輸出成果:系統架構文件、介面定義

實作階段

  • 主要圖表:類別圖、狀態圖
  • 應用時機:編碼前的詳細設計
  • 輸出成果:程式碼結構指引

測試階段

  • 主要圖表:序列圖、活動圖
  • 應用時機:設計測試案例時
  • 輸出成果:測試腳本、測試資料

維護階段

  • 主要圖表:所有圖表
  • 應用時機:系統修改和擴展時
  • 輸出成果:更新的設計文件

3.2 不同專案類型的 UML 選擇

Web 應用程式

graph LR
    A[需求分析] --> B[用例圖]
    A --> C[使用者故事]
    
    D[架構設計] --> E[類別圖]
    D --> F[元件圖]
    D --> G[部署圖]
    
    H[流程設計] --> I[序列圖]
    H --> J[活動圖]
    
    K[狀態管理] --> L[狀態圖]

建議圖表組合:

  1. 用例圖(需求)
  2. 類別圖(架構)
  3. 序列圖(業務流程)
  4. 元件圖(系統架構)
  5. 部署圖(部署架構)

行動應用程式

建議圖表組合:

  1. 用例圖(功能需求)
  2. 活動圖(使用者流程)
  3. 狀態圖(畫面狀態)
  4. 類別圖(程式架構)
  5. 序列圖(資料流程)

企業系統

建議圖表組合:

  1. 用例圖(業務需求)
  2. 活動圖(業務流程)
  3. 類別圖(領域模型)
  4. 序列圖(系統互動)
  5. 元件圖(系統架構)
  6. 部署圖(實體架構)

3.3 團隊協作中的 UML

與產品經理溝通

  • 使用圖表:用例圖、活動圖
  • 溝通重點:功能範圍、使用者流程
  • 注意事項:避免技術細節,專注業務價值

與設計師溝通

  • 使用圖表:用例圖、活動圖、狀態圖
  • 溝通重點:使用者互動、介面狀態
  • 注意事項:關注使用者體驗流程

與開發團隊溝通

  • 使用圖表:類別圖、序列圖、元件圖
  • 溝通重點:程式架構、模組責任
  • 注意事項:確保技術可行性

與測試團隊溝通

  • 使用圖表:序列圖、活動圖、狀態圖
  • 溝通重點:測試場景、邊界條件
  • 注意事項:涵蓋異常情況

4. 專案實作指引

4.1 UML 建模流程

標準建模流程

graph TD
    A[1. 需求收集] --> B[2. 用例建模]
    B --> C[3. 概念建模]
    C --> D[4. 設計建模]
    D --> E[5. 實作建模]
    E --> F[6. 測試建模]
    F --> G[7. 部署建模]
    
    B --> B1[用例圖]
    C --> C1[類別圖<br/>概念層級]
    D --> D1[類別圖<br/>設計層級]
    D --> D2[序列圖]
    D --> D3[活動圖]
    E --> E1[類別圖<br/>實作層級]
    F --> F1[測試案例圖]
    G --> G1[部署圖]

敏捷開發中的 UML

Sprint 規劃階段:

  1. 更新用例圖(新功能)
  2. 繪製活動圖(使用者流程)
  3. 設計類別圖(核心物件)

Sprint 執行階段:

  1. 詳細序列圖(複雜互動)
  2. 狀態圖(物件狀態變化)
  3. 更新類別圖(實作細節)

Sprint 回顧階段:

  1. 檢視並更新所有圖表
  2. 記錄設計決策
  3. 準備下一個 Sprint 的建模需求

4.2 我們專案中的 UML 應用範例

Java Tutorial 專案的 UML 建模

基於我們現有的 Java Tutorial 專案,讓我們看看如何實際應用 UML:

1. 專案類別圖範例
classDiagram
    class Person {
        <<abstract>>
        -name: String
        -age: int
        +Person(name: String, age: int)
        +getName(): String
        +setName(name: String): void
        +getAge(): int
        +setAge(age: int): void
        +introduce(): void*
        +displayInfo(): void
    }
    
    class Student {
        -studentId: String
        +Student(name: String, age: int, studentId: String)
        +getStudentId(): String
        +setStudentId(studentId: String): void
        +study(subject: String): void
        +introduce(): void
        +attendClass(course: Course): void
    }
    
    class Course {
        -courseId: String
        -courseName: String
        -instructor: String
        -maxStudents: int
        -enrolledStudents: List~Student~
        +Course(courseId: String, courseName: String)
        +addStudent(student: Student): boolean
        +removeStudent(student: Student): boolean
        +getEnrolledCount(): int
        +getCourseInfo(): String
    }
    
    class Utils {
        <<utility>>
        +isValidEmail(email: String): boolean$
        +formatDate(date: Date): String$
        +generateId(): String$
        +validateAge(age: int): boolean$
    }
    
    Student --|> Person : inherits
    Student "0..*" -- "0..*" Course : enrolls in
    Student ..> Utils : uses
    Course ..> Utils : uses
    
2. 學生註冊課程的序列圖
sequenceDiagram
    participant Student as 👤 學生
    participant App as 📱 應用程式
    participant Course as 📚 課程
    participant Utils as 🔧 工具類別
    
    Student->>+App: 請求註冊課程
    App->>+Course: 檢查課程是否存在
    Course-->>-App: 確認課程存在
    
    App->>+Course: 檢查課程容量
    Course->>Course: 檢查 enrolledStudents.size() < maxStudents
    
    alt 課程未滿
        Course-->>App: 容量充足
        App->>+Utils: 驗證學生資料
        Utils->>Utils: validateAge(student.getAge())
        Utils-->>-App: 驗證通過
        
        App->>+Course: addStudent(student)
        Course->>Course: enrolledStudents.add(student)
        Course-->>-App: 註冊成功
        
        App->>+Student: 呼叫 attendClass(course)
        Student->>Student: 更新個人課程清單
        Student-->>-App: 確認參加課程
        
        App-->>Student: 顯示註冊成功訊息
    else 課程已滿
        Course-->>-App: 容量不足
        App-->>Student: 顯示課程已滿訊息
    end
3. 學生狀態圖
stateDiagram-v2
    [*] --> 未註冊 : 建立學生物件
    
    未註冊 --> 已註冊 : setStudentId()
    已註冊 --> 學習中 : study()
    學習中 --> 已註冊 : 完成學習
    
    已註冊 --> 選課中 : attendClass()
    選課中 --> 已選課 : 成功選課
    選課中 --> 已註冊 : 選課失敗
    
    已選課 --> 學習中 : 開始上課
    已選課 --> 已註冊 : 退選課程
    
    學習中 --> 考試中 : 參加考試
    考試中 --> 已完成 : 考試結束
    考試中 --> 學習中 : 考試取消
    
    已完成 --> [*] : 畢業
    
    note right of 學習中 : 學生正在學習某科目\n可以同時學習多個科目
    note left of 選課中 : 等待課程確認\n檢查容量限制

4.3 建模最佳實務

迭代式建模方法

graph LR
    A[第一次迭代] --> B[第二次迭代]
    B --> C[第三次迭代]
    C --> D[持續改善]
    
    A --> A1[基本用例圖]
    A --> A2[核心類別圖]
    
    B --> B1[詳細用例圖]
    B --> B2[完整類別圖]
    B --> B3[關鍵序列圖]
    
    C --> C1[所有圖表]
    C --> C2[設計模式應用]
    C --> C3[效能考量]
    
    D --> D1[根據實作回饋調整]
    D --> D2[文件持續更新]

建模檢查清單

類別圖檢查項目:

  • 每個類別都有明確的責任
  • 類別名稱使用名詞,方法名稱使用動詞
  • 適當的封裝(private/protected/public)
  • 繼承關係合理(IS-A 關係)
  • 關聯關係明確(數量、方向)
  • 避免過度複雜的繼承階層
  • 考慮設計模式的應用

序列圖檢查項目:

  • 包含所有必要的參與者
  • 訊息順序符合邏輯
  • 考慮異常情況處理
  • 回傳值明確標示
  • 適當使用組合片段(alt/opt/loop)
  • 物件生命週期正確表示

用例圖檢查項目:

  • 用例名稱以動詞開頭
  • 參與者為名詞
  • 系統邊界清楚定義
  • 包含/擴展關係合理
  • 涵蓋所有主要功能
  • 避免過度細節化

5. 工具介紹

5.1 常用 UML 工具比較

工具名稱類型優點缺點適用場景
Visual Paradigm商業軟體功能完整、支援團隊協作價格昂贵、學習曲線陡峭大型企業專案
StarUML免費/商業介面友善、功能豐富免費版功能受限中小型專案
PlantUML開源文字描述、版本控制友善視覺編輯較弱程式碼集成
Lucidchart線上工具雲端協作、易於分享需要網路連線遠端團隊
Draw.io免費線上完全免費、功能齊全缺乏高階功能小型專案、學習
Enterprise Architect商業軟體企業級功能、程式碼生成複雜、昂貴大型企業架構

5.2 PlantUML 詳細介紹

PlantUML 是特別推薦給開發人員的工具,因為它使用文字描述來生成 UML 圖表。

安裝與設定

VS Code 中的 PlantUML:

  1. 安裝 PlantUML 擴展
  2. 安裝 Java(PlantUML 需要)
  3. 可選:安裝 Graphviz(更好的佈局)

PlantUML 語法範例

類別圖語法
@startuml
class Student {
    -studentId: String
    -name: String
    +study(subject: String): void
    +introduce(): void
}

class Course {
    -courseId: String
    -courseName: String
    +addStudent(student: Student): boolean
}

abstract class Person {
    #name: String
    #age: int
    +{abstract} introduce(): void
}

Student --|> Person
Student "0..*" -- "0..*" Course
@enduml
序列圖語法
@startuml
actor Student
participant "Registration System" as RS
participant "Course" as C
database "Database" as DB

Student -> RS: 註冊課程請求
RS -> C: 檢查課程容量
C -> DB: 查詢已註冊人數
DB --> C: 回傳人數
alt 容量充足
    C --> RS: 允許註冊
    RS -> DB: 儲存註冊資料
    DB --> RS: 確認儲存
    RS --> Student: 註冊成功
else 容量不足
    C --> RS: 拒絕註冊
    RS --> Student: 課程已滿
end
@enduml
活動圖語法
@startuml
start
:學生提交註冊申請;
:系統驗證學生資料;
if (資料是否有效?) then (是)
    :檢查課程容量;
    if (是否有空位?) then (是)
        :註冊成功;
        :發送確認通知;
    else (否)
        :顯示課程已滿訊息;
    endif
else (否)
    :顯示資料錯誤訊息;
endif
stop
@enduml

與 Git 整合

PlantUML 的文字格式特別適合版本控制:

# 在 Git 中追蹤 UML 文件
git add docs/uml/*.puml
git commit -m "Add class diagrams for student management"

# 設定自動生成圖片
# 可以在 CI/CD 中自動將 .puml 轉換為 .png

5.3 在我們專案中整合 UML 工具

目錄結構建議

java_tutorial/
├── docs/
│   ├── uml/
│   │   ├── class-diagrams/
│   │   │   ├── domain-model.puml
│   │   │   └── implementation.puml
│   │   ├── sequence-diagrams/
│   │   │   ├── student-registration.puml
│   │   │   └── course-management.puml
│   │   ├── use-case-diagrams/
│   │   │   └── student-system.puml
│   │   └── generated/          # 自動生成的圖片
│   │       ├── *.png
│   │       └── *.svg
├── src/
└── README.md

VS Code 設定範例

.vscode/settings.json:

{
    "plantuml.exportFormat": "png",
    "plantuml.exportSubFolder": "docs/uml/generated",
    "plantuml.exportConcurrency": 3,
    "plantuml.previewAutoUpdate": true
}

自動化工作流程

.github/workflows/uml-docs.yml:

name: Generate UML Diagrams
on:
  push:
    paths: ['docs/uml/*.puml']

jobs:
  generate-diagrams:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Generate PlantUML Diagrams
        uses: cloudbees/plantuml-github-action@master
        with:
          args: -v -tpng docs/uml/*.puml
      - name: Commit generated diagrams
        run: |
          git config --local user.email "action@github.com"
          git config --local user.name "GitHub Action"
          git add docs/uml/generated/
          git commit -m "Auto-generate UML diagrams" || exit 0
          git push

6. 實務範例:學生管理系統

6.1 專案背景

我們將設計一個簡單的學生管理系統,展示完整的 UML 建模流程。

需求說明

  • 管理學生基本資料
  • 課程管理和選課功能
  • 成績記錄和查詢
  • 教師管理
  • 系統登入和權限控制

6.2 Step-by-Step UML 建模

Step 1: 需求分析 - 用例圖

graph TB
    subgraph "學生管理系統"
        UC1((註冊帳號))
        UC2((登入系統))
        UC3((查看個人資料))
        UC4((修改個人資料))
        UC5((瀏覽課程))
        UC6((選修課程))
        UC7((退選課程))
        UC8((查看成績))
        UC9((管理學生))
        UC10((管理課程))
        UC11((輸入成績))
        UC12((生成報表))
    end
    
    Student[👤 學生] --> UC1
    Student --> UC2
    Student --> UC3
    Student --> UC4
    Student --> UC5
    Student --> UC6
    Student --> UC7
    Student --> UC8
    
    Teacher[👨‍🏫 教師] --> UC2
    Teacher --> UC10
    Teacher --> UC11
    
    Admin[👨‍💼 管理員] --> UC2
    Admin --> UC9
    Admin --> UC10
    Admin --> UC12
    
    UC6 -.->|include| UC2
    UC7 -.->|include| UC2
    UC8 -.->|include| UC2
    UC9 -.->|include| UC2
    UC10 -.->|include| UC2
    UC11 -.->|include| UC2

Step 2: 概念建模 - 領域類別圖

classDiagram
    class User {
        <<abstract>>
        #userId: String
        #username: String
        #password: String
        #email: String
        +login(): boolean
        +logout(): void
        +updateProfile(): void
    }
    
    class Student {
        -studentId: String
        -major: String
        -enrollmentYear: int
        +enrollCourse(course: Course): boolean
        +dropCourse(course: Course): boolean
        +viewGrades(): List~Grade~
    }
    
    class Teacher {
        -teacherId: String
        -department: String
        -title: String
        +createCourse(): Course
        +inputGrade(student: Student, grade: float): void
        +viewStudentList(course: Course): List~Student~
    }
    
    class Administrator {
        -adminId: String
        -permissions: List~String~
        +manageUsers(): void
        +generateReports(): Report
        +systemMaintenance(): void
    }
    
    class Course {
        -courseId: String
        -courseName: String
        -credits: int
        -maxStudents: int
        -description: String
        +addStudent(student: Student): boolean
        +removeStudent(student: Student): boolean
        +getEnrollmentCount(): int
    }
    
    class Grade {
        -gradeId: String
        -score: float
        -gradeDate: Date
        -comments: String
        +calculateGPA(): float
        +isPass(): boolean
    }
    
    class Enrollment {
        -enrollmentId: String
        -enrollmentDate: Date
        -status: String
        +approve(): void
        +cancel(): void
    }
    
    User <|-- Student
    User <|-- Teacher  
    User <|-- Administrator
    
    Student "1" --o "many" Enrollment
    Course "1" --o "many" Enrollment
    Teacher "1" --o "many" Course : teaches
    
    Student "1" --o "many" Grade
    Course "1" --o "many" Grade
    

Step 3: 互動建模 - 學生選課序列圖

sequenceDiagram
    participant Student as 👤 學生
    participant UI as 🖥️ 使用者介面
    participant AuthService as 🔐 認證服務
    participant CourseService as 📚 課程服務
    participant EnrollmentService as 📝 選課服務
    participant Database as 🗄️ 資料庫
    participant EmailService as 📧 郵件服務
    
    Student->>+UI: 點擊選課按鈕
    UI->>+AuthService: 檢查登入狀態
    AuthService-->>-UI: 確認已登入
    
    UI->>+CourseService: 取得可選課程清單
    CourseService->>+Database: 查詢課程資料
    Database-->>-CourseService: 回傳課程清單
    CourseService-->>-UI: 回傳可選課程
    
    UI-->>Student: 顯示課程清單
    Student->>+UI: 選擇課程並確認
    
    UI->>+EnrollmentService: 提交選課申請
    EnrollmentService->>+Database: 檢查課程容量
    Database-->>-EnrollmentService: 回傳容量資訊
    
    alt 課程有空位
        EnrollmentService->>+Database: 建立選課記錄
        Database-->>-EnrollmentService: 確認建立成功
        
        EnrollmentService->>+CourseService: 更新課程人數
        CourseService->>+Database: 更新課程資料
        Database-->>-CourseService: 確認更新
        CourseService-->>-EnrollmentService: 更新完成
        
        EnrollmentService->>+EmailService: 發送確認郵件
        EmailService-->>-EnrollmentService: 郵件發送成功
        
        EnrollmentService-->>UI: 選課成功
        UI-->>Student: 顯示成功訊息
        
    else 課程已滿
        EnrollmentService-->>UI: 選課失敗(課程已滿)
        UI-->>Student: 顯示失敗訊息
        
    else 時間衝突
        EnrollmentService->>+Database: 檢查時間衝突
        Database-->>-EnrollmentService: 確認有衝突
        EnrollmentService-->>UI: 選課失敗(時間衝突)
        UI-->>Student: 顯示衝突訊息
    end
    
    deactivate EnrollmentService
    deactivate UI

Step 4: 行為建模 - 選課狀態圖

stateDiagram-v2
    [*] --> 未選課
    
    未選課 --> 申請中 : 提交選課申請
    申請中 --> 已選課 : 申請通過
    申請中 --> 未選課 : 申請被拒絕
    申請中 --> 未選課 : 取消申請
    
    已選課 --> 上課中 : 開課
    已選課 --> 未選課 : 退選(選課期間內)
    
    上課中 --> 考試中 : 期末考試
    上課中 --> 未選課 : 退選(特殊情況)
    
    考試中 --> 已完成 : 考試結束
    考試中 --> 上課中 : 考試延期
    
    已完成 --> 及格 : 成績公布(>=60分)
    已完成 --> 不及格 : 成績公布(<60分)
    
    不及格 --> 重修 : 申請重修
    重修 --> 申請中 : 重新申請選課
    
    及格 --> [*]
    
    note right of 申請中 : 等待系統確認\n檢查先修條件\n檢查時間衝突
    note left of 上課中 : 可以查看成績\n參與課程活動

Step 5: 實作建模 - 詳細類別圖

classDiagram
    class UserService {
        -userRepository: UserRepository
        +authenticate(username: String, password: String): User
        +createUser(userData: UserData): User
        +updateUser(userId: String, userData: UserData): void
        +deleteUser(userId: String): void
    }
    
    class CourseService {
        -courseRepository: CourseRepository
        -enrollmentRepository: EnrollmentRepository
        +getAllCourses(): List~Course~
        +getCourseById(courseId: String): Course
        +createCourse(courseData: CourseData): Course
        +updateCourse(courseId: String, courseData: CourseData): void
        +checkAvailability(courseId: String): boolean
    }
    
    class EnrollmentService {
        -enrollmentRepository: EnrollmentRepository
        -courseService: CourseService
        -emailService: EmailService
        +enrollStudent(studentId: String, courseId: String): EnrollmentResult
        +dropCourse(studentId: String, courseId: String): boolean
        +getStudentEnrollments(studentId: String): List~Enrollment~
        +getCourseEnrollments(courseId: String): List~Enrollment~
    }
    
    class EmailService {
        -smtpConfig: SMTPConfig
        +sendEnrollmentConfirmation(student: Student, course: Course): void
        +sendGradeNotification(student: Student, grade: Grade): void
        +sendSystemNotification(user: User, message: String): void
    }
    
    class UserRepository {
        <<interface>>
        +findById(id: String) User
        +findByUsername(username: String) User
        +save(user: User) void
        +delete(id: String) void
    }
    
    class CourseRepository {
        <<interface>>
        +findById(id: String) Course
        +findAll() List~Course~
        +findByTeacher(teacherId: String) List~Course~
        +save(course: Course) void
        +delete(id: String) void
    }
    
    class EnrollmentRepository {
        <<interface>>
        +findByStudentId(studentId: String) List~Enrollment~
        +findByCourseId(courseId: String) List~Enrollment~
        +save(enrollment: Enrollment) void
        +delete(id: String) void
    }
    
    UserService --> UserRepository : uses
    CourseService --> CourseRepository : uses
    CourseService --> EnrollmentRepository : uses
    EnrollmentService --> EnrollmentRepository : uses
    EnrollmentService --> CourseService : uses
    EnrollmentService --> EmailService : uses
    

6.3 架構設計 - 元件圖

graph TB
    subgraph "表現層 Presentation Layer"
        WebUI[Web UI]
        MobileUI[Mobile UI]
        AdminPanel[Admin Panel]
    end
    
    subgraph "應用層 Application Layer"
        UserController[User Controller]
        CourseController[Course Controller]
        EnrollmentController[Enrollment Controller]
        ReportController[Report Controller]
    end
    
    subgraph "服務層 Service Layer"
        UserService[User Service]
        CourseService[Course Service]
        EnrollmentService[Enrollment Service]
        EmailService[Email Service]
        ReportService[Report Service]
    end
    
    subgraph "持久層 Persistence Layer"
        UserRepo[User Repository]
        CourseRepo[Course Repository]
        EnrollmentRepo[Enrollment Repository]
        GradeRepo[Grade Repository]
    end
    
    subgraph "資料層 Data Layer"
        MySQL[(MySQL Database)]
        Redis[(Redis Cache)]
        FileStorage[File Storage]
    end
    
    subgraph "外部服務 External Services"
        EmailProvider[Email Provider]
        SMSProvider[SMS Provider]
        PaymentGateway[Payment Gateway]
    end
    
    WebUI --> UserController
    WebUI --> CourseController
    WebUI --> EnrollmentController
    
    MobileUI --> UserController
    MobileUI --> CourseController
    MobileUI --> EnrollmentController
    
    AdminPanel --> ReportController
    AdminPanel --> UserController
    AdminPanel --> CourseController
    
    UserController --> UserService
    CourseController --> CourseService
    EnrollmentController --> EnrollmentService
    ReportController --> ReportService
    
    UserService --> UserRepo
    CourseService --> CourseRepo
    EnrollmentService --> EnrollmentRepo
    EnrollmentService --> EmailService
    ReportService --> GradeRepo
    
    UserRepo --> MySQL
    CourseRepo --> MySQL
    EnrollmentRepo --> MySQL
    GradeRepo --> MySQL
    
    UserService --> Redis
    CourseService --> Redis
    
    EmailService --> EmailProvider
    EmailService --> SMSProvider
    
    ReportService --> FileStorage

6.4 部署建模 - 部署圖

graph TB
    subgraph "用戶端環境"
        Browser[Web Browser]
        MobileApp[Mobile App]
        AdminClient[Admin Client]
    end
    
    subgraph "CDN"
        CloudFlare[CloudFlare CDN]
    end
    
    subgraph "負載均衡器"
        LoadBalancer[Load Balancer<br/>Nginx]
    end
    
    subgraph "應用服務器集群"
        AppServer1[Application Server 1<br/>Java Spring Boot<br/>8080]
        AppServer2[Application Server 2<br/>Java Spring Boot<br/>8080]
        AppServer3[Application Server 3<br/>Java Spring Boot<br/>8080]
    end
    
    subgraph "資料庫集群"
        PrimaryDB[(Primary Database<br/>MySQL 8.0<br/>3306)]
        ReplicaDB1[(Replica Database 1<br/>MySQL 8.0<br/>3306)]
        ReplicaDB2[(Replica Database 2<br/>MySQL 8.0<br/>3306)]
    end
    
    subgraph "緩存層"
        RedisCluster[Redis Cluster<br/>6379]
    end
    
    subgraph "檔案存儲"
        FileServer[File Server<br/>MinIO<br/>9000]
    end
    
    subgraph "監控系統"
        Prometheus[Prometheus<br/>9090]
        Grafana[Grafana<br/>3000]
        ELK[ELK Stack<br/>Elasticsearch<br/>Logstash<br/>Kibana]
    end
    
    subgraph "外部服務"
        EmailAPI[Email Service API]
        SMSAPI[SMS Service API]
    end
    
    Browser --> CloudFlare
    MobileApp --> CloudFlare
    AdminClient --> CloudFlare
    
    CloudFlare --> LoadBalancer
    
    LoadBalancer --> AppServer1
    LoadBalancer --> AppServer2
    LoadBalancer --> AppServer3
    
    AppServer1 --> PrimaryDB
    AppServer1 --> ReplicaDB1
    AppServer1 --> RedisCluster
    AppServer1 --> FileServer
    
    AppServer2 --> PrimaryDB
    AppServer2 --> ReplicaDB2
    AppServer2 --> RedisCluster
    AppServer2 --> FileServer
    
    AppServer3 --> PrimaryDB
    AppServer3 --> ReplicaDB1
    AppServer3 --> RedisCluster
    AppServer3 --> FileServer
    
    PrimaryDB -.->|主從複製| ReplicaDB1
    PrimaryDB -.->|主從複製| ReplicaDB2
    
    AppServer1 --> EmailAPI
    AppServer2 --> SMSAPI
    
    AppServer1 --> Prometheus
    AppServer2 --> Prometheus
    AppServer3 --> Prometheus
    
    Prometheus --> Grafana
    AppServer1 --> ELK
    AppServer2 --> ELK
    AppServer3 --> ELK

6.5 其他領域實務範例

6.5.1 電子商務系統建模

專案背景: 設計一個線上購物平台

核心用例圖:

graph TB
    subgraph "電商系統"
        UC1((瀏覽商品))
        UC2((搜尋商品))
        UC3((加入購物車))
        UC4((結帳付款))
        UC5((訂單管理))
        UC6((會員註冊))
        UC7((商品管理))
        UC8((庫存管理))
        UC9((訂單處理))
        UC10((數據分析))
    end
    
    Customer[🛒 顧客] --> UC1
    Customer --> UC2
    Customer --> UC3
    Customer --> UC4
    Customer --> UC5
    Customer --> UC6
    
    Merchant[🏪 商家] --> UC7
    Merchant --> UC8
    Merchant --> UC9
    
    Admin[👨‍💼 系統管理員] --> UC10
    
    UC4 -.->|include| UC6
    UC5 -.->|include| UC6

核心領域模型:

classDiagram
    class Customer {
        -customerId: String
        -email: String
        -shippingAddress: Address
        -paymentMethods: List~PaymentMethod~
        +placeOrder(): Order
        +addToCart(product: Product): void
        +removeFromCart(product: Product): void
    }
    
    class Product {
        -productId: String
        -name: String
        -price: BigDecimal
        -description: String
        -category: Category
        -stockQuantity: int
        +updateStock(quantity: int): void
        +isInStock(): boolean
        +applyDiscount(discount: Discount): void
    }
    
    class ShoppingCart {
        -cartId: String
        -items: List~CartItem~
        -totalAmount: BigDecimal
        +addItem(product: Product, quantity: int): void
        +removeItem(product: Product): void
        +calculateTotal(): BigDecimal
        +checkout(): Order
    }
    
    class Order {
        -orderId: String
        -orderDate: Date
        -status: OrderStatus
        -totalAmount: BigDecimal
        -items: List~OrderItem~
        +processPayment(): boolean
        +shipOrder(): void
        +cancelOrder(): void
    }
    
    class Payment {
        -paymentId: String
        -amount: BigDecimal
        -paymentMethod: PaymentMethod
        -status: PaymentStatus
        +processPayment(): boolean
        +refund(): boolean
    }
    
    Customer "1" -- "1" ShoppingCart
    Customer "1" --o "many" Order
    ShoppingCart "1" --o "many" CartItem
    Order "1" --o "many" OrderItem
    Order "1" -- "1" Payment
    Product "1" --o "many" CartItem
    Product "1" --o "many" OrderItem

訂單處理活動圖:

flowchart TD
    Start([顧客提交訂單]) --> A[驗證商品庫存]
    A --> B{庫存充足?}
    B -->|是| C[計算總金額]
    B -->|否| D[通知庫存不足]
    D --> End1([結束])
    
    C --> E[處理付款]
    E --> F{付款成功?}
    F -->|是| G[更新庫存]
    F -->|否| H[付款失敗通知]
    H --> End2([結束])
    
    G --> I[生成訂單]
    I --> J[發送確認郵件]
    J --> K[安排出貨]
    K --> L[更新訂單狀態]
    L --> End3([完成])
    
    style Start fill:#90EE90
    style End1 fill:#FFB6C1
    style End2 fill:#FFB6C1
    style End3 fill:#90EE90

6.5.2 銀行系統建模

專案背景: 設計一個網路銀行系統

核心用例圖:

graph TB
    subgraph "網路銀行系統"
        UC1((登入驗證))
        UC2((查看帳戶餘額))
        UC3((轉帳))
        UC4((繳費))
        UC5((申請貸款))
        UC6((投資理財))
        UC7((帳戶管理))
        UC8((交易監控))
        UC9((風險評估))
        UC10((合規檢查))
    end
    
    Customer[👤 客戶] --> UC1
    Customer --> UC2
    Customer --> UC3
    Customer --> UC4
    Customer --> UC5
    Customer --> UC6
    
    BankEmployee[🏛️ 銀行員工] --> UC1
    BankEmployee --> UC7
    BankEmployee --> UC8
    
    RiskManager[⚠️ 風險管理員] --> UC9
    ComplianceOfficer[📋 合規專員] --> UC10
    
    UC3 -.->|include| UC1
    UC4 -.->|include| UC1
    UC5 -.->|include| UC1
    UC6 -.->|include| UC1

銀行帳戶狀態圖:

stateDiagram-v2
    [*] --> 申請中 : 提交開戶申請
    
    申請中 --> 審核中 : 文件完整
    申請中 --> 補件中 : 文件不完整
    
    補件中 --> 審核中 : 補件完成
    補件中 --> [*] : 申請取消
    
    審核中 --> 已開戶 : 審核通過
    審核中 --> [*] : 審核不通過
    
    已開戶 --> 正常 : 帳戶啟用
    
    正常 --> 凍結 : 異常交易/法規要求
    正常 --> 休眠 : 長期無交易
    正常 --> 已關閉 : 客戶申請關戶
    
    凍結 --> 正常 : 解除凍結
    凍結 --> 已關閉 : 強制關戶
    
    休眠 --> 正常 : 恢復交易
    休眠 --> 已關閉 : 休眠期滿
    
    已關閉 --> [*]
    
    note right of 凍結 : 需要額外授權\n才能進行交易
    note left of 休眠 : 超過6個月\n無任何交易記錄

6.5.3 醫療管理系統建模

專案背景: 設計一個醫院管理系統

核心類別圖:

classDiagram
    class Patient {
        -patientId: String
        -name: String
        -birthDate: Date
        -bloodType: String
        -allergies: List~String~
        -medicalHistory: List~MedicalRecord~
        +scheduleAppointment(): Appointment
        +getMedicalHistory(): List~MedicalRecord~
    }
    
    class Doctor {
        -doctorId: String
        -name: String
        -specialization: String
        -licenseNumber: String
        -schedule: Schedule
        +examinePatient(patient: Patient): Diagnosis
        +prescribeMedication(): Prescription
        +updateMedicalRecord(): void
    }
    
    class Appointment {
        -appointmentId: String
        -dateTime: DateTime
        -purpose: String
        -status: AppointmentStatus
        +confirm(): void
        +cancel(): void
        +reschedule(newDateTime: DateTime): void
    }
    
    class MedicalRecord {
        -recordId: String
        -date: Date
        -symptoms: String
        -diagnosis: String
        -treatment: String
        -followUpRequired: boolean
    }
    
    class Prescription {
        -prescriptionId: String
        -medications: List~Medication~
        -dosage: String
        -duration: String
        -instructions: String
    }
    
    Patient "1" --o "many" Appointment
    Doctor "1" --o "many" Appointment
    Patient "1" --o "many" MedicalRecord
    Doctor "1" --o "many" MedicalRecord
    Doctor "1" --o "many" Prescription
    MedicalRecord "1" --o "many" Prescription

掛號流程序列圖:

sequenceDiagram
    participant P as 👤 病患
    participant UI as 🖥️ 掛號系統
    participant AS as 📅 預約服務
    participant DS as 👨‍⚕️ 醫師服務
    participant NS as 🔔 通知服務
    participant DB as 🗄️ 資料庫
    
    P->>+UI: 選擇科別和醫師
    UI->>+DS: 查詢醫師可用時段
    DS->>+DB: 讀取醫師排班
    DB-->>-DS: 回傳可用時段
    DS-->>-UI: 顯示可預約時段
    
    UI-->>P: 顯示可選時段
    P->>+UI: 選擇時段並確認
    
    UI->>+AS: 建立預約申請
    AS->>+DB: 檢查時段是否仍可用
    DB-->>-AS: 確認可用
    
    AS->>+DB: 保存預約記錄
    DB-->>-AS: 保存成功
    AS-->>-UI: 預約成功
    
    UI->>+NS: 發送確認通知
    NS->>P: 簡訊/郵件通知
    NS->>DS: 通知醫師新預約
    NS-->>-UI: 通知發送完成
    
    UI-->>-P: 顯示預約成功頁面

6.6 跨領域建模經驗總結

共同模式識別

  1. 用戶管理模式:所有系統都需要身份驗證和授權
  2. 狀態管理模式:訂單、帳戶、預約都有生命週期狀態
  3. 通知模式:重要操作都需要通知機制
  4. 稽核模式:關鍵操作需要記錄和追蹤

領域特定考量

  • 電商系統:重視庫存管理和付款安全
  • 銀行系統:強調合規性和風險控制
  • 醫療系統:注重隱私保護和資料準確性

實務建議

  1. 領域專家參與:每個領域都需要專業知識
  2. 法規合規考量:不同行業有不同的法規要求
  3. 安全性設計:從建模階段就要考慮安全性
  4. 可擴展性規劃:預留未來功能擴展的空間

7. 認證考試準備

7.1 OMG UML 認證概述

認證類型

  1. OMG Certified UML Professional (OCUP) Fundamental

    • 入門級認證
    • 涵蓋基本 UML 概念和圖表
    • 考試時間:90 分鐘
    • 題目數量:50 題
  2. OMG Certified UML Professional (OCUP) Intermediate

    • 中級認證
    • 需要先通過 Fundamental 級別
    • 更深入的建模概念和最佳實務
  3. OMG Certified UML Professional (OCUP) Advanced

    • 高級認證
    • 企業級建模和架構設計

7.2 考試重點知識

Fundamental 級別考試重點

第一部分:UML 基礎概念 (20%)
  • UML 的歷史和目的
  • 模型和圖表的區別
  • 13 種 UML 圖表的分類
  • 建模的最佳實務
第二部分:結構圖 (40%)
  • 類別圖:類別、屬性、方法、關係
  • 物件圖:物件和連結
  • 包圖:包和依賴關係
  • 元件圖:元件和介面
第三部分:行為圖 (40%)
  • 用例圖:參與者、用例、關係
  • 序列圖:生命線、訊息、組合片段
  • 活動圖:活動、流程、決策點
  • 狀態機圖:狀態、轉換、事件

常見題型範例

題型一:圖表識別
下列哪個圖表最適合描述系統的部署架構?
A) 類別圖
B) 序列圖  
C) 部署圖
D) 用例圖

答案:C
解釋:部署圖專門用於描述系統組件在實體節點上的分佈情況。
題型二:關係類型
在類別圖中,實心菱形符號表示什麼關係?
A) 關聯 (Association)
B) 聚合 (Aggregation) 
C) 組合 (Composition)
D) 泛化 (Generalization)

答案:C
解釋:實心菱形表示組合關係,是強的部分-整體關係。
題型三:語法正確性
下列哪個是正確的類別屬性宣告?
A) +name:String
B) -age:int
C) #email:String
D) 以上皆是

答案:D
解釋:+表示public,-表示private,#表示protected,都是正確的可見性修飾符。

7.3 學習路線圖

第一階段:基礎概念學習 (2-3 週)

gantt
    title UML 學習時程規劃
    dateFormat  YYYY-MM-DD
    section 基礎階段
    UML 概述與歷史      :done, basic1, 2025-09-01, 3d
    圖表分類與用途      :done, basic2, after basic1, 4d
    建模原則與最佳實務   :active, basic3, after basic2, 5d
    
    section 結構圖學習
    類別圖基礎         :class1, after basic3, 5d
    類別圖進階         :class2, after class1, 3d
    其他結構圖         :class3, after class2, 4d
    
    section 行為圖學習
    用例圖            :behavior1, after class3, 3d
    序列圖            :behavior2, after behavior1, 5d
    活動圖與狀態圖     :behavior3, after behavior2, 4d
    
    section 實務練習
    綜合練習          :practice1, after behavior3, 7d
    模擬考試          :exam1, after practice1, 3d

學習資源配置

理論學習 (40%)

  • 官方 UML 規範文件
  • 教科書和參考書籍
  • 線上課程和教學影片

實務練習 (40%)

  • 工具操作練習
  • 實際專案建模
  • 同儕討論和代碼審查

考試準備 (20%)

  • 模擬考試
  • 錯題分析
  • 重點複習

7.4 考試技巧

答題策略

  1. 快速瀏覽:先看一遍所有題目,標記困難題
  2. 先易後難:從簡單題目開始,建立信心
  3. 時間管理:每題平均 1.8 分鐘,留 10 分鐘檢查
  4. 排除法:對於不確定的題目,先排除明顯錯誤選項

常見陷阱避免

❌ 混淆概念:注意區分聚合與組合、關聯與依賴
❌ 符號錯誤:熟記各種 UML 符號的正確寫法
❌ 過度思考:根據標準 UML 規範回答,不要過度延伸
❌ 時間分配:不要在單一難題上花費過多時間


8. 附錄

8.1 推薦書籍

入門書籍

  1. 《UML 精華》 - Martin Fowler

    • 篇幅適中,適合快速入門
    • 重點關注實用性而非理論
  2. 《學會 UML 基礎入門》 - 蔡煥麟

    • 中文書籍,易於理解
    • 包含豐富的實例

進階書籍

  1. 《UML 用戶指南》 - Grady Booch

    • UML 創始人之一的著作
    • 深入的理論基礎
  2. 《軟體建模與設計》 - Hassan Gomaa

    • 結合軟體工程實務
    • 大型系統設計經驗

8.2 線上資源

官方資源

  • OMG UML 官網:https://www.uml.org/
  • UML 規範文件:https://www.omg.org/spec/UML/

學習平台

  • Coursera:UML 相關課程
  • edX:軟體建模課程
  • Udemy:PlantUML 實務教學

工具官網

  • PlantUML:https://plantuml.com/
  • StarUML:https://staruml.io/
  • Visual Paradigm:https://www.visual-paradigm.com/

8.3 學習進度追蹤系統

🎯 學習里程碑設定

第一週目標:UML 基礎建立

gantt
    title UML 學習進度追蹤
    dateFormat  YYYY-MM-DD
    section 第一週
    閱讀第1章 UML基礎概念    :done, week1-1, 2025-09-01, 1d
    完成第1章練習題          :done, week1-2, after week1-1, 1d
    閱讀第2章 用例圖        :active, week1-3, after week1-2, 1d
    實作第一個用例圖        :week1-4, after week1-3, 2d
    第一週測驗              :milestone, week1-test, after week1-4, 1d
    
    section 第二週
    類別圖學習              :week2-1, after week1-test, 2d
    序列圖學習              :week2-2, after week2-1, 2d
    實務練習                :week2-3, after week2-2, 2d
    第二週測驗              :milestone, week2-test, after week2-3, 1d
    
    section 第三週
    進階圖表學習            :week3-1, after week2-test, 3d
    專案實作                :week3-2, after week3-1, 3d
    期中評估                :milestone, mid-test, after week3-2, 1d

📊 學習進度檢查表

🟢 基礎階段 (第1-2週)

  • 第1天:完成第1章閱讀,理解UML基本概念
  • 第2天:完成第1章所有練習題 (正確率≥80%)
  • 第3天:閱讀第2.1節用例圖,繪製第一個用例圖
  • 第4天:閱讀第2.2節類別圖,設計簡單類別圖
  • 第5天:閱讀第2.3節序列圖,理解物件互動
  • 第6天:實作:為個人專案設計UML圖表
  • 第7天:第一週總複習與自我評估

🟡 進階階段 (第3-4週)

  • 第8天:活動圖和狀態圖學習
  • 第9天:元件圖和部署圖學習
  • 第10天:第3章實務應用情境閱讀
  • 第11天:第4章建模流程實作
  • 第12天:選擇一個領域進行完整建模練習
  • 第13天:工具使用熟練度練習
  • 第14天:第二週總複習與評估

🔵 專精階段 (第5-6週)

  • 第15天:學生管理系統案例研讀
  • 第16天:電商系統案例研讀
  • 第17天:銀行系統案例研讀
  • 第18天:選擇感興趣的領域深入研究
  • 第19天:認證考試準備 (第7章)
  • 第20天:模擬考試與錯題檢討
  • 第21天:總複習與成果展示

📈 學習成效評估

自我評估量表 (1-5分,5分為精通)

能力項目第1週第2週第3週目標
UML基礎概念理解___/5___/5___/54/5
用例圖繪製能力___/5___/5___/54/5
類別圖設計能力___/5___/5___/54/5
序列圖設計能力___/5___/5___/54/5
活動圖設計能力___/5___/5___/53/5
工具使用熟練度___/5___/5___/54/5
實務應用能力___/5___/5___/54/5

🏆 學習認證系統

🥉 銅級認證 - UML基礎能力

  • 完成第1-2章學習
  • 練習題正確率≥70%
  • 能獨立繪製用例圖和類別圖
  • 理解UML基本概念和術語

🥈 銀級認證 - UML實務應用

  • 完成第1-4章學習
  • 練習題正確率≥80%
  • 能設計完整的UML圖表組合
  • 能為實際專案進行UML建模

🥇 金級認證 - UML專家級

  • 完成全部章節學習
  • 練習題正確率≥90%
  • 能指導他人進行UML建模
  • 具備認證考試應試能力

📱 數位學習追蹤工具

推薦追蹤工具:

  1. Notion學習模板

    - 每日學習記錄模板
    - 進度追蹤儀表板
    - 錯題收集本
    - 學習心得筆記
  2. GitHub學習記錄

    - 建立個人UML學習Repository
    - 每日提交學習成果
    - 使用Issues追蹤學習問題
    - 建立Wiki記錄學習筆記
  3. 時間追蹤App

    • Forest (專注時間追蹤)
    • Toggl (學習時間統計)
    • Habitica (遊戲化學習)

🤝 學習社群與協作

建立學習夥伴制度:

  • 找到1-2位學習夥伴一起進行
  • 每週進行學習進度分享
  • 互相檢查練習題解答
  • 共同完成專案建模練習

參與線上社群:

  • UML學習討論群組
  • 軟體設計相關論壇
  • GitHub開源專案貢獻

8.4 練習題庫

基礎練習題

練習 1:類別圖設計 設計一個圖書館管理系統的類別圖,包含:

  • 圖書、會員、借閱記錄
  • 管理員、圖書分類
  • 借閱、歸還、續借功能

練習 2:序列圖繪製 繪製 ATM 提款的序列圖,包含:

  • 插入卡片、輸入密碼
  • 選擇交易類型、輸入金額
  • 檢查帳戶餘額、扣款
  • 發放現金、印收據

練習 3:用例圖分析 分析線上購物網站的用例圖:

  • 識別所有參與者
  • 列出主要用例
  • 定義用例之間的關係

進階練習題

練習 4:系統整合 設計一個完整的學生資訊系統:

  • 用例圖:系統功能分析
  • 類別圖:核心領域模型
  • 序列圖:關鍵業務流程
  • 活動圖:複雜業務規則
  • 部署圖:系統架構

8.4 常用符號速查表

類別圖符號

符號名稱說明
─────關聯一般關係
◇────聚合弱的部分-整體
◆────組合強的部分-整體
────▷泛化繼承關係
┈┈┈▷實現介面實現
┈┈┈>依賴使用關係

序列圖符號

符號名稱說明
─────>同步訊息等待回應
┈┈┈┈>非同步訊息不等待回應
<┈┈┈┈回傳訊息回傳結果
─┐└─>自我訊息自己呼叫

活動圖符號

符號名稱說明
●開始節點流程起點
◎結束節點流程終點
◇決策節點條件分支
◆合併節點分支匯合
▬同步條並行分岔

9. 檢查清單

9.1 UML 專案檢查清單

專案啟動階段 ✅

需求分析

  • 識別所有系統參與者(Actor)
  • 列出系統主要功能(Use Case)
  • 繪製用例圖並確認範圍
  • 與利害關係人確認需求理解正確
  • 建立需求追溯矩陣

初期規劃

  • 選擇適合的 UML 建模工具
  • 建立專案 UML 文件結構
  • 定義團隊建模標準和命名規範
  • 安排團隊 UML 培訓(如需要)

設計階段 ✅

結構設計

  • 繪製概念層級的類別圖
  • 識別核心領域物件和關係
  • 定義類別的屬性和方法
  • 檢查類別職責是否單一且明確
  • 確認繼承和組合關係合理
  • 應用適當的設計模式

行為設計

  • 繪製關鍵業務流程的序列圖
  • 設計複雜物件的狀態圖
  • 描述重要業務規則的活動圖
  • 確保所有用例都有對應的互動圖
  • 檢查異常情況的處理流程

架構設計

  • 繪製系統元件圖
  • 設計系統部署圖
  • 定義層次架構和模組劃分
  • 確認技術棧選擇合理
  • 考慮非功能需求(效能、安全、可維護性)

實作階段 ✅

詳細設計

  • 完善實作層級的類別圖
  • 加入實作細節(介面、例外處理)
  • 確認程式碼結構與設計一致
  • 更新方法簽章和參數型別
  • 檢查封裝原則是否正確實施

開發協調

  • 定期檢視設計與實作的一致性
  • 進行程式碼審查時參考 UML 設計
  • 更新 UML 文件以反映實作變更
  • 確保新加入團隊成員理解設計

測試階段 ✅

測試設計

  • 根據序列圖設計整合測試案例
  • 使用狀態圖設計狀態轉換測試
  • 依據活動圖驗證業務流程
  • 確認邊界條件和異常處理
  • 驗證所有用例都有對應測試

維護階段 ✅

文件維護

  • 定期更新 UML 文件
  • 記錄重要的設計決策和變更原因
  • 確保新功能的設計文件完整
  • 維護設計文件的版本控制

9.2 UML 圖表品質檢查清單

用例圖檢查 ✅

  • 用例名稱是動詞片語
  • 參與者是名詞(角色或外部系統)
  • 系統邊界清楚標示
  • 包含和擴展關係使用正確
  • 沒有過度細節化的用例
  • 涵蓋所有主要功能需求

類別圖檢查 ✅

  • 類別名稱是名詞,使用 PascalCase
  • 方法名稱是動詞,使用 camelCase
  • 可見性修飾符正確使用
  • 關聯關係有明確的數量和方向
  • 繼承關係符合 IS-A 原則
  • 組合和聚合關係使用適當
  • 避免過度複雜的繼承階層
  • 每個類別有明確且單一的職責

序列圖檢查 ✅

  • 參與者和物件順序合理
  • 訊息按時間順序排列
  • 同步和非同步訊息使用正確
  • 包含必要的回傳訊息
  • 使用適當的組合片段(alt、opt、loop)
  • 物件生命線正確表示
  • 包含異常處理流程

活動圖檢查 ✅

  • 有明確的開始和結束節點
  • 決策節點有適當的條件標籤
  • 並行流程使用同步條正確表示
  • 活動名稱清楚描述要執行的動作
  • 流程邏輯合理且完整
  • 考慮所有可能的執行路徑

狀態圖檢查 ✅

  • 初始狀態和最終狀態明確標示
  • 狀態名稱是形容詞或名詞
  • 轉換觸發事件明確定義
  • 護衛條件(guard condition)合理
  • 沒有無法到達的狀態
  • 狀態轉換邏輯正確

9.3 團隊協作檢查清單

溝通協調 ✅

  • 建立 UML 建模標準文件
  • 定期舉行設計審查會議
  • 確保所有團隊成員理解 UML 圖表
  • 建立問題回報和追蹤機制
  • 記錄重要的設計決策

工具使用 ✅

  • 選擇適合團隊的 UML 工具
  • 建立共享的模型儲存庫
  • 設定版本控制和備份機制
  • 建立自動化的圖表生成流程
  • 確保所有成員能夠存取和編輯模型

品質保證 ✅

  • 建立 UML 圖表審查流程
  • 定期檢查設計與實作的一致性
  • 進行同儕審查(Peer Review)
  • 記錄和修正常見的建模錯誤
  • 收集團隊回饋並持續改善流程

結語

UML 不只是一套繪圖符號,更是軟體開發團隊溝通協作的共同語言。通過系統性的學習和實務應用,UML 能幫助我們:

  • 🎯 明確需求:透過用例圖清楚定義系統功能範圍
  • 🏗️ 設計架構:使用類別圖和元件圖規劃系統結構
  • 🔄 描述流程:以序列圖和活動圖展示業務邏輯
  • 🤝 促進協作:建立團隊共同的技術溝通語言
  • 📚 記錄設計:為系統維護提供清楚的文件

📈 教學增強功能總結

本教學文檔經過全面改進,新增了以下實用功能:

🏢 多領域實際專案範例 (章節 6.5)

  • 電商系統建模:完整的購物流程和訂單管理系統
  • 銀行系統建模:帳戶管理和交易處理流程
  • 醫療系統建模:患者管理和診療流程
  • 跨領域應用:展示UML在不同行業的實際應用

🎓 互動式學習工具 (章節 1.5)

  • 練習題目:每章提供針對性練習
  • 詳細解答:完整的解題步驟和說明
  • 自我評估:學習進度檢查工具
  • 線上資源:推薦影片和互動平台

📊 學習進度管理 (章節 8.3)

  • 進度追蹤:視覺化學習里程碑
  • 成就系統:分級認證機制
  • 數位工具:學習管理平台推薦
  • 時間規劃:建議學習時程表

💡 學習建議

  1. 循序漸進:從基本圖表開始,逐步掌握複雜的建模技巧
  2. 實作練習:將理論知識應用到實際專案中
  3. 工具運用:熟練使用UML建模工具提高工作效率
  4. 持續學習:關注UML標準的更新和最佳實務
  5. 參與社群:加入UML學習社群,分享經驗和問題

記住,UML 是服務於開發的工具,不是開發的目的。在實際應用中,要根據專案需求和團隊情況,選擇適當的圖表類型和詳細程度。

持續學習,持續實踐,讓 UML 成為你軟體開發路上的得力助手! 🚀


版本資訊:

  • 文件版本:v1.0
  • 最後更新:2025年9月1日
  • 維護者:開發團隊
  • 審查者:架構師小組

意見回饋: 如有任何問題或建議,請提交 Issue 或直接聯繫開發團隊。