Tuỳ theo góc độ mà có các cách phân loại phổ biến sau
1. Phân loại theo số lượng trạng thái
Finite state machine
- Số trạng thái hữu hạn, đếm được.
- Khi nói đến state machine trong lập trình, người ta thường ngầm hiểu là Finite state machine.
- Ví dụ như đèn giao thông, máy ATM, các trạng thái của nhân vật game
Infinite state machine
- Số trạng thái là vô hạn
- Ví dụ như: turning machine, counter không giới hạn
2. Phân loại theo cách tính output
Mealy machine
- Output phụ thuộc vào state hiện tại + input
- Phản ứng nhanh hơn
// Output thay đổi theo input
state: 'LOCKED',
on: {
CORRECT_PIN: { target: 'UNLOCKED', actions: 'showSuccess' },
WRONG_PIN: { target: 'LOCKED', actions: 'showError' }
}Moore machine
- Output chỉ phụ thuộc vào state hiện tại
- Ổn định hơn, dễ thiết kế
// Output cố định theo state
states: {
RED: {
entry: 'turnOnRedLight', // output của state RED
after: { 30000: 'GREEN' }
}
}3. Phân loại theo tính xác định
Deterministic FSM (DFA - Deterministic Finite Automaton)
- Từ 1 state + 1 input → chỉ có đúng 1 state tiếp theo
states: {
idle: {
on: {
START: 'running' // chỉ có 1 đích đến
}
}
}Non-deterministic FSM (NFA - Nondeterministic Finite Automaton)
- Từ 1 state + 1 input → có thể có nhiều state tiếp theo
states: {
searching: {
on: {
FOUND: [
{ target: 'success', cond: 'isValidResult' },
{ target: 'retry', cond: 'needsRetry' },
{ target: 'failed' } // fallback
]
}
}
}4. Phân loại theo cấu trúc
Flat state machine
- Tất cả states ở cùng 1 cấp
- Đơn giản nhưng khó mở rộng
states: {
idle: {},
loading: {},
success: {},
error: {}
}Hierarchical State Machine (HSM) / Statecharts
- States cỏ thể lồng nhau
- Có parent state và child state
- Phù hợp hệ thống phức tạp
states: {
authenticated: {
initial: 'dashboard',
states: {
dashboard: {},
profile: {
initial: 'viewing',
states: {
viewing: {},
editing: {}
}
},
settings: {}
}
},
unauthenticated: {}
}Parallel State Machine
- Có thể ở nhiều state cùng lúc (trong các region khác nhau)
- Mỗi region độc lập
type: 'parallel',
states: {
upload: {
initial: 'idle',
states: {
idle: {},
uploading: {},
done: {}
}
},
playback: {
initial: 'stopped',
states: {
stopped: {},
playing: {},
paused: {}
}
}
}
// Có thể vừa uploading vừa playing5. Phân loại theo khả năng mở rộng
Basic FSM
- Chỉ có state và transition
- Không có context, memory
Extended FSM
- Có thêm context
- Có guards điều kiện
- Có actions side effect
6. Phân loại theo mục đích sử dụng
Acceptor/Recognizer
- Nhận input, quyết định chấp nhận hay từ chối
- Dùng trong: compiler, parser, validation
Transducer
- Nhận input và tạo output
- Thường dùng trong protocol handlers, data transformation
Sequence generator
- Tự động tạo chuỗi output
- Dùng trong animation, workflow
So sánh
| Loại | Đặc điểm | Khi nào dùng |
|---|---|---|
| FSM | Hữu hạn state | Hầu hết trường hợp |
| Mealy | Output = f(state, input) | Cần phản ứng nhanh |
| Moore | Output = f(state) | Cần ổn định |
| DFA | Deterministic | Hành vi cố định |
| NFA | Non-deterministic | Nhiều lựa chọn |
| Flat | 1 cấp độ | Đơn giản |
| HSM | Nested states | Phức tạp, nhiều cấp |
| Parallel | Nhiều state cùng lúc | Độc lập processes |
| EFSM | Có context | Cần lưu dữ liệu |