TÓM TẮT
- 1 Mở Đầu
- 2 1. Máy Trạng Thái Là Gì? – Khái Niệm Cơ Bản
- 3 2. Tại Sao Cần Vẽ Máy Trạng Thái?
- 4 3. Các Bước Cơ Bản Để Vẽ Máy Trạng Thái
- 5 4. Kỹ Thuật Nâng Cao Khi Vẽ Máy Trạng Thái
- 6 5. Ứng Dụng Thực Tế Của Máy Trạng Thái
- 7 6. Những Sai Lầm Thường Gặp Khi Vẽ Máy Trạng Thái Và Cách Tránh
- 8 7. Quy Trình Hoàn chỉnh Để Tích Hợp Máy Trạng Thái Vào Dự Án
- 9 8. Tài Nguyên Học Tập Thêm
- 10 9. Kết Luận
Mở Đầu
Trong lĩnh vực khoa học máy tính và kỹ thuật phần mềm, máy trạng thái (finite state machine – FSM) là một công cụ mạnh mẽ để mô tả hành vi của hệ thống dưới dạng các trạng thái và các chuyển đổi giữa chúng. Việc vẽ máy trạng thái không chỉ giúp các nhà phát triển, kỹ sư hiểu rõ hơn về luồng hoạt động của phần mềm mà còn hỗ trợ trong việc thiết kế, kiểm thử và bảo trì hệ thống. Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết, từng bước một, từ các khái niệm cơ bản đến các kỹ thuật nâng cao, giúp bạn tự tin vẽ được máy trạng thái cho bất kỳ dự án nào.
1. Máy Trạng Thái Là Gì? – Khái Niệm Cơ Bản
1.1 Định Nghĩa
Máy trạng thái là một mô hình toán học mô tả một hệ thống có một số trạng thái hữu hạn và quy tắc chuyển đổi (transition) giữa các trạng thái đó dựa trên các sự kiện (event) hoặc đầu vào (input). Khi một sự kiện xảy ra, máy sẽ chuyển từ trạng thái hiện tại sang một trạng thái mới theo quy tắc đã định.
1.2 Các Thành Phần Chính
- Tập hợp các trạng thái (S): Mỗi trạng thái đại diện cho một tình huống cụ thể của hệ thống (ví dụ:
Idle,Running,Paused). - Tập hợp các ký hiệu đầu vào (Σ): Các sự kiện hoặc tín hiệu mà máy có thể nhận (ví dụ:
Start,Stop,Pause). - Hàm chuyển đổi (δ): Định nghĩa cách chuyển từ trạng thái này sang trạng thái khác khi nhận được một ký hiệu đầu vào.
- Trạng thái khởi đầu (s₀): Trạng thái mà máy bắt đầu khi được khởi tạo.
- Tập hợp các trạng thái chấp nhận (F) (đối với máy trạng thái chấp nhận): Các trạng thái mà nếu máy dừng lại sẽ được coi là “chấp nhận”.
1.3 Phân Loại Máy Trạng Thái

