Mermaid - 類別圖(Class Diagram)
本篇筆記的範例來自 @Mermaid-Class diagrams
在軟體工程中,類別圖(Class Diagram) 是統一建模語言(UML) 中最常用的一種圖表,用於描述系統中的類別及其相互關係。它展示了類別的結構,包括類別 的屬性(Attributes)、方法(Methods),以及類別之間的繼承(Inheritance)、組合(Composition)、聚合(Aggregation)、關聯(Association) 等關係。類別圖是物件導向(OOP) 建模的重要組成部分,既可用於應用程式結構的概念建模,也可用於詳細的資料建模和程式碼轉換。
本文將深入介紹如何使用 Mermaid 來繪製類別圖,詳細解釋各種類別圖元素及其語法,並提供實際範例來展示如何定義類別、屬性、方法以及類別之間的關係,從而提高系統設計的可視化效果和開發效率。
語法 (Syntax)
類別 (Class)
在UML中,類別(Class)表示系統中的物件或實體。在類別圖中,每個類別包含三個區域:
- 類別名稱區域:包含類別的名稱,名稱以粗體顯示並居中,首字母大寫。這個區域也可能包含描述類別性質的可選註釋文字。
- 屬性區域:包含類別的屬性,左對齊並首字母小寫。
- 方法區域:包含類別可以執行的操作,左對齊並首字母小寫。
例如:
classDiagram
class BankAccount {
+String owner
+Bigdecimal balance
+deposit(amount)
+withdrawal(amount)
}
定義類別 (Define a Class)
- 使用
class
關鍵字顯式定義一個類別名城,如 class Animal。 - 定義兩個類別及其關係。例如,
Vehicle <|-- Car
同時定義了 Car 繼承了 Vehicle 的類別關係。
classDiagram
class Animal
Vehicle <|-- Car
類別標籤 (Class Labels)
-
為類別添加標籤: 若需為類別提供標籤,可使用如下語法:
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car -
轉義特殊字元: 也可以使用反引號(backticks) 來轉義標籤中的特殊字符:
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
定義類別的成員 (Defining Members of a Class)
UML 提供了表示類別成員(如屬性和方法)以及它們的附加資訊的機制。
Mermaid 區分屬性和函數/方法的方式是看是否存在括號()
- 有括號的被視為函數/方法
- 沒有括號的被視為屬性。
在 Mermaid 語法中,有兩種方式可以定義類別的成員,無論使用哪種語法來定義成員,輸出結果都是一樣的。這兩種不同的方式如下:
-
使用冒號
:
定義成員 用冒號:
後跟成員名稱來關聯類 別的成員,適合一次定義一個成員。例如:classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount) -
使用大括號
{}
定義成員 用大括號{}
來關聯類別的成員,適合一次定義多個成員。例如:classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
回傳型別 (Return Type)
可在方法後面添加回傳型別,例如 +withdrawal(amount) int
。
例如:
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
泛型 (Generic Types)
泛型可以用於定義類別,也可以用於定義類別成員/回傳型別。在 Mermaid 中要表 示一個項目是泛型時,將該項目用波浪號(~) 括起來。
Mermaid 支援巢狀類型聲明,例如 List<List<int>>
,但目前不支援包含逗號的泛型(如 List<List<K, V>>
)。
當在類別定義中使用泛型時,泛型型別不被視為類別名稱的一部分。也就是說,對於任何需要引用類別名稱的語法,需要刪除定義中被波浪號(~)括起來的部分。舉例來說,引用class Square~Shape~
時,應該寫 Square
,而不是寫 Square~Shape~
。這也意味著 Mermaid 目前不支援具有相同名稱但不同泛型類型的兩個類別。
classDiagram
class Square~Shape~{
int id
List~int~ position
setPoints(List~int~ points)
getPoints() List~int~
}
Square : -List~string~ messages
Square : +setMessages(List~string~ messages)
Square : +getMessages() List~string~
Square : +getDistanceMatrix() List~List~int~~
可見性 (Visibility - 封裝性)
為了描述類別成員的可見性(或封裝性),可以在成員名稱之前放置可選的符號:
符號 | 可見性描述 |
---|---|
+ | Public (公開) |
- | Private (私有) |
# | Protected (受保護) |
~ | Package/Internal (內部可見) |
在 Mermaid 的類別圖中,可以使用額外的修飾符來標示方法或屬性的特性,例如 抽象方法 (Abstract) 和 靜態方法 (Static)。
方法 (Methods) 的修飾符
可以在 方法名稱後 或 回傳型別後 添加修飾符來標示該方法的性質:
修飾符 | 描述 | 語法範例 |
---|---|---|
* | 抽象方法 (Abstract Method) | someAbstractMethod()* 或 someAbstractMethod() int* |
$ | 靜態方法 (Static Method) | someStaticMethod()$ 或 someStaticMethod() String$ |
屬性 (Fields) 的修飾符
可以在 屬性名稱的最後 添加 $
來表示該屬性為 靜態屬性 (Static Field):
修飾符 | 描述 | 語法範例 |
---|---|---|
$ | 靜態屬性 (Static Field) | String someField$ |
定義類別關係 (Defining Relationships)
語法:
[ClassA][Arrow][ClassB]
UML 定義了八種目前支援的類別關係類型:
箭頭種類 | 關係類型 | 圖示 |
---|---|---|
父類別 <|— 子類別 | 繼承 Inheritance | 空心箭頭實線 |
組成者 *— 部分 | 組合 Composition | 實心菱形箭頭實線 |
整體 o-- 部分 | 聚合 Aggregation | 空心菱形箭頭實線 |
發起關聯的一方 --> 被關聯的一方 | 關聯 Association | 實心箭頭實線 |
起點角色 -- 終點角色 | Link (Solid) | 實線連接 |
依賴者 ..> 被依賴者 | 依賴 Dependency | 實心箭頭虛線 |
實現類別 ..|> 介面 | 實作 Realization | 實心箭頭虛線 |
起點角色 .. 終點角色 | Link (Dashed) | 虛線連接 |