状态机:把行为规则写清楚
约 14 分钟
当系统包含正常、预警、告警、静音和故障状态时,堆叠许多 if 容易产生矛盾。有限状态机把当前状态、事件、转移条件和动作明确列出,使需求能直接对应程序与测试。
状态与变量不同
温度值是连续变量,“告警中”是行为模式。只有当不同模式对同一事件响应不同,才值得拆成状态。状态过少会隐藏行为,过多则产生组合爆炸。
事件和守卫条件
事件可以是采样到达、按键按下、定时器到期;守卫条件如“连续超限10秒且传感器有效”。转移表写清从哪个状态、在什么条件下、进入哪里。
进入、退出和持续动作
进入告警时启动蜂鸣器并记录时间;留在告警时闪灯;退出时关闭声音但保留历史。把动作归属写明,可避免每轮循环重复初始化或忘记清理。
优先级
传感器故障应优先于普通阈值判断,紧急停止应覆盖用户静音。不要依赖 if 的偶然排列表达安全优先级,应用状态图和测试明确。
时间不用阻塞等待
用时间戳或定时事件实现持续超限和延迟解除,避免程序 delay 十秒期间无法响应按键和故障。
实现前先手工走查事件序列,确认每一步状态唯一。
练习:画五状态图,再为每条转移写至少一个正常测试和一个边界测试。
小纸条
复杂控制逻辑为什么适合用状态机而不是不断叠加 if?