Có thể bạn quan tâm: Cách Vẽ Máy Biến Thế: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Deterministic Finite Automaton (DFA): Mỗi cặp (trạng thái, ký hiệu đầu vào) chỉ có duy nhất một trạng thái kế tiếp.
- Nondeterministic Finite Automaton (NFA): Có thể có nhiều trạng thái kế tiếp cho cùng một cặp (trạng thái, ký hiệu đầu vào).
- Mealy Machine: Đầu ra phụ thuộc vào trạng thái hiện tại và ký hiệu đầu vào.
- Moore Machine: Đầu ra phụ thuộc chỉ vào trạng thái hiện tại.
2. Tại Sao Cần Vẽ Máy Trạng Thái?
- Trực quan hóa: Giúp mọi người nhìn thấy toàn bộ luồng logic, giảm nhầm lẫn.
- Thiết kế chuẩn: Đảm bảo mọi trường hợp được xem xét, tránh lỗi logic.
- Kiểm thử: Dễ dàng tạo ra các test case dựa trên các đường đi trong biểu đồ.
- Tài liệu hóa: Khi dự án lớn, máy trạng thái trở thành tài liệu tham chiếu quan trọng.
- Tự động hoá: Nhiều công cụ có thể sinh mã nguồn từ mô hình FSM.
3. Các Bước Cơ Bản Để Vẽ Máy Trạng Thái
Bước 1: Xác Định Yêu Cầu Hệ Thống
- Mô tả chức năng: Hệ thống cần làm gì? Ví dụ: một máy bán hàng tự động.
- Xác định các trạng thái: Liệt kê tất cả các tình huống mà hệ thống có thể ở.
- Xác định các sự kiện: Các hành động người dùng hoặc tín hiệu ngoại vi.
Bước 2: Lập Danh Sách Trạng Thái và Sự Kiện
| Trạng thái | Mô tả | Sự kiện có thể xảy ra |
|---|---|---|
Idle |
Hệ thống chờ người dùng | InsertCoin, PowerOff |
HasMoney |
Đã nhận tiền | SelectProduct, Refund |
Dispensing |
Đang giao hàng | ProductDelivered |
OutOfStock |
Hàng hết | Restock |
Error |
Lỗi hệ thống | Reset |
Bước 3: Xây Dựng Bảng Chuyển Đổi (Transition Table)
| Trạng thái hiện tại | Sự kiện | Trạng thái tiếp theo | Hành động (Action) |
|---|---|---|---|
Idle |
InsertCoin |
HasMoney |
Lưu số tiền |
HasMoney |
SelectProduct |
Dispensing |
Kiểm tra tồn kho |
Dispensing |
ProductDelivered |
Idle |
Trả lại tiền thừa |
HasMoney |
Refund |
Idle |
Trả lại tiền |
Idle |
PowerOff |
Off |
Tắt máy |
Error |
Reset |
Idle |
Khởi động lại |
Bước 4: Vẽ Biểu Đồ Trạng Thái (State Diagram)

Có thể bạn quan tâm: Cách Vẽ Máu Đơn Giản: Hướng Dẫn Từng Bước Để Tạo Hiệu Ứng Đầy Màu Sắc Và Thực Tế
4.1. Công Cụ Đề Xuất
- Draw.io (diagrams.net): Miễn phí, hỗ trợ nhiều ký hiệu.
- Microsoft Visio: Công cụ chuyên nghiệp, tích hợp trong môi trường Office.
- Lucidchart: Trực tuyến, hỗ trợ cộng tác nhóm.
- PlantUML: Dùng mã nguồn để tạo diagram, thích hợp cho developers.
4.2. Các Ký Hiệu Cơ Bản
| Ký hiệu | Ý nghĩa |
|---|---|
| Hình tròn (circle) | Trạng thái |
| Mũi tên (arrow) | Chuyển đổi |
| Nhãn trên mũi tên | event / action |
| Hình tròn đặc (filled circle) | Trạng thái khởi đầu |
| Hình vòng tròn bao quanh (double circle) | Trạng thái chấp nhận (hoặc cuối) |
4.3. Thực Hiện Vẽ
- Vẽ trạng thái: Đặt các trạng thái thành các vòng tròn, sắp xếp sao cho các chuyển đổi ít chồng chéo.
- Đánh dấu trạng thái bắt đầu: Vẽ một vòng tròn rỗng phía trước trạng thái
Idlevà nối bằng mũi tên. - Thêm chuyển đổi: Vẽ mũi tên từ trạng thái này sang trạng thái khác, ghi nhãn
event / action. - Kiểm tra vòng lặp: Đối với các hành động tự lặp (ví dụ:
Idle→Idlekhi không có sự kiện), dùng mũi tên vòng tròn. - Kiểm tra tính toàn vẹn: Đảm bảo mọi trạng thái và sự kiện đều được thể hiện, không còn “điểm chết”.
Bước 5: Kiểm Tra Và Sửa Đổi
- Kiểm tra tính toàn bộ (coverage): Mỗi sự kiện trong yêu cầu phải có ít nhất một chuyển đổi.
- Kiểm tra tính nhất quán: Không có trạng thái “mồ côi” (không có đường vào hoặc ra).
- Kiểm tra deadlock: Đảm bảo không có chu trình vô hạn không có điều kiện ra.
Bước 6: Tài Liệu Hóa
- Mô tả chi tiết: Ghi chú cho mỗi trạng thái và chuyển đổi (các ràng buộc, thời gian, ngoại lệ).
- Phiên bản: Đánh số phiên bản diagram để theo dõi thay đổi.
- Liên kết với mã nguồn: Nếu dùng PlantUML, lưu file
.pumltrong repo.
4. Kỹ Thuật Nâng Cao Khi Vẽ Máy Trạng Thái
4.1. Hierarchical State Machines (Statecharts)
Khi hệ thống phức tạp, số lượng trạng thái có thể lên tới hàng chục hoặc hàng trăm. Statecharts (được giới thiệu bởi David Harel) cho phép nhúng (nesting) trạng thái, tạo ra các siêu trạng thái (superstate) và substate. Điều này giúp:
- Giảm độ phức tạp: Các hành vi chung được đặt trong superstate.
- Tái sử dụng: Các substate có thể được dùng lại trong nhiều superstate.
- Xử lý đồng thời: Hỗ trợ trạng thái song song (orthogonal regions).
Ví Dụ: Máy Giặt
- Superstate:
Operating - Substate:
FillingWater,Washing,Rinsing,Spinning - Superstate:
Paused - Substate:
PausedDuringWash,PausedDuringSpin
4.2. Guard Conditions (Điều Kiện Bảo Vệ)

