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) | 虛線連接 |