网络连接、支付流程、登录界面和游戏角色都要回答同一个问题:系统此刻处于什么状态,接到某个事件后能去哪里。少量条件可以用几个布尔值处理,一旦组合增多,代码会出现互相矛盾的状态。
有限状态机把状态和迁移集中定义,让系统更可读也更可检验。
两个开关只有四种组合,六个开关却有六十四种。现实业务往往只允许其中少数状态,其余组合既非法又难测试。
![]()
若登录流程同时出现“已认证”和“已退出”,或支付同时处于“成功”和“处理中”,错误就来自状态表达方式本身。有限状态机用一个状态变量取代分散开关,并明确每个事件允许的迁移。
例如订单只能从待支付进入已支付或已取消,已取消后不能重新发货。未定义的迁移直接视为非法,系统因此获得一份可审查的规则表。
确定性有限自动机包含有限字母表、有限状态集合、起始状态、接受状态和迁移函数。对每一组“当前状态加输入符号”,它都只有一个下一状态。
处理输入时不需要递归或回溯,只需逐个读取符号并查询迁移。以模式ab*c为例,机器先等待a,读到a后进入允许重复b的状态,随后读到c进入接受状态。
![]()
错误前缀可以落入陷阱状态,此后任何输入都继续拒绝。机器无需记住出现过多少个b,只需记住“目前处在b区域”。
输入长度为n时,确定性自动机通常只做n次迁移,时间复杂度为O(n)。相比可能发生灾难性回溯的某些正则实现,它的执行路径更可预测。
词法分析、部分正则引擎、协议状态、结账流程、交通灯和数字电路,都能找到这一结构。更重要的是可见性。
![]()
状态图或迁移表让产品、测试和工程人员能共同讨论:是否遗漏某个事件,失败能否恢复,超时应去哪里。测试也可以围绕所有合法迁移和关键非法迁移构建,而不是碰运气覆盖布尔组合。
它只能保存有限摘要,无法独立处理无限计数或任意深度嵌套。匹配成对括号需要记住嵌套深度,通常要引入栈,也就是更强的下推自动机。
业务系统若有大量并行区域和层级状态,也可能需要层次状态机或其他建模方式。陷阱状态也不能滥用。
网络协议里,超时、可恢复错误和永久失败的处理不同,全部丢进一个死状态会损失恢复所需信息。正确做法不是把所有逻辑硬塞进有限状态机,而是先问:未来行为是否只依赖一段有限的过去摘要。
![]()
答案为是时,它往往是比散乱条件更可靠的选择。落地时可以先画迁移表,再写代码:逐行列出当前状态、事件、下一状态和附带动作,并为每条边设计测试。
状态变化最好集中在一个入口,避免不同模块私自修改。只有当规则清楚、迁移可追踪时,状态机才会降低复杂度,而不是换一种方式隐藏复杂度。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.