Có thể bạn quan tâm: Cách Vẽ Máu Trên Sách: Kỹ Thuật, Ý Tưởng Và Lưu Ý An Toàn
Trong một chuyển đổi, chúng ta có thể thêm điều kiện để quyết định xem chuyển đổi có được thực hiện hay không. Ví dụ:
HasMoney --SelectProduct && Stock>0--> Dispensing
HasMoney --SelectProduct && Stock==0--> OutOfStock
Guard conditions giúp tránh các chuyển đổi không hợp lệ và làm cho biểu đồ trở nên rõ ràng hơn.
4.3. Actions và Activities
- Entry Action: Thực hiện khi vào một trạng thái.
- Exit Action: Thực hiện khi rời khỏi một trạng thái.
- Internal Action: Thực hiện trong khi ở trạng thái mà không thay đổi trạng thái.
Trong diagram, thường ghi dưới dạng:
stateName entry / initialize() exit / cleanup()
4.4. Pseudostates
- Choice: Điểm quyết định dựa trên guard condition.
- Junction: Điểm hợp nhất nhiều chuyển đổi thành một.
- Fork/Join: Dùng cho các trạng thái song song (parallel).
4.5. Sử Dụng PlantUML Để Tạo Máy Trạng Thái
PlantUML hỗ trợ cú pháp đơn giản để mô tả FSM:
@startuml --> Idle Idle --> HasMoney : InsertCoin / addMoney()
HasMoney --> Dispensing : SelectProduct stock>0 / dispense()
HasMoney --> OutOfStock : SelectProduct stock==0 / notifyOut()
Dispensing --> Idle : ProductDelivered / returnChange()
OutOfStock --> Idle : Restock / resetStock()
Idle --> Off : PowerOff / shutdown()
@enduml
Khi chạy file .puml, PlantUML sẽ tự động tạo diagram đẹp mắt, dễ chia sẻ trong tài liệu markdown hoặc wiki.

