TÓM TẮT
- 1 1. Giới thiệu chung về biểu đồ trạng thái
- 2 2. Quy trình vẽ biểu đồ trạng thái từ A đến Z
- 2.1 2.1. Bước 1: Xác định phạm vi và đối tượng cần mô hình hoá
- 2.2 2.2. Bước 2: Thu thập và liệt kê các trạng thái
- 2.3 2.3. Bước 3: Xác định các sự kiện và hành động
- 2.4 2.4. Bước 4: Xây dựng bảng chuyển đổi (Transition Table)
- 2.5 2.5. Bước 5: Chọn công cụ vẽ
- 2.6 2.6. Bước 6: Vẽ các thành phần cơ bản
- 2.7 2.7. Bước 7: Kiểm tra và tối ưu hoá
- 2.8 2.8. Bước 8: Ghi chú và tài liệu hoá
- 3 3. Ví dụ thực tế: Vẽ biểu đồ trạng thái cho một máy bán hàng tự động
- 4 4. Các kỹ thuật nâng cao trong vẽ biểu đồ trạng thái
- 5 5. Các lỗi thường gặp khi vẽ biểu đồ trạng thái và cách phòng tránh
- 6 6. So sánh biểu đồ trạng thái với các loại diagram UML khác
- 7 7. Thực hành: Tạo một biểu đồ trạng thái cho hệ thống đặt phòng khách sạn
- 8 8. Công cụ hỗ trợ tự động hoá và tích hợp
- 9 9. Kiểm thử dựa trên biểu đồ trạng thái
- 10 10. Kết luận
1. Giới thiệu chung về biểu đồ trạng thái
Biểu đồ trạng thái (State Diagram) là một trong những công cụ quan trọng nhất trong lĩnh vực phân tích và thiết kế hệ thống, đặc biệt là trong các phương pháp mô hình hóa như UML (Unified Modeling Language). Nó giúp mô tả cách một đối tượng (object) hoặc một hệ thống thay đổi trạng thái qua thời gian dựa trên các sự kiện (event) và hành động (action) cụ thể. Khi bạn muốn hiểu rõ cách một hệ thống phản hồi với các tác động bên ngoài, biểu đồ trạng thái là công cụ trực quan và mạnh mẽ nhất.
1.1. Lý do cần vẽ biểu đồ trạng thái
- Hiểu rõ luồng logic: Giúp nhà phát triển, nhà phân tích và các bên liên quan nắm bắt được các trạng thái quan trọng và cách chuyển đổi giữa chúng.
- Phát hiện lỗi sớm: Khi mô tả chi tiết các trạng thái, các trường hợp không mong muốn (như deadlock, trạng thái không xác định) sẽ dễ dàng được phát hiện.
- Tài liệu hóa: Biểu đồ trạng thái là một phần của tài liệu thiết kế, hỗ trợ việc bảo trì và nâng cấp hệ thống trong tương lai.
- Giao tiếp hiệu quả: Đối với các nhóm làm việc đa ngành (phát triển, QA, quản lý), biểu đồ trạng thái cung cấp một ngôn ngữ chung, dễ hiểu.
1.2. Các thành phần cơ bản của biểu đồ trạng thái
- State (Trạng thái): Đại diện cho một điều kiện hoặc tình huống mà đối tượng đang ở. Được vẽ dưới dạng hình chữ nhật bo góc.
- Transition (Chuyển đổi): Đường mũi tên nối giữa các trạng thái, biểu thị một sự kiện hoặc điều kiện kích hoạt.
- Event (Sự kiện): Điều kiện hoặc hành động bên ngoài kích hoạt chuyển đổi.
- Action (Hành động): Các thao tác thực hiện khi chuyển đổi xảy ra, thường được viết trong dấu ngoặc vuông .
- Initial State (Trạng thái bắt đầu): Điểm khởi đầu của biểu đồ, biểu thị bằng một vòng tròn đen nhỏ.
- Final State (Trạng thái kết thúc): Điểm kết thúc, biểu thị bằng một vòng tròn có vòng trong.
- Composite State (Trạng thái tổng hợp): Trạng thái chứa các trạng thái con, cho phép mô tả chi tiết hơn.
- Guard Condition (Điều kiện bảo vệ): Điều kiện logic bổ sung cho sự kiện, viết trong dấu ngoặc trước sự kiện.
2. Quy trình vẽ biểu đồ trạng thái từ A đến Z
2.1. Bước 1: Xác định phạm vi và đối tượng cần mô hình hoá
- Xác định đối tượng: Ví dụ, một máy bán hàng tự động, một tài khoản ngân hàng, một quy trình đặt hàng.
- Xác định ranh giới: Đối tượng sẽ tương tác với môi trường nào? Các hệ thống phụ trợ nào sẽ ảnh hưởng?
- Thu thập yêu cầu: Từ tài liệu yêu cầu, user stories, hoặc interview với người dùng.
2.2. Bước 2: Thu thập và liệt kê các trạng thái
- Brainstorm: Ghi lại mọi trạng thái mà đối tượng có thể ở trong quá trình hoạt động.
- Phân loại: Tách các trạng thái thành “đang hoạt động”, “đang chờ”, “đã hoàn thành”, “lỗi”.
- Kiểm tra tính đầy đủ: Đảm bảo không bỏ sót trạng thái quan trọng như “Idle”, “Processing”, “Error”.
2.3. Bước 3: Xác định các sự kiện và hành động
- Sự kiện (Event): Thông thường là hành động của người dùng (click, input), tín hiệu từ hệ thống (timeout, data received), hoặc thời gian (timer).
- Hành động (Action): Các bước thực hiện khi sự kiện xảy ra, ví dụ: “display message”, “update database”, “send email”.
2.4. Bước 4: Xây dựng bảng chuyển đổi (Transition Table)

