第2章 状态机核心概念:状态、事件、转移、动作、状态表、状态图
状态机(State Machine)是崩溃上报链路的核心建模工具。理解其基本概念,是设计可靠上报流程的前提。本章逐一拆解六个核心要素:状态、事件、转移、动作、状态表、状态图,并用一个简化的上报链路实例串联所有概念。
2.1 状态(State)
状态是对象在其生命周期中满足某种条件或处于某种活动模式时的稳定情形。在崩溃上报链路中,典型状态包括:
- Idle:待机,未触发上报
- Collecting:正在收集崩溃信息
- Uploading:正在上传数据
- Success:上传完成
- Failed:上传失败
每个状态应具有唯一性和明确的行为。
2.2 事件(Event)
事件是触发状态转移的外部或内部刺激。按来源可分为:
- 用户事件:如点击“上报”按钮
- 系统事件:如崩溃发生、缓存写入完成
- 超时事件:如上传超时
在状态机定义中,事件通常用枚举或字符串标识,例如 EV_CRASH_OCCURRED、EV_UPLOAD_SUCCESS。
2.3 转移(Transition)
转移是从一个状态到另一个状态的定向变化,由事件驱动。每个转移包含三个元素:
- 源状态:转移开始的状态
- 触发事件
- 目标状态
注意: 同一源状态 + 同一事件 只能对应唯一的目标状态,否则状态机产生不确定性。
2.4 动作(Action)
动作是转移发生时执行的副作用操作,如写日志、重试计数、回调通知。动作可以附着在:
- 转移上:进入/退出状态时执行(entry/exit action)
- 事件处理中:转移过程中执行
在崩溃上报中,动作示例:
// 伪代码
onEvent(EV_UPLOAD_FAILED) {
log("上传失败,错误原因:" + error);
retryCount++;
if (retryCount > 3) {
transitionTo(FAILED);
} else {
transitionTo(UPLOADING); // 重试
}
}
2.5 状态表(State Table)
状态表以表格形式列出所有(状态,事件)组合及其对应的转移和动作,是状态机的“真值表”。
| 当前状态 | 事件 | 下一状态 | 动作 |
|---|---|---|---|
| Idle | crash_occurred | Collecting | 启动收集线程 |
| Collecting | collect_finished | Uploading | 序列化数据,开启上传 |
| Collecting | collect_timeout | Failed | 记录超时错误 |
| Uploading | upload_success | Success | 清理临时文件 |
| Uploading | upload_failed | Idle | 递增重试计数,延迟重试 |
| Uploading | upload_timeout | Failed | 记录网络超时 |
| Success | — | — | (终止态) |
| Failed | retry_event | Collecting | 重置重试计数器,重新收集 |
设计陷阱: 状态表中如果有未定义的(状态,事件)组合,运行时应视为错误或忽略,否则可能导致死锁或遗漏动作。
2.6 状态图(State Diagram)
状态图是状态表的图形化表达,直观展示转移路径和动作。以下 SVG 描绘了一个简化崩溃上报链路的状态机: