呈上篇,這篇我們可以先以Class Diagram類別圖為例
Class Diagram類別圖,靜態地描述一個系統的結構。換句話說,它呈現了系統中包含了哪些「類別 (Classes)」、每個類別擁有哪些「屬性 (Attributes)」和「方法 (Methods)」,以及這些類別之間如何互相連結與互動的「關係 (Relationships)」。
您可以把它想像成一張系統的藍圖或組織架構圖。就像建築藍圖呈現了建築物的房間、樑柱和它們之間的關係一樣,類別圖描繪了軟體系統的組成單位和它們的結構關係。
名稱 (Name): 位於最上方的分區,用來識別這個類別是什麼。例如:汽車、訂單、使用者。
屬性 (Attributes): 位於中間的分區,又稱為「成員變數 (Member Variables)」。它描述了這個類別所擁有的靜態特徵或資料。例如,汽車類別可能會有顏色、品牌、型號等屬性。
方法 (Methods): 位於最下方的分區,又稱為「成員函式 (Member Functions)」。它描述了這個類別能夠執行的操作或行為。例如,汽車類別可能會有啟動()、剎車()、加速()等方法。
┌─────────────────────────────────┐
│ 汽車 (Car)
├─────────────────────────────────┤
│ - 顏色 (color): String
│ - 品牌 (brand): String
│ - 型號 (model): String
├─────────────────────────────────┤
│ + 啟動 (start()): void
│ + 剎車 (brake()): void
│ + 加速 (accelerate()): void
└─────────────────────────────────┘
符號說明:
-(減號) 代表 private (私有的),表示只有該類別內部可以存取。
+(加號) 代表 public (公開的),表示任何地方都可以存取。
#(井號) 代表 protected (受保護的),表示該類別及其子類別可以存取。
======================================================================
== UML 類別圖關係 (Relationships) ==
======================================================================
---
### 1. 繼承 (Inheritance / Generalization)
- **概念:** 「是一種 (is-a)」的關係。一個子類別繼承了父類別的所有屬性和方法。
- **符號:** 一條帶有空心三角形箭頭的實線,箭頭指向父類別。
- **範例:** 跑車 是一種 汽車。
[ 子類別 ] [ 父類別 ]
[ 跑車 ] ────────────▷ [ 汽車 ]
---
### 2. 關聯 (Association)
- **概念:** 兩個類別之間有結構上的連結,但彼此是獨立的個體。
- **符號:** 一條實線。可標示「多重性 (Multiplicity)」。
- **範例:** 一個司機 駕駛 一輛汽車。
[ 類別A ] [ 類別B ]
[ 司機 ] ───────────── [ 汽車 ]
(含多重性標示)
[ 司機 ] 1 ─────────── 1 [ 汽車 ]
---
### 3. 聚合 (Aggregation)
- **概念:** 「有一個 (has-a)」的關係,是一種較弱的「整體與部分」關係,部分可以獨立於整體存在。
- **符號:** 一條帶有空心菱形的實線,菱形端連接到「整體」類別。
- **範例:** 一個汽車 有一個 引擎。
[ 部分 ] [ 整體 ]
[ 引擎 ] ◇─────────── [ 汽車 ]
---
### 4. 組合 (Composition)
- **概念:** 「包含 (contains-a)」的關係,是一種更強的「整體與部分」關係,部分的生命週期依附於整體。
- **符號:** 一條帶有實心菱形的實線,菱形端連接到「整體」類別。
- **範例:** 一間房子 包含 數個房間。
[ 部分 ] [ 整體 ]
[ 房間 ] ◆─────────── [ 房子 ]
---
### 5. 依賴 (Dependency)
- **概念:** 一個類別的操作需要使用到另一個類別,是一種臨時性的、較弱的關係。
- **符號:** 一條帶有箭頭的虛線,箭頭指向被依賴的類別。
- **範例:** 司機在開車()方法中,需要使用到地圖物件。
[ 使用者類別 ] [ 被依賴類別 ]
[ 司機 ] - - - - - > [ 地圖 ]
以Class Diagram類別圖為例,下面是常用的3種繪畫type
(源頭取自HLD:IT鐵人DAY 7-Class Diagram類別圖)(如果有想要進修UML更深可以看他們的鐵人文章)
特性 | Class (一般類別) | Abstract Class (抽象類別) | Interface (介面) |
---|---|---|---|
本質 | 完整的藍圖 | 半成品的藍圖 | 純粹的能力合約 |
方法內容 | 全部都有實作 | 可包含已實作和未實作的方法 | 全部都沒有實作 (只有宣告) |
用途 | 直接創造物件 | 作為多個子類別的「共同樣板」 | 定義一個物件對外應提供的「能力規格」 |
繼承關係 | extends (繼承) |
extends (繼承) |
implements (實作) |
多重性 | 只能繼承一個父類別 | 只能繼承一個父類別 | 可以實作多個介面 |
類別圖用來描述系統的「靜態結構」,也就是系統由哪些「東西」組成,以及它們之間的靜態關係。可以把它想像成建築的結構藍圖。
名稱 | 說明與使用情境 |
---|---|
類別 (Class) | 核心元素。用來表示系統中的一個物件藍圖。它包含三個部分:1. 頂部:類別名稱 (ClassName )2. 中間:屬性 (Attributes )3. 底部:操作 (Operations / Methods )範例:Member (會員)、Product (產品)、Order (訂單)。 |
介面 (Interface) | 一種特殊的類別,只定義「應該有什麼功能 (操作)」,但不實作這些功能。它像一份合約,實作它的類別就必須遵守合約,提供所有定義好的功能。範例:一個Printable 介面,規定所有實作它的類別都必須有print() 功能。 |
套件 (Package) | 像資料夾一樣,用來將相關的類別或其他元素組織在一起,避免命名衝突並讓系統結構更有條理。範例:將所有與使用者帳號相關的類別放入com.example.user 套件中。 |
關聯 (Association) | 表示兩個類別之間有某種「結構上的連結」。這是一條實線,表示一個類別的物件會需要另一個類別的物件來完成工作。範例:Member (會員) 和 Order (訂單) 之間有關聯,因為會員會產生訂單。 |
泛化 / 繼承 (Generalization / Inheritance) | 表示「is-a」的關係,也就是繼承。空心箭頭指向父類別 (基礎類別),另一端是子類別 (衍生類別)。子類別會繼承父類別的屬性和操作。範例:Dog (狗) 和 Cat (貓) 都繼承自 Animal (動物)。箭頭從Dog 指向Animal 。 |
聚合 (Aggregation) | 表示「has-a」的關係,是一種弱擁有關係。整體 (Whole) 由部分 (Part) 組成,但部分的生命週期獨立於整體。用空心菱形指向整體。範例:Department (部門) 和 Employee (員工)。部門解散了,員工依然存在。菱形在Department 端。 |
組合 / 複合 (Composition) | 表示「contains-a」的關係,是一種強擁有關係。部分的生命週期完全依賴於整體,整體消失了,部分也會跟著消失。用實心菱形指向整體。範例:Car (車子) 和 Engine (引擎)。車子報廢了,引擎也跟著報廢。菱形在Car 端。 |
依賴 (Dependency) | 表示一個類別「uses-a」另一個類別。這是一種臨時性的、較弱的關係,通常發生在一個類別的方法參數、回傳值或局部變數中使用了另一個類別。範例:Driver (司機) 的drive 方法需要一個Car 物件作為參數 (drive(car: Car) ),那麼Driver 就依賴於Car 。 |
數量 (Multiplicity) | 標示在關聯線的兩端,用來表示一個類別的實例可以對應到多少個另一個類別的實例。• 1 :正好一個• 0..1 :零個或一個• * 或 0..* :零個或多個• 1..* :一個或多個範例:Member "1" -- "0..*" Order (一個會員可以有零或多筆訂單)。 |
活動圖用來描述系統的「動態行為」,也就是完成一件事情的「步驟流程」或「工作流程」。它很像我們傳統上畫的流程圖。
名稱 | 說明與使用情境 |
---|---|
初始狀態 (Initial State) | 表示活動流程的「起點」。一個活動圖只會有一個初始狀態。它是一個實心圓點。 |
活動 (Activity) / 動作 (Action) | 表示流程中的一個「步驟」或需要執行的工作。用圓角矩形表示。範例:使用者登入 、驗證密碼 、查詢資料庫 。 |
決策 (Decision) | 表示流程中的一個「判斷點」,通常會有一個入口和多個出口,每個出口對應一個判斷條件 (例如 [Yes] / [No] )。用菱形表示。範例:判斷「密碼是否正確?」。 |
控制流 (Control Flow) | 表示流程進行的「方向」。用實線箭頭連接各個活動和決策點,指出下一步該做什麼。 |
分岔 (Fork) / 結合 (Join) | 黑色實心長條。用來表示「同步」或「併發」流程。• 分岔:一個入口,多個出口。表示流程在此同時開始執行多個並行任務。• 結合:多個入口,一個出口。表示必須等待所有並行任務都完成後,流程才能繼續往下走。 |
物件流 (Object Flow) | 帶有箭頭的虛線,表示物件或資料在不同活動之間傳遞。範例:查詢訂單 活動產出一個Order 物件,並將它傳遞給顯示訂單詳情 活動。 |
物件狀態 (Object in State) | 在活動圖中顯示一個物件在特定時間點的狀態。範例:一個Order 物件,其狀態可能是[待付款] 或[已出貨] 。 |
結束狀態 (Final State) | 表示活動流程的「終點」。一個活動圖可以有多個結束狀態。它是一個帶有外圈的實心圓點。 |
參與者 (Actor) | 在活動圖中,有時會用泳道 (Swimlane) 來區分不同角色 (Actor) 或部門所負責的活動。這個火柴人符號在「使用案例圖」中更為常見,代表與系統互動的人或外部系統。 |
有了上面這些符號與概念之後,我們就可以繪畫一個簡單的Class Diagram來與其他工程師甚至客戶溝通
下一章我就拿一個簡單的BANK系統來介紹CLASS在實際上如何發揮作用