Có thể bạn quan tâm: Cách Vẽ Biểu Đồ Trên Powerpoint: Hướng Dẫn Chi Tiết Từ A Đến Z
| Current State | Event | Guard Condition | Action | Next State |
|---|---|---|---|---|
| Idle | InsertCoin | coin>0 | display “Ready” | Ready |
| Ready | SelectItem | itemAvailable | dispense item | Dispensing |
| Dispensing | ItemDispensed | — | reset timer | Idle |
| Ready | Timeout | — | return coin | Idle |
| … | … | … | … | … |
- Lợi ích: Bảng chuyển đổi giúp bạn không bỏ sót bất kỳ trường hợp nào và là nền tảng để vẽ biểu đồ.
2.5. Bước 5: Chọn công cụ vẽ
- Công cụ miễn phí: draw.io (diagrams.net), Lucidchart (phiên bản miễn phí), yEd Graph Editor.
- Công cụ trả phí: Microsoft Visio, Enterprise Architect, Visual Paradigm.
- IDE tích hợp: Eclipse với plugin UML, IntelliJ IDEA với plugin PlantUML.
2.6. Bước 6: Vẽ các thành phần cơ bản
- Vẽ Initial State: Bắt đầu bằng một vòng tròn đen.
- Thêm các trạng thái: Đặt các hình chữ nhật bo góc, đặt tên ngắn gọn.
- Kết nối bằng Transition: Dùng mũi tên, ghi sự kiện và hành động trên mũi tên.
- Thêm Guard Condition: Nếu có, đặt trong dấu trước sự kiện.
- Kết thúc bằng Final State (nếu cần): Vòng tròn có vòng trong.
2.7. Bước 7: Kiểm tra và tối ưu hoá
- Kiểm tra tính toàn vẹn: Mỗi trạng thái (ngoại trừ Final) phải có ít nhất một transition ra và vào.
- Tránh vòng lặp vô hạn: Nếu có vòng lặp, phải có điều kiện dừng (guard) hoặc timeout.
- Sử dụng Composite State: Khi biểu đồ trở nên quá phức tạp, nhóm các trạng thái liên quan thành một Composite State.
- Rà soát lại với stakeholder: Đảm bảo biểu đồ phản ánh đúng yêu cầu thực tế.
2.8. Bước 8: Ghi chú và tài liệu hoá
- Thêm chú thích: Giải thích các guard condition phức tạp, các hành động quan trọng.
- Phiên bản: Ghi lại ngày, người thực hiện, và thay đổi so với phiên bản trước.
- Lưu trữ: Đặt trong thư mục tài liệu thiết kế, kèm theo các tài liệu liên quan như Use Case Diagram, Sequence Diagram.
3. Ví dụ thực tế: Vẽ biểu đồ trạng thái cho một máy bán hàng tự động
3.1. Phạm vi và đối tượng
- Đối tượng: Máy bán hàng tự động (Vending Machine).
- Chức năng chính: Nhận tiền, cho phép chọn sản phẩm, trả lại tiền, và phát hành sản phẩm.
3.2. Các trạng thái chính
- Idle – Máy đang chờ người dùng.
- AcceptingCoin – Đang nhận tiền.
- ReadyToSelect – Đủ tiền, người dùng có thể chọn sản phẩm.
- Dispensing – Đang phát hành sản phẩm.
- ReturningChange – Trả lại tiền thừa.
- OutOfService – Lỗi hoặc bảo trì.
3.3. Các sự kiện và hành động
| Event | Guard | Action | Next State |
|---|---|---|---|
| InsertCoin | coinTotal < price | update coinTotal | AcceptingCoin |
| InsertCoin | coinTotal >= price | update coinTotal, display “Ready” | ReadyToSelect |
| SelectItem | itemAvailable & coinTotal >= price | dispense item, deduct price | Dispensing |
| DispenseComplete | — | calculate change, start ReturnChange | ReturningChange |
| ChangeReturned | — | reset coinTotal, display “Thank you” | Idle |
| ErrorDetected | — | display error, go to OutOfService | OutOfService |
| ServiceReset | — | reset system, go to Idle | Idle |
3.4. Biểu đồ trạng thái (miêu tả bằng văn bản)

Có thể bạn quan tâm: Cách Vẽ Biểu Đồ Thanh Ngang: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
Initial --> Idle
Idle --> AcceptingCoin : InsertCoin coinTotal < price / update coinTotal
AcceptingCoin --> ReadyToSelect : InsertCoin coinTotal >= price / update coinTotal, display “Ready”
ReadyToSelect --> Dispensing : SelectItem itemAvailable && coinTotal >= price / dispense item, deduct price
Dispensing --> ReturningChange : DispenseComplete / calculate change
ReturningChange --> Idle : ChangeReturned / reset coinTotal, display “Thank you”
Idle --> OutOfService : ErrorDetected / display error
OutOfService --> Idle : ServiceReset / reset system
3.5. Lưu ý khi vẽ
- Guard Condition: Đặt trong dấu ngay trước sự kiện, giúp biểu đồ ngắn gọn.
- Action: Đặt sau dấu “/”, có thể liệt kê nhiều hành động ngăn cách bằng dấu phẩy.
- Composite State: Nếu “Dispensing” có các bước phụ (checking inventory, moving motor), có thể biến thành Composite State chứa các trạng thái con như “CheckInventory”, “ActivateMotor”, “ReleaseProduct”.
4. Các kỹ thuật nâng cao trong vẽ biểu đồ trạng thái
4.1. Sử dụng Orthogonal Regions (Khu vực vuông góc)
Khi một đối tượng có nhiều luồng trạng thái đồng thời, bạn có thể chia biểu đồ thành các khu vực vuông góc (orthogonal regions). Ví dụ: Một thiết bị IoT có thể đồng thời ở trạng thái “NetworkConnected” và “BatteryCharging”. Mỗi khu vực sẽ có các trạng thái và chuyển đổi riêng, nhưng chúng cùng tồn tại đồng thời.
4.2. Pseudostates (Trạng thái giả)
- Entry Point và Exit Point: Định nghĩa điểm vào/ra cho một Composite State, giúp tái sử dụng các chuyển đổi.
- Junction: Dùng để hợp nhất nhiều transition vào một điểm chung, giảm độ phức tạp.
- Choice: Định nghĩa quyết định dựa trên guard condition, tương tự như if-else.
4.3. Submachine State (Trạng thái máy con)
Nếu một trạng thái có một biểu đồ trạng thái riêng (submachine), bạn có thể tái sử dụng biểu đồ này ở nhiều nơi. Ví dụ: “Authentication” là một submachine chứa các trạng thái “Idle”, “Verifying”, “Authenticated”, “Failed”. Khi một hệ thống lớn cần xác thực ở nhiều mô-đun, bạn chỉ cần nhúng submachine này.
4.4. History Pseudostate (Lịch sử)