Có thể bạn quan tâm: Cách Vẽ Máu Trong Manga: Kỹ Thuật, Phong Cách Và Bí Quyết Tạo Ảnh Hưởng
5. Ứng Dụng Thực Tế Của Máy Trạng Thái
5.1. Phát Triển Giao Diện Người Dùng (UI)
- React/Redux: Sử dụng FSM để quản lý trạng thái UI, tránh “state explosion”.
- XState: Thư viện JavaScript chuyên về state machines, hỗ trợ hierarchical states, parallel states.
5.2. Kiểm Thử (Testing)
- Model-Based Testing: Tạo test case tự động dựa trên FSM.
- JUnit + State Machine Testing: Sử dụng thư viện như
jfsmđể mô phỏng và kiểm thử.
5.3. Hệ Thống Nhúng
- Arduino: Sử dụng FSM để quản lý các chế độ hoạt động (sleep, active, error).
- Automotive: ECU (Electronic Control Unit) thường được thiết kế dựa trên trạng thái.
5.4. Ngôn Ngữ Lập Trình
- C++: Boost.Statechart, Qt State Machine Framework.
- Java: Spring State Machine, Apache Commons SCXML.
- Python: transitions, pytransitions.
6. Những Sai Lầm Thường Gặp Khi Vẽ Máy Trạng Thái Và Cách Tránh

| Sai Lầm | Hậu Quả | Giải Pháp |
|---|---|---|
| Quá nhiều trạng thái trong một diagram | Khó đọc, dễ nhầm lẫn | Sử dụng hierarchical states hoặc chia diagram thành nhiều phần. |
| Không đánh dấu trạng thái khởi đầu | Người đọc không biết bắt đầu từ đâu | Luôn có một vòng tròn rỗng và mũi tên chỉ vào trạng thái khởi đầu. |
| Bỏ qua các trường hợp ngoại lệ | Lỗi runtime, không bắt được lỗi | Thêm trạng thái Error và các guard conditions. |
| Ghi nhãn mũi tên không rõ ràng | Khó hiểu chuyển đổi | Sử dụng cú pháp event / action và ghi chú guard condition trong ngoặc vuông. |
| Không cập nhật diagram khi code thay đổi | Tài liệu lỗi thời | Thiết lập quy trình review, tự động sinh diagram từ code (ví dụ PlantUML). |
7. Quy Trình Hoàn chỉnh Để Tích Hợp Máy Trạng Thái Vào Dự Án
- Phân tích yêu cầu → Xác định trạng thái và sự kiện.
- Tạo transition table → Đảm bảo tính toàn vẹn.
- Vẽ sơ đồ ban đầu → Sử dụng công cụ trực quan.
- Rà soát với team → Nhận phản hồi, chỉnh sửa.
- Chuyển sang mã nguồn → Sử dụng thư viện FSM phù hợp.
- Viết test case dựa trên FSM → Model-Based Testing.
- Kiểm thử tích hợp → Đảm bảo hành vi đúng.
- Bảo trì diagram → Cập nhật khi có thay đổi tính năng.
8. Tài Nguyên Học Tập Thêm
- Sách: “State Machines in Java”, “Design Patterns: Elements of Reusable Object-Oriented Software” (Chapter 4 – State).
- Khóa học online: Coursera – “Model-Based Design”, Udemy – “Finite State Machines in Embedded Systems”.
- Blog: “Statecharts – The Visual Formalism for Complex Systems” (David Harel), “Using XState for UI State Management”.
- Công cụ: PlantUML, Mermaid (markdown), yEd Graph Editor.
9. Kết Luận
Việc vẽ máy trạng thái không chỉ là một kỹ năng thiết kế mà còn là một phương pháp tư duy giúp chúng ta hiểu sâu hơn về luồng logic của hệ thống. Từ các bước cơ bản như xác định yêu cầu, tạo bảng chuyển đổi, đến các kỹ thuật nâng cao như hierarchical states, guard conditions và pseudostates, bạn đã có một bộ công cụ đầy đủ để tạo ra các diagram chính xác, dễ bảo trì và có khả năng sinh mã tự động.
Hãy bắt đầu áp dụng ngay hôm nay: lựa chọn một dự án nhỏ, thực hành vẽ máy trạng thái bằng PlantUML, sau đó dần dần mở rộng sang các hệ thống phức tạp hơn. Khi bạn đã thành thạo, việc thiết kế phần mềm, kiểm thử và bảo trì sẽ trở nên mượt mà hơn rất nhiều.
Chúc bạn thành công trong hành trình trở thành bậc thầy vẽ máy trạng thái!
