Biểu đồ lớp
Biểu đồ lớp là khối xây dựng chính của mô hình hóa hướng đối tượng. Nó được dùng để mô hình hóa khái niệm chung về cấu trúc ứng dụng, cũng như mô hình hóa chi tiết để chuyển mô hình thành mã lập trình. Biểu đồ lớp cũng có thể được dùng để mô hình hóa dữ liệu. Lớp trong biểu đồ lớp vừa biểu diễn các phần tử chính và tương tác trong ứng dụng, vừa biểu diễn các lớp cần được lập trình.
Sao chép
Nhúng
---
title: Animal example
---
classDiagram
note "From Duck till Zebra"
Animal <|-- Duck
note for Duck "can fly
can swim
can dive
can help in debugging"
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
Cú pháp
Lớp
UML cung cấp cơ chế biểu diễn các thành viên của lớp, ví dụ thuộc tính và phương thức, cùng thông tin bổ sung của chúng. Một thực thể đơn lẻ của lớp bao gồm ba phần:
- Phần trên cùng chứa tên của lớp. Nó được in đậm, căn giữa, chữ cái đầu viết hoa. Nó cũng có thể chứa văn bản chú thích tùy chọn mô tả bản chất của lớp.
- Phần giữa chứa các thuộc tính của lớp. Chúng được căn lề trái, và chữ cái đầu viết thường.
- Phần dưới cùng chứa các thao tác mà lớp có thể thực hiện. Chúng cũng được căn lề trái, và chữ cái đầu viết thường.
Sao chép
Nhúng
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
Định nghĩa một lớp
Có hai cách để định nghĩa lớp
- Sử dụng tường minh cú pháp class (như class Animal), thao tác này sẽ định nghĩa lớp Animal.
- Thông qua một quan hệ, nó đồng thời định nghĩa hai lớp và quan hệ giữa chúng (như Vehicle <|-- Car).
Sao chép
Nhúng
classDiagram
class Animal
Vehicle <|-- Car
Quy tắc đặt tên: tên lớp chỉ được tạo thành từ các ký tự chữ và số (bao gồm unicode), dấu gạch dưới (_) và dấu gạch ngang (-).
Nhãn của lớp
Nếu bạn cần cung cấp nhãn cho lớp, có thể dùng cú pháp sau:
Sao chép
Nhúng
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
Bạn cũng có thể dùng dấu nháy ngược (``) để thoát các ký tự đặc biệt trong nhãn:
Sao chép
Nhúng
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
Định nghĩa thành viên của lớp
UML cung cấp cơ chế biểu diễn các thành viên của lớp (như thuộc tính và phương thức) cùng thông tin bổ sung về chúng.
Mermaid sẽ phân biệt thuộc tính với hàm hoặc phương thức dựa trên việc có dấu ngoặc đơn () hay không. Những mục có () được coi là hàm hoặc phương thức, còn lại đều được coi là thuộc tính.
Có hai cách để định nghĩa thành viên của lớp, dù dùng cú pháp nào để định nghĩa thành viên thì kết quả đầu ra cũng giống nhau. Hai cách khác nhau là:
1. Dùng dấu hai chấm (:) theo sau là tên thành viên để liên kết thành viên của lớp, cách này rất hữu ích khi định nghĩa một thành viên tại một thời điểm. Ví dụ:
Sao chép
Nhúng
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. Dùng dấu ngoặc nhọn {} để liên kết thành viên của lớp, trong đó các thành viên được nhóm trong dấu ngoặc nhọn. Phù hợp để định nghĩa nhiều thành viên cùng lúc. Ví dụ:
Sao chép
Nhúng
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
Kiểu trả về
Bạn có thể chỉ định kiểu dữ liệu sẽ trả về ở cuối định nghĩa phương thức hoặc hàm. Lưu ý: giữa dấu ')' cuối cùng và kiểu trả về phải có một dấu cách. Một ví dụ:
Sao chép
Nhúng
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
Kiểu tổng quát
Kiểu tổng quát có thể được biểu diễn như một phần của định nghĩa lớp, cũng có thể dùng cho thành viên lớp hoặc kiểu trả về. Để biểu diễn một mục là kiểu tổng quát, hãy bao kiểu đó bằng dấu ngã (~). Hỗ trợ khai báo kiểu lồng nhau, ví dụ List<List<int>>, nhưng hiện chưa hỗ trợ kiểu tổng quát chứa dấu phẩy, như List<List<K, V>>.
Sao chép
Nhúng
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~~
Khả năng hiển thị
Để mô tả khả năng hiển thị của thuộc tính hoặc phương thức/hàm, có thể dùng ký hiệu tùy chọn trước tên thành viên đó:
- + Công khai
- - Riêng tư
- # Được bảo vệ
- ~ Nội bộ
Định nghĩa quan hệ
Quan hệ là một thuật ngữ tổng quát, bao gồm các loại liên kết logic cụ thể được tìm thấy trên biểu đồ lớp và biểu đồ đối tượng.
Sao chép
Nhúng
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| Loại | Mô tả |
|---|---|
| <|-- | Kế thừa |
| *-- | Thành phần |
| o-- | Tổng hợp |
| --> | Liên kết |
| -- | Liên kết (đặc) |
| ..> | Phụ thuộc |
| ..|> | Triển khai |
| .. | Liên kết (nét đứt) |
Sao chép
Nhúng
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
Chúng ta có thể dùng nhãn để mô tả bản chất quan hệ giữa hai lớp. Ngoài ra, mũi tên cũng có thể được dùng theo chiều ngược lại:
Sao chép
Nhúng
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
Nhãn quan hệ
Có thể thêm văn bản nhãn cho quan hệ:
Sao chép
Nhúng
[classA][Arrow][ClassB]:LabelText
Sao chép
Nhúng
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
Quan hệ hai chiều
Quan hệ hai chiều về mặt logic có thể biểu diễn liên kết N:M:
Sao chép
Nhúng
classDiagram
Animal <|--|> Zebra
语法如下:
Sao chép
Nhúng
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| Loại | Mô tả |
|---|---|
| <| | Kế thừa |
| * | Thành phần |
| o | Tổng hợp |
| > | Liên kết |
| < | Liên kết |
| |> | Triển khai |
Link là một trong các loại sau:
| Loại | Mô tả |
|---|---|
| -- | Nét liền |
| .. | Nét đứt |
Giao diện kẹo mút
Lớp còn có thể được gán một loại quan hệ đặc biệt, loại này định nghĩa một giao diện kẹo mút cho lớp. Giao diện kẹo mút được định nghĩa bằng cú pháp sau:
- bar ()-- foo
- foo --() bar
Giao diện có kẹo mút (bar) được kết nối với lớp (foo).
Lưu ý: mỗi giao diện được định nghĩa là duy nhất, nhằm mục đích không chia sẻ giữa các lớp và cũng không cho phép nhiều kết nối trỏ tới nó.
Sao chép
Nhúng
classDiagram
bar ()-- foo
Sao chép
Nhúng
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
Định nghĩa không gian tên
Không gian tên nhóm các lớp lại với nhau.
Sao chép
Nhúng
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
Bản số/Đa bội của quan hệ
Đa bội hay bản số trong biểu đồ lớp biểu thị số lượng thực thể của một lớp có thể liên kết với thực thể của một lớp khác. Ví dụ, mỗi công ty sẽ có một hoặc nhiều nhân viên, không thể là không, còn mỗi nhân viên hiện làm việc tại không hoặc một công ty.
Ký hiệu đa bội được đặt gần cuối của liên kết.
Các tùy chọn bản số khác nhau là:
- 1 chỉ có 1
- 0..1 0 hoặc 1
- 1..* 1 hoặc nhiều
- * 0 hoặc 1 hoặc nhiều
- n n (trong đó n>1)
- 0..n 0 đến n (trong đó n>1)
- 1..n 1 đến n (trong đó n>1)
Bản số có thể được định nghĩa dễ dàng bằng cách bao tùy chọn văn bản bằng dấu ngoặc kép "" ở trước hoặc sau mũi tên đã cho. Ví dụ:
Sao chép
Nhúng
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
Sao chép
Nhúng
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
Chú thích của lớp
Có thể dùng ký hiệu để chú thích lớp, nhằm cung cấp siêu dữ liệu bổ sung về lớp đó. Điều này giúp thể hiện rõ hơn bản chất của lớp. Một số chú thích phổ biến bao gồm:
- <<Interface>> biểu diễn một lớp giao diện
- <<Abstract>> biểu diễn một lớp trừu tượng
- <<Service>> biểu diễn một lớp dịch vụ
- <<Enumeration>> biểu diễn kiểu liệt kê
Chú thích được định nghĩa trong dấu << ở đầu và >> ở cuối. Có ba cách để thêm chú thích cho lớp, kết quả đầu ra của cả ba cách đều giống nhau:
- Nội tuyến cùng định nghĩa lớp
Sao chép
Nhúng
classDiagram
class Shape <<interface>>
Trong một dòng riêng sau khi định nghĩa lớp:
Sao chép
Nhúng
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- Trong cấu trúc lồng nhau của định nghĩa lớp:
Sao chép
Nhúng
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
Chú thích
Có thể nhập chú thích trong biểu đồ lớp, trình soạn thảo sẽ bỏ qua chú thích này. Chú thích cần chiếm một dòng riêng và phải bắt đầu bằng hai dấu phần trăm (%%). Toàn bộ văn bản cho đến dòng tiếp theo đều được coi là chú thích, bao gồm cả bất kỳ cú pháp biểu đồ lớp nào.
Sao chép
Nhúng
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
Đặt hướng của biểu đồ
Bạn có thể dùng câu lệnh hướng để đặt hướng kết xuất của biểu đồ lớp:
Sao chép
Nhúng
classDiagram
direction RL
class Student {
-idCard : IdCard
}
class IdCard{
-id : int
-name : string
}
class Bike{
-id : int
-name : string
}
Student "1" --o "1" IdCard : carries
Student "1" --o "1" Bike : rides
Tương tác
Có thể gắn sự kiện nhấp cho nút. Sự kiện nhấp có thể kích hoạt hàm gọi lại JavaScript, hoặc mở một liên kết sẽ được tải trong tab trình duyệt mới. Lưu ý: tính năng này bị vô hiệu hóa khi dùng securityLevel='strict', và được bật khi dùng securityLevel='loose'.
Bạn có thể định nghĩa các thao tác này trên một dòng riêng sau tất cả khai báo lớp.
Sao chép
Nhúng
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action là link hoặc callback, tùy thuộc vào loại tương tác mà bạn muốn gọi.
- className là id của nút gắn với thao tác.
- reference có thể là liên kết URL, cũng có thể là tên của hàm gọi lại.
- (Tùy chọn) chú thích công cụ là chuỗi hiển thị khi chuột di chuột qua phần tử.
- Hàm gọi lại sẽ được gọi với nodeId làm tham số.
Lưu ý
Có thể dùng note "line1 line2" để thêm chú thích trên biểu đồ. Có thể dùng note for <CLASS NAME> "line1 line2" để thêm chú thích cho một lớp cụ thể.
Ví dụ
Sao chép
Nhúng
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
Liên kết URL:
Sao chép
Nhúng
classDiagram
class Shape
link Shape "https://www.github.com" "This is a tooltip for a link"
class Shape2
click Shape2 href "https://www.github.com" "This is a tooltip for a link"
Cấu hình
Khung thành viên
Có thể ẩn khung thành viên trống của nút lớp, việc này được thực hiện bằng cách thay đổi giá trị hideEmptyMembersBox trong cấu hình biểu đồ lớp.
Sao chép
Nhúng
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck