在軟體工程與物件導向設計(OOD)領域中,UML類圖是系統建模的骨幹。它是一種靜態結構圖,透過顯示系統的類、屬性、操作(方法)以及物件之間的複雜關係來描述系統架構。無論您是在建立領域模型還是詳細說明軟體規格,理解類圖對於將概念藍圖轉換為功能代碼至功能代碼而言都是不可或缺的。

理解類的結構
圖表的核心是類,它作為物件的藍圖。雖然物件是可使用的實例,包含資料與行為,而類則定義了這些物件的規則。在UML符號中,類以被分成三個特定區段的矩形來表示:
- 類名:位於第一個(頂部)區段。這是必填項目。抽象類通常以斜體字書寫。
- 屬性:位於第二個區段。這些代表類的狀態或結構特徵(成員變數)。
- 操作(方法):位於第三個區段。這些定義了類所提供的行為特徵或服務。
可見性與存取控制
為了定義封裝,UML在屬性和操作名稱前使用特定符號來表示可見性。這決定了哪些其他類可以存取這些成員。

| 符號 |
可見性類型 |
描述 |
| + |
公開 |
任何其他類均可存取。 |
| – |
私有 |
僅在類本身內可存取。 |
| # |
受保護 |
類及其子類(衍生類)可存取。 |
| ~ |
套件 |
同一套件中的任何類均可存取。 |
解讀類別關係
UML 類圖的威力在於它如何呈現類別之間的互動。正如程式實作依賴邏輯,UML 則依賴特定的連接器來傳達意圖。以下是主要的關係類型:

1. 繼承(泛化)
繼承代表一種「是」關係。這是一種分類關係,其中特定的分類器(子類)從一般的分類器(父類)繼承特性。例如,一個圓形是一種形狀.
- 符號表示:一條實線,箭頭為空心,從子類指向父類。
- 使用方式:用於透過在超類中引入共通性來簡化分析模型。
2. 關聯
這是在同級類之間的結構性連結,通常以動詞描述(例如「教師教授學生」)。它表示兩個類相關,但會產生鬆散耦合。
- 符號表示:一條實線連接兩個類。
- 多重性:表示有多少物件參與(例如
1, 0..1, 1..*).
3. 聚合
聚合是一種特殊的關聯,表示「部分-整體」關係。然而,它暗示了一種較弱的所有權。部分可以獨立於整體而存在。例如,一個汽車擁有輪胎,但如果汽車被摧毀,輪胎仍然可以存在。
- 符號表示:一條實線,末端連接一個空心菱形,連接到聚合(父類)類別。
4. 組合
組合是聚合的一種更嚴格形式。它代表一種強所有權,其中部分無法存在於整體之外。如果父物件被摧毀,子物件也會被摧毀。一個例子是房屋及其房間.
- 符號表示:一條實線,末端連接一個實心菱形,連接到組合(父類)類別。
5. 依賴
這代表一種「使用」關係。當一個類別以參數或區域變數的形式與另一個類別互動時,這種關係便存在,而不是作為欄位。供應者類別的定義變更可能會影響客戶類別。
- 符號: 一條虛線,搭配一個開口的箭頭指向依賴關係。

有效類圖的指南
要創建清晰且準確的圖表,必須遵守特定的指南。
- 使用標準命名慣例: 類別名稱應為名詞(例如,客戶, 訂單),通常以大寫字母表示。關聯名稱應為動詞(例如,放置, 包含).
- 明確立場: 畫圖之前,請決定您是在建模一個概念視圖(領域概念),一個規格視圖(介面),或一個實作視圖(與程式碼相關)。
- 管理複雜度: 不要試圖在單一圖表中建模整個系統。應將系統劃分為多個圖表,專注於特定模組或業務領域。
- 明確標示多重性: 始終明確說明關係是一對一、一對多,還是多對多,以確保資料庫或程式碼邏輯能反映業務需求。
實際範例:訂單處理系統
考慮一個標準的電子商務情境,涉及顧客、訂單和產品。以下是關係如何轉換為一個類圖結構:
- 顧客與訂單(關聯): 一位顧客 下訂單 一筆訂單。多重性為
1 顧客至0..* 訂單。
- 訂單與明細項目(組成): 訂單由明細項目組成。若刪除訂單,明細項目將失去意義並被銷毀。這是一個指向訂單的實心菱形。
- 明細項目與產品(關聯/聚合): 明細項目指向一個產品。然而,產品獨立於明細項目存在(它會留在庫存中)。這是一種標準關聯或弱聚合。
- 付款(實作): 一個命名為IPayment 的介面可能由類別實作信用卡付款 和PayPal付款.
優化技巧與提示
應用這些技巧,將您的圖表從簡單的繪圖提升為專業的技術文件:
- 「朗讀測試」: 將您的關係朗讀出來。「一輛汽車由輪子組成。」如果聽起來不自然,請檢查是否使用了正確的箭頭方向或關係類型。
- 參數方向性: 在操作區段中,您可以使用
in, 輸出,或輸入輸出 在參數名稱之前,以明確資料流動。
- 抽象斜體: 如果一個類別無法直接實例化(它是抽象的),請確保其名稱以斜體顯示。這是一個微妙但關鍵的訊號,提醒開發人員。
- 避免線條交叉: 雖然現代工具如Visual Paradigm 能妥善處理路徑規劃,但仍建議手動排列類別,以盡可能減少線條交叉,這能顯著提升可讀性。
類別圖審查清單
在最終確定您的 UML 類別圖之前,請透過此可執行的清單進行檢核:
- [ ] 完整性: 所有必要的類別是否都已包含在特定模組中?
- [ ] 可見性: 屬性和操作是否使用正確的可見性符號標示(+、-、#)?
- [ ] 關係準確性: 您是否正確區分了聚合(空心菱形)與組合(實心菱形)?
- [ ] 多重性: 關聯的兩端是否都定義了基數(例如 1..*)?
- [ ] 可導航性: 箭頭是否清楚標示出哪個類別可以存取另一個?
- [ ] 命名: 類別名稱是否為名詞且唯一?關係動詞是否清晰?
- [ ] 一般化: 繼承層次是否合理(Is-A 關係)?