以 UML 模擬現實需求——實用指南
1. 引言
在現代軟體開發中,使用案例圖是從使用者觀點捕捉功能需求的基本工具。本案例研究對一個真實的使用案例圖進行詳細分析,該圖適用於外送平台,並採用PlantUML 語法作為建模語言。其目標不僅是展示哪些元素被用於圖中,還包括為何它們被選中——強調實務建模決策, 慣例,以及常見陷阱.
本案例研究同時服務於初學者學習 UML與從業者精進其建模實務。它將圖中的每個元素拆解,說明其目的,並探討現實世界的影響。
2. 系統概覽
該外送平台是一個數位市場,連接:
- 顧客(訂購食物的個人),
- 餐廳(餐點提供者),
- 司機(送貨人員),
- 外部支付閘道(處理交易的外部系統)。
該平台允許用戶瀏覽餐廳、下單、追蹤送貨、管理付款並套用優惠活動。該系統與外部服務(如支付處理商)整合,內部不處理付款邏輯。
PlantUML 程式碼:
@startuml
skinparam monochrome true
skinparam shadowing false
left to right direction
' 所有參與者均在矩形外定義
actor Customer
actor "已註冊顧客" as RegCustomer
actor "餐廳員工" as Restaurant
actor Driver
actor "支付處理商" as PaymentGW
rectangle "外送平台" {
(瀏覽餐廳)
(下單)
(追蹤訂單)
(管理菜單)
(接受/準備訂單)
(送達訂單)
(處理付款)
(發出退款)
(套用優惠碼)
(使用錢包)
(卡片付款)
(數位錢包付款)
' 關聯 – 箭頭跨越邊界
Customer --> (瀏覽餐廳)
RegCustomer --> (下單)
RegCustomer --> (追蹤訂單)
Restaurant --> (管理菜單)
Restaurant --> (接受/準備訂單)
Driver --> (送達訂單)
PaymentGW --> (處理付款)
PaymentGW --> (發出退款)
' 包含
(下單) ..> (處理付款) : <<include>>
' 延伸
(下單) <.. (套用優惠碼) : <<extend>>
(處理付款) <.. (使用錢包) : <<extend>>
' 泛化
(處理付款) <|-- (卡片付款)
(處理付款) <|-- (數位錢包付款)
}
' 參與者泛化(也在外部)
Customer <|-- RegCustomer
note right of PaymentGW
外部支付閘道
(Stripe, PayPal, Adyen, ...)
end note
note bottom of (套用優惠碼)
選填 – 僅在輸入有效碼時適用
end note
@enduml ✅ 關鍵洞察:此圖表著重於外部互動——它顯示系統為其用戶和系統所做的,而非其實現方式。
3. 圖表元素:深入探討與實際意義
以下為圖表中使用的每個 UML 元素的完整解析,包含現實世界的詮釋與建模理由。
| # | 元素 | 記號 | 意義與目的 | 建模決策/註解 |
|---|---|---|---|---|
| 1 | 系統邊界 | 矩形「外送平台」 |
定義範圍之被建模系統的範圍。內部所有使用案例均屬於此系統。 | 名稱簡潔且具描述性。在企業情境中,可使用較長的名稱(例如:「客戶訂單管理系統」)。 |
| 2 | 主要人類參與者 | 參與者 客戶, 參與者 司機 |
代表外部角色之啟動或參與使用案例者。 | 名稱簡單且直觀。避免使用不必要的標記,例如<<人>>除非大型模型需要。 |
| 3 | 具別名的參與者 | 參與者「餐廳員工」別名為 Restaurant |
允許將較長且具描述性的參與者名稱縮短,以提升連接的清晰度。 | 當參與者名稱包含空格或過於冗長時極為有效。可減少雜亂並提升可讀性。 |
| 4 | 外部系統參與者 | 參與者「金流處理商」別名為 PaymentGW |
建模第三方系統之平台與其互動之系統。 | 無標記«系統» 用於——在輕量級圖中可接受。然而,加上 “«系統» 可釐清複雜系統中的意圖。 |
| 5 | 參與者泛化 | `客戶 < | — 註冊客戶` | 表示一個註冊客戶是「的專門版本訪客客戶. |
| 6 | 普通關聯 | 客戶 --> (瀏覽餐廳) |
顯示該參與者啟動或參與該用例。 | 實線 = 溝通。方向由參與者指向用例(無需箭頭)。 |
| 7 | «包含»關聯 | (下訂單) ..> (處理付款) : <<包含>> |
處理付款是總是必需的在下訂單時。 |
箭頭指向從包含者 → 被包含者。這至關重要:下訂單 包含 處理付款作為必要步驟。 |
| 8 | 「extend」關係 | (下訂單)<..(套用優惠碼):<<extend>> |
套用優惠碼是選填的且僅在特定條件下發生。 | 箭頭指向從延伸 → 基礎。基礎使用案例(下訂單)可被延伸條件式地. |
| 9 | 使用案例泛化 | `(處理付款)< | —(卡片付款)<br>(處理付款)< |
—(數位錢包付款)` |
| 10 | 註記 | 在 PaymentGW 右側的註記在(套用優惠碼)下方的註記 |
提供 情境說明關於實作或業務規則。 | 註解常被低估,但極具價值。它們可防止誤解(例如,釐清 PaymentGW 為外部系統)。 |
| 11 | 邊界外的參與者 | 所有參與者宣告應位於矩形之前 |
強調沒有任何參與者屬於系統內部——明確的關注點分離。 | 兩種標準佈局之一。當參與者眾多或為外部時,建議採用此佈局。 |
| 12 | 圖表方向 | 由左至右的方向 |
當多個參與者位於左側時,可改善佈局。 | 提升可讀性。特別適用於 4 至 8 個參與者。替代方案:若參與者較少,可採用由上至下的佈局。 |
4. 關鍵建模決策與理由
✅ 為何參與者位於系統邊界之外
- 最佳實踐:參與者代表角色外部的系統。
- 為何重要:可避免系統組件與外部實體之間的混淆。
- 範例:
駕駛員並非該平台的模組——他們是與平台互動的第三方角色。
📌 專業提示:如果所有參與者都在邊界內,則會暗示系統包含了他們——這具有誤導性。
✅ 為何使用Customer <|-- RegCustomer而非重複連結
- 若無泛化,您必須繪製:
PlantUML Edit PlantUML in VPasCode
Customer --> (瀏覽餐廳) RegCustomer --> (瀏覽餐廳) RegCustomer --> (下訂單) - 若有泛化,您只需:
PlantUML Edit PlantUML in VPasCode
Customer <|-- RegCustomer Customer --> (瀏覽餐廳) RegCustomer --> (下訂單) - 結果:更清晰、更易維護的圖表。
📌 最佳實踐:當專業參與者繼承了更一般參與者的所有行為時,請使用參與者泛化。
✅ 為何<<include>>與<<extend>>被正確使用
| 關係 | 目的 | 方向 | 範例 |
|---|---|---|---|
<<包含>> |
強制子流程 | 來自 包含 → 已包含 | 下訂單 必須 包含 處理付款 |
<<延伸>> |
可選延伸 | 來自 延伸 → 基礎 | 套用優惠碼 延伸 下訂單僅當優惠碼有效時 |
❗ 常見錯誤:箭頭方向反轉。請務必記住:
包含:基礎 ..> 已包含擴展:擴充 <.. 基礎
✅ 為什麼 處理付款具有一般化
卡片付款和數位錢包付款是 專門形式 的處理付款.- 這顯示該平台支援 多種付款方式,但它們都遵循相同的核心流程。
- 一般化允許 共用行為 和 未來的可擴展性.
📌 使用案例:新增另一種付款方式(例如 Apple Pay)將只是對「處理付款」的又一項一般化
處理付款.
5. 現實世界的詮釋與已回答的問題
此圖不僅是視覺輔助工具——它回答了關鍵的商業與技術問題:
| 問題 | 圖表中的答案 |
|---|---|
| 主要使用者是誰? | 顧客、註冊顧客、餐廳員工、司機、支付閘道 |
| 未註冊用戶可以下單嗎? | ❌ 否 — 僅限註冊顧客可以下單. 顧客僅能瀏覽餐廳. |
| 是否總是需要付款? | ✅ 是 — 下單 包含 處理付款。強制性。 |
| 顧客可以套用優惠碼嗎? | ✅ 是 — 但僅限可選透過<<延伸>>。僅當輸入有效代碼時。 |
| 支援哪些付款方式? | 信用卡與數位錢包(透過泛化)。實際處理由外部系統負責。 |
| 誰負責處理付款? | 外部PaymentGW — 不屬於平台的一部分。 |
| 餐廳可以管理他們的菜單嗎? | ✅ 是 — 餐廳參與者與…互動管理菜單 和 接受/準備訂單. |
✅ 商業價值:該圖表清楚地傳達了系統做什麼, 誰使用它,以及哪些行為是強制性的,哪些是選擇性的.
6. 展示的常見建模準則
該圖表展示了幾項最佳實踐在 UML 用例建模中的應用:
| 準則 | 如何應用 |
|---|---|
| 使用以目標為導向的用例名稱 | 下訂單, 追蹤訂單, 套用優惠碼——均以動詞開頭,並描述使用者目標。 |
| 保持圖表可讀性 | 僅10 個使用案例已顯示——適合大多數商業領域(建議為 5 至 12 個)。 |
| 將外部系統視為參與者 | PaymentGW被建模為參與者,而非使用案例。正確區分了關注點。 |
| 使用註解以釐清歧義 | 註解說明PaymentGW為外部系統,且優惠碼為可選——此點對於避免誤解至關重要。 |
| 使用參與者泛化以減少雜亂 | `Customer < |
使用include與extend正確使用 |
明確區分強制性行為與可選性行為。 |
📌 警告:許多圖表誤用
<<extend>>來表示「可選」,卻未理解條件性質。本圖表避免了此錯誤。
7. 潛在改進與評析
雖然該圖表相當強健,但以下為建設性建議用於改進:
🔧 1. 新增標記以增進清晰度
actor "Payment Processor" as PaymentGW <<system>>
- 原因: 明確指出這是外部系統,而非人類角色。
- 效益: 減少歧義,特別是在大型模型中。
🔧 2. 釐清 套用優惠碼延伸條件
目前:
note bottom of (Apply Promo Code)
選填 – 僅在輸入有效代碼時顯示
end note
- 更佳做法: 使用 條件標記或 保護條件於
<<extend>>箭頭上:
- 為什麼: 比註解更精確——直接將延伸關聯至條件。
🔧 3. 考慮新增一個 檢視訂單歷史 使用案例
- 目前遺漏,但對顧客和餐廳而言很可能都很重要。
- 可作為一個
註冊顧客使用案例。
🔧 4. 將相關使用案例分組(選填)
對於較大的圖表,將使用案例分組至 套件:
package "訂單管理" {
(下訂單)
(追蹤訂單)
(套用優惠碼)
}
package "付款" {
(處理付款)
(使用錢包)
(卡片付款)
(數位錢包付款)
}
- 效益: 提升可擴展性與可讀性。
8. 接下來要做什麼?
本案例研究已展示如何透過一個 結構良好的使用案例圖 清晰且簡潔地捕捉複雜的業務邏輯。為了加深您的理解,以下是 建議的後續步驟:
🔄 選項 1:以餐廳為中心的視角
從「餐廳的觀點」來建模同一領域:
- 聚焦於「
管理菜單」,接受/準備訂單」,查看訂單」,更新狀態」. - 顯示「
餐廳」作為主要參與者。 - 包含「
顧客」作為次要參與者(例如,「顧客」發送訂單 → 「餐廳」接收訂單)。
✅ 效益:揭示不同的系統目標與參與者角色。
🔄 選項 2:新增更多延伸點
強化「下訂單 與:
套用優惠券(若促銷代碼無效 →<<延伸>>並顯示錯誤訊息)請求特殊說明(選填)排程訂單(用於未來配送)
🔄 選項 3:比較 包含 與 延伸 附範例
| 使用案例 | <<包含>> |
<<延伸>> |
|---|---|---|
下訂單 → 處理付款 |
✅ 必要 | ❌ 非選填 |
下訂單 → 套用促銷代碼 |
❌ 非必要 | ✅ 條件式 |
登入 → 驗證身份 |
✅ 始終需要 | ❌ 不適用 |
結帳 → 套用折扣 |
✅ 始終 | ✅ 僅當存在折扣時 |
📌 經驗法則:
- 使用
<<include>>當行為 必須發生.- 使用
<<extend>>當行為 可能發生 在特定條件下。
🔄 選項 4:轉換為序列圖或活動圖
用於更深入的分析:
- 序列圖:顯示
下訂單→處理付款→交付訂單包含參與者與系統之間的訊息。 - 活動圖: 模擬其中的決策點
處理付款(例如:卡片被拒 → 重試或切換至電子錢包)。
9. 結論
本案例研究顯示,一個精心設計的用例圖遠不止是一張視覺草圖——它是一個戰略溝通工具,其功能包括:
- 釐清系統範圍,
- 捕捉業務規則,
- 指導開發工作,
- 預防誤解。
「外送平台」圖表是一個有力的範例,展現了:
- 正確使用 UML 標記,
- 合理的建模決策,
- 清晰的關注點分離,
- 以及註解與泛化的有效運用。
透過遵循此處所示的原則——以目標為導向的命名, 以及正確使用包含/擴展, 參與者泛化,以及 策略性地使用註解 — 您可以建立同時兼具 準確 以及 可執行.
✅ 最終重點
| 原則 | 此處已應用? | 為何重要 |
|---|---|---|
| 使用以目標為導向的用例名稱 | ✅ 是 | 提升清晰度與使用者焦點 |
| 保持圖表規模可控 | ✅ 是(10 個用例) | 防止認知過載 |
| 將外部系統視為參與者 | ✅ 是 | 正確區分關注點 |
| 使用註解提供上下文 | ✅ 是 | 防止誤解 |
| 使用泛化來減少冗餘 | ✅ 是 | 使圖表具有可擴展性和可維護性 |
正確<<include>> 和 <<extend>> 方向 |
✅ 是 | 確保行為建模的準確性 |










