Sơ đồ trạng thái là gì?
Một Sơ đồ trạng thái (thường được gọi là Máy trạng thái hoặc Sơ đồ trạng thái) là một biểu đồ hành vi biểu đồ UML mô hình hóa vòng đời của một đối tượng hệ thống, thực thể kinh doanh hoặc quy trình chạy thời gian thực. Là một thành phần cơ bản trong đặc tả Ngôn ngữ Mô hình hóa Đơn nhất (UML), biểu đồ loại biểu đồ UML minh họa các trạng thái khác nhau mà một đối tượng có thể tồn tại từ lúc khởi tạo ban đầu cho đến khi hủy bỏ cuối cùng, cùng với các sự kiện hoặc điều kiện cụ thể gây ra sự thay đổi từ trạng thái này sang trạng thái khác.
Dù bạn đang tài liệu hóa các cờ kết nối phức tạp của một kết nối WebSocket, các bước xử lý đơn hàng trong mô hình thanh toán thương mại điện tử, hay hành vi của một hệ thống phần cứng tự động, một máy trạng thái UML cung cấp cho các nhà phát triển phần mềm và kiến trúc sư phần mềm một bản vẽ rõ ràng, không mơ hồ về logic phản ứng phức tạp. Với VPasCode, bạn có thể lập trình các chuyển trạng thái phức tạp ngay lập tức mà không cần lo lắng về việc căn chỉnh lưới hay các mũi tên biên chồng chéo.
Hướng dẫn cú pháp cốt lõi: Các thành phần và cấu trúc
Để viết các bố cục sơ đồ trạng thái chất lượng cao, tuân thủ chuẩn, bạn cần hiểu rõ các điểm bắt đầu và kết thúc, định nghĩa trạng thái, chuyển tiếp sự kiện, các trạng thái hợp thành lồng nhau và các điểm lựa chọn điều kiện.
1. Trạng thái khởi đầu và kết thúc
Mỗi máy trạng thái phải có điểm vào và, tùy chọn, điểm kết thúc. Trong cú pháp PlantUML, các phần tử biên này được biểu diễn bằng một bao bọc ký hiệu sao sạch sẽ:
[*] --> TênTrạngThái(Xác định trạng thái khởi đầu)TênTrạngThái --> [*](Xác định trạng thái kết thúc)
2. Xác định trạng thái và chuyển tiếp sự kiện
Các trạng thái được khai báo tự động mỗi khi chúng được liên kết bởi một mũi tên hướng (-->). Để thêm ngữ cảnh cho một chuyển tiếp, thêm dấu hai chấm (:) theo sau là sự kiện cụ thể, sự kiện kích hoạt API hoặc lời gọi phương thức gây ra thay đổi trạng thái:
[*] --> NgắtKếtNối
NgắtKếtNối --> ĐangKếtNối : "connect()"
ĐangKếtNối --> ĐãKếtNối : "auth_success" 
3. Trạng thái hợp thành / Lồng ghép
Các ứng dụng phức tạp thường có các trạng thái riêng biệt chứa các trạng thái con lồng ghép của chính chúng. Bạn có thể triển khai các cấu trúc hợp thành này bằng cách sử dụng từ khóa statekèm theo dấu ngoặc nhọn mở:
state ActiveWorkspace {
[*] --> Idle
Idle --> Typing : "phím nhấn"
Typing --> Idle : "hết thời gian"
} 
4. Điểm lựa chọn (nhánh điều kiện)
Khi một sự kiện xảy ra, hệ thống thường phải đánh giá các cờ dữ liệu nội bộ trước khi xác định điểm đến trạng thái tiếp theo. Để vẽ một hình thoi lựa chọn chuẩn UML, sử dụng từ khóa <<choice>>định danh kiểu dáng:
state check_payment <<choice>>
OrderPlaced --> check_payment : "process()"
check_payment --> Paid : [số dư >= tổng cộng]
check_payment --> Failed : [số dư < tổng cộng] 
Các thực hành tốt nhất cho sơ đồ trạng thái sạch sẽ
- Sử dụng mô tả trạng thái:Bạn có thể thêm chi tiết hoạt động rõ ràng, hàm khởi tạo hoặc hàm thoát ngay bên trong nút trạng thái bằng cách sử dụng dấu hai chấm bao bọc ngay lập tức (ví dụ,
StateName : entry / logTimestamp()). - Giữ tên trạng thái ngắn gọn:Sử dụng CamelCase hoặc snake_case cho mã biến trạng thái nội bộ của bạn (ví dụ,
PaymentProcessing), và sử dụng dấu ngoặc kép nếu bạn cần gắn nhãn dài dễ đọc cho chúng. - Quản lý hướng định tuyến vector:Nếu bản đồ vòng đời đa tầng của bạn trở nên lộn xộn theo chiều dọc, hãy chèn các quy tắc không gian ngay trong các mũi tên kết nối (ví dụ,
-right->hoặc-down->) để cân bằng mật độ bố cục.
Các ví dụ sơ đồ trạng thái PlantUML trong thế giới thực
Ví dụ 1: Chu kỳ sống mạng thiết bị IoT (Trạng thái hợp thành và lựa chọn)
Mẫu này theo dõi các vòng lặp trạng thái hành vi kết nối của một mô-đun cảm biến IoT, minh họa các khối lồng ghép cấu trúc phức tạp và các nút lựa chọn đánh giá điều kiện.
@startuml
[*] --> Offline
Offline --> Connecting : "bật nguồn"
state Connecting {
[*] --> Khởi tạo
Khởi tạo --> Giải quyếtDNS : "thiết bị sẵn sàng"
Giải quyếtDNS --> GửiYêuCầuKếtNối : "đã nhận địa chỉ IP"
}
state authentication_check <<choice>>
Connecting --> authentication_check : "nhận thách thức máy chủ"
authentication_check --> Online : [token_hợp lệ]
authentication_check --> Offline : [token_hết hạn] : "nháy đèn đỏ"
state Online {
[*] --> Đang chờ
Đang chờ --> GửiDữLiệu : "kích hoạt bộ đếm thời gian"
GửiDữLiệu --> Đang chờ : "nhận xác nhận"
Đang chờ --> TiếtKiệmNăngLượng : "phát hiện pin yếu"
}
Online --> Offline : "mất kết nối"
@enduml 
Phân tích cú pháp: Bản đồ này rõ ràng tách biệt các vòng lặp hoạt động riêng lẻ. Khi phần cứng chuyển sang trạng thái hợp thànhConnecting trạng thái bao bọc, nó theo dõi các trạng thái con cục bộ như giải quyết DNS trước khi đạt đếnauthentication_check kim cương lựa chọn. Các dấu ngoặc ([token_hợp lệ]) đại diện cho điều kiện bảo vệ chuẩn UML.
Ví dụ 2: Máy trạng thái thực hiện đơn hàng thương mại điện tử (Trạng thái con đồng thời)
Bản thiết kế doanh nghiệp nâng cao này mô hình hóa hệ thống đơn hàng đa luồng, thể hiện các hành vi đồng thời vuông góc (xử lý gói vận chuyển và hồ sơ hóa đơn cùng lúc) bằng các đường chia (--).
@startuml
[*] --> GiỏHàng
GiỏHàng --> ĐãGửiĐơn : "nhấn nút thanh toán"
ĐãGửiĐơn --> XửLýThanhToán : "xác nhận tài khoản"
state ProcessingPayment {
[*] --> LiênLạcNgânHàng
LiênLạcNgânHàng --> ThanhToánHoànTất : "thanh toán thành công"
}
XửLýThanhToán --> ĐãXácNhậnĐơn : "thanh toán thành công"
state OrderConfirmed {
[*] --> XửLýLogistics
state LogisticsHandling {
[*] --> LấyHàng
LấyHàng --> ĐóngHộp : "hàng đã được bảo quản"
ĐóngHộp --> ĐangGiaoHang : "nhãn đã in"
}
--
[*] --> HồSơHóaĐơn
state BillingRecords {
[*] --> SoạnHóaĐơn
SoạnHóaĐơn --> GửiHóaĐơnEmail : "tệp PDF đã tạo"
}
}
ĐãXácNhậnĐơn --> ĐãLưuTrữ : "xác nhận giao hàng"
ĐãLưuTrữ --> [*]
@enduml 
Phân tích cú pháp: Bên trong cấu trúc hợp thànhOrderConfirmed trạng thái hợp thành, ký hiệu gạch đôi (--) hoạt động như một bộ chia vuông góc. Điều này hướng dẫn PlantUML chia sơ đồ thành hai trạng thái đồng thời thực thi song song: đường ống logistics vật lý ở bên trái, và cập nhật hóa đơn doanh nghiệp ở bên phải.