Có thể bạn quan tâm: Cách Vẽ Biểu Đồ So Sánh Chuẩn Nhất: Hướng Dẫn Từ Cơ Bản Đến Nâng Cao
Khi rời một Composite State và quay lại, bạn có thể muốn trở về trạng thái cuối cùng đã ở trước đó. Sử dụng “shallow history” (H) hoặc “deep history” (H) để ghi nhớ trạng thái trước khi rời.
4.5. Event Deferral (Hoãn sự kiện)
Trong một số trạng thái, bạn có thể muốn hoãn một sự kiện cho đến khi chuyển sang trạng thái khác. UML cho phép định nghĩa “deferred events” để tránh mất mát sự kiện.
5. Các lỗi thường gặp khi vẽ biểu đồ trạng thái và cách phòng tránh
| Lỗi | Mô tả | Cách khắc phục |
|---|---|---|
| Thiếu trạng thái khởi đầu | Biểu đồ không có Initial State, gây khó hiểu | Đảm bảo luôn có vòng tròn đen ở đầu. |
| Transition không có guard nhưng cần | Khi nhiều transition xuất phát từ cùng một trạng thái mà không có điều kiện phân biệt | Thêm Guard Condition hoặc dùng Choice Pseudostate. |
| Vòng lặp vô hạn | Transition quay lại cùng trạng thái mà không có điều kiện dừng | Thêm timeout hoặc guard condition để break vòng. |
| Quá nhiều trạng thái trong một diagram | Khi diagram quá phức tạp, khó đọc | Sử dụng Composite State hoặc submachine để tách lớp. |
| Không có final state khi cần | Không định nghĩa điểm kết thúc cho quy trình | Thêm Final State (vòng tròn có vòng trong). |
| Guard condition không rõ ràng | Viết “valid” mà không định nghĩa chi tiết | Viết chi tiết: balance >= price && itemInStock. |
| Action viết sai vị trí | Đặt action trước event hoặc không dùng dấu “/” | Tuân thủ cú pháp: Event Guard / Action. |
6. So sánh biểu đồ trạng thái với các loại diagram UML khác
| Diagram | Mục đích | Khi nào dùng | Ưu điểm | Nhược điểm |
|---|---|---|---|---|
| State Diagram | Mô tả chuyển đổi trạng thái của một đối tượng | Khi hành vi phụ thuộc vào trạng thái (ví dụ: máy, giao diện) | Rõ ràng về luồng trạng thái, dễ phát hiện lỗi logic | Không mô tả chi tiết tương tác giữa các đối tượng |
| Sequence Diagram | Mô tả tương tác thời gian giữa các đối tượng | Khi cần hiểu luồng tin nhắn | Thể hiện thứ tự gọi hàm, thời gian | Không hiển thị trạng thái nội bộ |
| Activity Diagram | Mô tả luồng công việc, quy trình | Khi muốn mô tả quy trình nghiệp vụ | Dễ hiểu, thể hiện song song | Không chi tiết về trạng thái |
| Use Case Diagram | Mô tả chức năng hệ thống và người dùng | Khi thu thập yêu cầu | Tóm tắt chức năng | Không chi tiết về hành vi nội bộ |
| Class Diagram | Mô tả cấu trúc dữ liệu, quan hệ | Khi thiết kế mô hình dữ liệu | Rõ ràng về thuộc tính, phương thức | Không mô tả hành vi động |
7. Thực hành: Tạo một biểu đồ trạng thái cho hệ thống đặt phòng khách sạn
7.1. Phạm vi
- Đối tượng: Đơn đặt phòng (Booking).
- Chức năng: Tạo đặt phòng, xác nhận, thanh toán, huỷ, và hoàn tiền.
7.2. Các trạng thái
- New – Đặt phòng chưa được xác nhận.
- PendingPayment – Đã xác nhận, chờ thanh toán.
- Confirmed – Đã thanh toán, phòng đã được giữ.
- CheckedIn – Khách đã nhận phòng.
- CheckedOut – Khách đã trả phòng.
- Cancelled – Đặt phòng đã bị huỷ.
- Refunded – Hoàn tiền sau huỷ.
7.3. Các sự kiện

