對於系統文件製作者和軟體架構師來說,圖表是不可或缺的。然而,每次使用 GUI 工具進行變更可能會拖慢您的工作流程。這就是為什麼越來越多開發人員選擇基於程式碼的圖表的主要原因。
在 PlantUML 中簡單明確地編寫程式碼,就能輕鬆產生類別圖。它快速、與版本控制相容,而且不需要手動調整版面配置。您只需要編寫和渲染。
仍然有一些使用者偏好 EdrawMax 而非 PlantUML。主要原因是他們可以進行視覺化控制或使用內建範本,而無需深入了解語法。
本 PlantUML 類別圖教學將逐步引導您編寫類別圖程式碼。您將學習如何使用 PlantUML 建立類別圖,並使其與您的設計流程保持同步。
核心語法
在設計類別圖之前,理解 PlantUML 語法至關重要。您應該熟悉類別宣告的流程、可見性符號的使用以及關係的陳述。使用 PlantUML 程式碼開發使用案例圖在結構上有所不同。
另外,類別圖有特定的規範。以下討論您將使用的主要設定。
類別宣告
PlantUML 提供三種簡單的方法來定義類別。極簡風格僅包含類別名稱。完整成員格式在大括號內指定屬性和方法。使用漸進格式時,您先建立一個簡單的類別,然後再用新資訊更新它。選擇最適合您工作流程的方式。
' 格式 1:極簡風格class Customer' 格式 2:完整成員class Order { -orderId: String +createOrder() #calculateTotal(): Decimal}' 格式 3:漸進式class Productclass Product { +name: String +stock: Int}

可見性符號
在 PlantUML 中,可見性符號表示類別成員的存取層級。對於可以從任何地方存取的公開成員,使用 +。要表示私有成員(對其他類別不可見),使用 -。# 字元表示受保護。這僅允許在類別及其子類別中存取。
~ 代表套件可見性;因此,該成員僅可在同一套件內存取。這些符號是保持圖表存取層級一致性的便利方式。使用它們來表示成員的狀態,無論是公開還是隱藏。
| 符號 | 意義 | 範例 |
| + | 公開 | +save(): void |
| - | 私有 | -dbConnection: DB |
| # | 受保護 | #validate(): Bool |
| ~ | 套件 | ~internalId: Long |
關係類型
了解類別關係至關重要。它能清楚說明物件之間的關聯。
' 1. 繼承Vehicle <|-- Car
繼承說明某個類別是另一個類別的子類型。
' 2. 介面實作Runnable <|.. Thread
介面實作表示類別同意某些特定行為。
' 3. 組合Computer *-- CPU
組合代表一種緊密關係,其中一部分完全依賴於整體。
' 4. 聚合Library o-- Book
聚合是一種較鬆散的連接,其中部分可以在沒有整體的情況下存在。
' 5. 雙向關聯Professor "1" -- "1..*" Student
雙向關聯表示兩個類別之間的連結是雙向的。這揭示了它們如何對應和相互依賴。
進階技巧
一旦您掌握了基礎,就可以使用 PlantUML 做更多事情。簡單的版面配置變更和模組化配置使複雜圖表易於閱讀。這些能力擴展了 plantuml 類別圖語法,使其不僅僅是圖像溝通。為了深入探討,我們將探討如何處理版面配置和組織。
版面配置控制
' 強制水平流向left to right directionclass Aclass BA --> B' 清理空連接器hide empty members' 群組對齊together { class Order class OrderItem}
透過控制版面配置,您的類別圖變得更容易理解。使用 left-to-right direction 可以讓類別之間呈現水平流向。加入 hide empty members 功能以移除未使用的空間。將它們包含在 together 區塊中以進行對齊。所有這些版面配置工具都有助於保持圖表的整潔。

自訂樣式
' 可重複使用的樣式範本!define ENUM_STYLE <> #FFCC00;line:blueclass OrderStatus < > { PENDING SHIPPED COMPLETED}' 批次樣式skinparam class { BackgroundColor #F9F9F9 ArrowColor #333333 FontName Arial}
要使您的類別圖更具吸引力,請嘗試自訂樣式。使用 !define,您可以輕鬆建立可重複使用的元素樣式。如果您想進行更大規模的變更,可以使用 skinparam class。這些選項不僅使您的圖表更整潔,還能避免手動操作的麻煩。
複雜關係
' 多重性符號Company "1" -- "1..*" Department : manages >Department "1" -- "*" Employee : employs <
' Directional labels
class User {
+login()
}
class AuthService {
+verify()
}
User .right.> AuthService : depends on
PlantUML 提供一種簡單的方式來詳細視覺化類別關係。多重性讓您指定關係中涉及的元素數量。引入方向標籤來指示類別之間的移動。這些功能清楚說明了類別在實際應用中的互動方式。

模組化設計
' 多重性符號Company "1" -- "1..*" Department : manages >Department "1" -- "*" Employee : employs <
' Directional labels
class User {
+login()
}
class AuthService {
+verify()
}
User .right.> AuthService : depends on
大型圖表有時會變得難以處理。PlantUML 是一種模組化設計工具,允許您將圖表分散到多個檔案中。!include 是您想要插入所有通用部分時使用的指令。這確保了在不同部分工作的團隊成員保持一致。
使用案例
既然您已經學會了如何設計和編輯類別圖樣式,了解它們的應用會很有幫助。類別圖在系統規劃和技術文件中都是多面手。以下是一些 PlantUML 類別圖範例。
電子商務系統
left to right directionpackage "E-Commerce" { class User { +register() +login() } class Product { +search() +getDetails() } class Cart { +addItem() +checkout() }}User --> Product : browsesUser --> Cart : manages
這個電子商務系統展示了組織基本功能的最佳方式。User 透過瀏覽和管理等簡單操作與 Product 和 Cart 互動。每個類別只顯示主要方法。利用 left-to-right direction 使版面配置整潔且更易讀。這是一個簡單且功能完善的模型。

學校管理系統
@startumlleft to right directionpackage "School Management System" { class Student { +register() +enrollCourse() } class Teacher { +assignCourse() +gradeStudent() } class Course { +courseName: String +courseCode: String } class Classroom { +roomNumber: String +capacity: Int }}Student --> Course : enrolls inTeacher --> Course : teachesCourse --> Classroom : held in@enduml
學校管理系統讓您了解學生和教師如何與課程連接。它說明學生註冊課程,教師被指派到課程。此外,每門課程也連結到教室。這種設定描述了系統設計中的主要學術工作流程。

網路銀行系統
@startumlleft to right directionpackage "Online Banking System" { class Customer { +openAccount() +login() } class Account { +accountNumber: String +balance: Decimal } class Transaction { +amount: Decimal +date: Date +process() } class BankService { +transferFunds() +checkBalance() }}Customer --> Account : ownsAccount --> Transaction : recordsCustomer --> BankService : uses@enduml
電子銀行系統展示了銀行業務的基本功能。Customer 類別具有建立帳戶的方法。Account 類別儲存帳戶資料。此外,每個 Account 日誌都保存 Transactions,說明特定期間的資金流動。此配置與實際銀行業務工作流程相容。

圖書館管理系統
@startumlleft to right directionpackage "Library Management System" { class Member { +register() +borrowBook() +returnBook() } class Librarian { +addBook() +removeBook() +issueBook() } class Book { +title: String +author: String +isbn: String } class Loan { +issueDate: Date +dueDate: Date +returnDate: Date }}Member --> Loan : requestsLibrarian --> Book : managesLoan --> Book : includes@enduml
這是一個圖書館管理範例,展示了系統委派任務的方式。Loan 類別是 Member 和 Book 之間的主要連結。它能夠監控借閱和歸還日期。Librarian 負責目錄管理,因此操作控制與使用者分離。

共乘應用程式
@startumlleft to right directionpackage "Ride-Sharing App" { class Rider { +requestRide() +rateDriver() } class Driver { +acceptRide() +updateLocation() } class Trip { +startTime: DateTime +endTime: DateTime +fare: Decimal +completeTrip() } class Payment { +amount: Decimal +status: String +processPayment() }}Rider --> Trip : booksDriver --> Trip : assigned toTrip --> Payment : linked to@enduml
這個共乘應用程式模型將邏輯分散到主要元件中。Trip 不會混合支付或駕駛邏輯,而是專注於行程資訊。Payment 類別管理交易。Driver 和 Rider 與 Trip 是弱連接。這有助於擴展,例如處理更多預訂或動態分配駕駛。

何時考慮替代方案
您可以使用 PlantUML 從程式碼快速產生類別圖,但這並非適用於每個使用者或情境。某些工作需要設計靈活性或適合新手的功能。我們將為您提供一個 PlantUML 的絕佳替代方案,幫助您製作完美的類別圖。
PlantUML 的限制
- 非開發人員面臨陡峭的學習曲線:不熟悉程式設計的使用者可能會發現難以理解語法和結構。
- 沒有動態程式碼整合:PlantUML 無法從真實程式碼庫建立視覺化。您必須手動編寫類別定義。
- 缺乏真正的泛型支援:此工具可以顯示語法,例如
。然而,它不被視為類型參數,也不會強制執行任何關係
PlantUML 將其視覺化為具有純文字的靜態類別。它不理解 T 作為類型,也不提供您表示 Repository
@startumlclass Repository{ +save(item: T) +getById(id: String): T}@enduml
比基於程式碼的工具更簡單的替代方案:試試 EdrawMax
PlantUML 使開發人員能夠建立透過程式碼傳達結構的圖表。但如果您需要更快的速度而語法是次要的呢?如果您必須向非技術受眾解釋您的工作呢?這就是 GUI 工具派上用場的地方。如果您想要一個易於使用的工具,那麼 EdrawMax Online 是值得考慮的選擇。
EdrawMax 提供基於雲端的 UML 圖表編輯器。您可以使用拖放方式將類別元素放到畫布上,或使用線上範本快速開始。此外,它支援豐富的匯出格式(PNG、SVG、Visio)並提供智慧對齊工具。對於需要快速視覺化而無需輸入複雜語法的團隊來說,這比程式碼優先的工具更自然。
您會喜歡它的原因
- 內建 UML 類別範本:使用多個預先設計的類別圖範本來協助您的專案。
- 拖放符號庫:輕鬆插入類別、介面和關係,無需程式碼。
- 豐富的匯出選項:將您的圖表匯出為 Visio、PDF、SVG 或 Office 檔案。
- 雲端檔案存取和儲存:透過 EdrawMax 登入,您可以隨時隨地在雲端儲存、開啟和組織您的類別圖。
結語
本 PlantUML 類別圖教學已討論了語法的所有方面,以及進階結構化技巧。對於想知道如何使用 PlantUML 建立類別圖的任何人,我們都已在此涵蓋了所有內容。
然而,不同的團隊有不同的需求。如果視覺速度和便利性比程式碼管理更重要,EdrawMax 是明智的選擇。它提供簡單、無語法的方法。當您必須向非開發人員進行簡報或準備視覺化的時間很少時,它真的很方便。
親自試用這兩種工具,選擇讓您的工作變得輕鬆的那一個!