Có thể bạn quan tâm: Cách Vẽ Biểu Đồ Pivot Table Trong Excel: Hướng Dẫn Chi Tiết Từ A Đến Z
- SubmitBooking – Người dùng gửi yêu cầu đặt.
- ConfirmBooking – Hệ thống xác nhận khả dụng.
- Pay – Thanh toán thành công.
- Cancel – Người dùng huỷ.
- CheckIn – Khách nhận phòng.
- CheckOut – Khách trả phòng.
- Refund – Hoàn tiền.
7.4. Bảng chuyển đổi
| Current State | Event | Guard | Action | Next State |
|---|---|---|---|---|
| New | SubmitBooking | validData | create record | PendingPayment |
| PendingPayment | Pay | paymentSuccess | generate receipt | Confirmed |
| PendingPayment | Cancel | within24h | mark cancelled | Cancelled |
| Confirmed | CheckIn | checkInDate <= today | allocate room | CheckedIn |
| CheckedIn | CheckOut | checkOutDate <= today | release room | CheckedOut |
| Cancelled | Refund | paymentMade | process refund | Refunded |
| Refunded | – | – | send confirmation | – (final) |
7.5. Đồ thị (textual)
Initial --> New
New --> PendingPayment : SubmitBooking / create record
PendingPayment --> Confirmed : Pay paymentSuccess / generate receipt
PendingPayment --> Cancelled : Cancel within24h / mark cancelled
Cancelled --> Refunded : Refund paymentMade / process refund
Confirmed --> CheckedIn : CheckIn checkInDate <= today / allocate room
CheckedIn --> CheckedOut : CheckOut checkOutDate <= today / release room
CheckedOut --> Final : – / send final summary
8. Công cụ hỗ trợ tự động hoá và tích hợp
8.1. PlantUML
PlantUML cho phép viết biểu đồ trạng thái bằng ngôn ngữ text, rất tiện cho việc version control (Git). Ví dụ:
@startuml --> Idle
Idle --> AcceptingCoin : InsertCoin coin < price / updateCoin()
AcceptingCoin --> Ready : InsertCoin coin >= price / updateCoin(); displayReady()
Ready --> Dispensing : SelectItem itemAvailable && coin >= price / dispense()
Dispensing --> ReturningChange : dispenseDone / calculateChange()
ReturningChange --> Idle : changeReturned / reset()
@enduml
- Ưu điểm: Dễ tích hợp vào tài liệu Markdown, tự động generate hình ảnh.
- Nhược điểm: Giao diện không trực quan như drag‑and‑drop.
8.2. Visual Paradigm
Công cụ này hỗ trợ đầy đủ UML, cho phép tạo submachine, history, orthogonal regions, và xuất ra code skeleton (Java, C#, …). Thích hợp cho dự án lớn.
8.3. Eclipse UML2 Tools

Plugin cho Eclipse, tích hợp trực tiếp vào môi trường phát triển, hỗ trợ kiểm tra tính nhất quán (consistency check) và generate documentation.
9. Kiểm thử dựa trên biểu đồ trạng thái
9.1. Test case từ Transition Table
Mỗi transition tương ứng với ít nhất một test case:
- Test 1: Từ
Idle→AcceptingCoinkhi người dùng ném tiền < giá. - Test 2: Từ
AcceptingCoin→Readykhi tổng tiền ≥ giá. - Test 3: Kiểm tra guard
itemAvailablefalse → không cho phép chuyển sangDispensing.
9.2. State‑based testing
- Coverage: Đảm bảo State Coverage (mọi trạng thái ít nhất một lần) và Transition Coverage (mọi transition ít nhất một lần).
- Tools: Model‑based testing tools như GraphWalker hoặc TestOptimal có thể tự động sinh test case dựa trên biểu đồ.
10. Kết luận
Vẽ biểu đồ trạng thái không chỉ là một bước trong quy trình thiết kế phần mềm mà còn là một phương pháp tư duy giúp bạn:
- Hiểu sâu cách hệ thống phản ứng với các sự kiện.
- Phát hiện sớm các lỗi logic, deadlock, hoặc trạng thái không xác định.
- Giao tiếp hiệu quả giữa các thành viên trong dự án.
- Tự động hoá việc tạo test case và thậm chí sinh code.
Các lưu ý quan trọng khi thực hiện
- Luôn bắt đầu bằng bảng chuyển đổi: Giúp tránh bỏ sót.
- Sử dụng guard condition rõ ràng: Đừng để “valid” mơ hồ.
- Khi biểu đồ phức tạp, chia thành Composite State hoặc submachine.
- Kiểm tra tính toàn vẹn: Mỗi trạng thái phải có ít nhất một đường ra và vào.
- Tài liệu hoá: Ghi chú, version, và lưu trữ trong kho tài liệu dự án.
Bằng việc nắm vững quy trình, các ký hiệu chuẩn UML và các kỹ thuật nâng cao như orthogonal regions, history pseudostate, bạn sẽ có thể tạo ra những biểu đồ trạng thái sạch sẽ, dễ hiểu và thực sự hỗ trợ quá trình phát triển phần mềm. Hãy áp dụng những kiến thức này vào dự án thực tế của bạn và trải nghiệm sự khác biệt mà một biểu đồ trạng thái tốt mang lại!
