news 2026/6/30 16:36:56

上位机状态机怎么写才不会变成一堆ifelse

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
上位机状态机怎么写才不会变成一堆ifelse

很多人一听状态机,就觉得很复杂。

好像要画图。

要写框架。

要搞一堆设计模式。

其实在不少上位机项目里,先不用想那么重。

最重要的是把一件事想清楚:

当前状态下,收到某个事件,下一步应该变成什么状态。

如果这个关系没想清楚,代码里就会到处都是 if else。

if else 一开始很好写

项目刚开始,状态少,判断也少。

比如:

voidController::start(){if(m_state==State::Idle){m_state=State::Running;m_device->start();}}

这很正常。

但后面要加暂停、继续、报警、复位。

代码就会变成这样:

if(m_state==State::Idle){...}elseif(m_state==State::Running){...}elseif(m_state==State::Paused){...}elseif(m_state==State::Alarm){...}

每个按钮里来一份。

每个设备回调里再来一份。

时间久了,谁都不敢动。

因为你不知道这个判断到底服务哪个流程。

先把状态和事件写出来

状态机不一定一开始就写得很正式。

可以先把状态和事件列出来。

比如一个很简单的流程:

enumclassState{Idle,Running,Paused,Alarm};enumclassEvent{Start,Pause,Resume,Stop,AlarmRaised,Reset};

这样写的好处是,项目里的人能先对齐语言。

什么叫运行中。

什么叫暂停。

什么情况下能复位。

这些话先说清楚,代码才不会越写越随意。

关键是限制不该发生的事

状态机最有用的地方,不是让代码看起来高级。

而是限制一些不该发生的操作。


比如空闲时可以启动。

运行中可以暂停或停止。

报警后只能复位。

暂停时可以继续,也可以停止。

这些规则可以先写得直白一点:

boolController::canStart()const{returnm_state==State::Idle;}boolController::canReset()const{returnm_state==State::Alarm;}

按钮是否可点,也从这些函数来。

不要界面上自己判断一套,控制层又判断一套。

判断多了,迟早不一致。

状态变化要集中

上位机项目里,最怕状态到处改。

按钮里改一下。

设备回调里改一下。

定时器里改一下。

异常处理里再改一下。

后面出问题时,很难知道状态到底是谁改的。

可以先加一个统一入口:

voidController::setState(State state){if(m_state==state)return;appendLog(QString("状态变化:%1 -> %2").arg(stateText(m_state),stateText(state)));m_state=state;emitstateChanged(m_state);}

这样至少能知道状态什么时候变了。

界面也可以只监听stateChanged来刷新。

状态不再靠各个按钮自己改。

不用一上来追求完美

很多项目不是缺一个复杂状态机框架。

而是连最基本的状态边界都没想清楚。

先做到这几件事,就已经比一堆 if else 稳很多:

  • 状态用枚举写清楚
  • 事件用名字说清楚
  • 哪些状态允许哪些操作
  • 状态变化统一入口
  • 状态变化写日志

这些东西不花哨。

但现场排查问题时很有用。

状态能说清楚,流程才不容易乱。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 16:34:52

STM32新手避坑指南:用寄存器操作GPIOA实现OLED的IIC通信(附完整代码)

STM32寄存器操作实战:手把手实现OLED的IIC通信驱动第一次接触STM32的寄存器操作时,那种直接操控硬件的快感让人着迷。不同于库函数的"黑箱"操作,寄存器编程让你真正触摸到芯片的脉搏。本文将带你用最原始的方式——寄存器操作&…

作者头像 李华
网站建设 2026/6/30 16:34:42

Windows系统文件AcXtrnal.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/6/30 16:33:47

24 Hybrid Search、Rerank、Query Rewrite:RAG 高级优化三件套

专栏:大模型应用开发:从原理到生产 篇号:24 内容标签:RAG、Hybrid Search、Rerank、Query Rewrite、AI应用开发 上一篇我们做了一次 RAG 排障。 结论很直接:RAG 答不准,不能先怪模型。先看 Top-K 里有没有正确资料,资料是不是完整,排序是不是靠前,上下文有没有被污染…

作者头像 李华
网站建设 2026/6/30 16:28:24

5分钟掌握APK安装器:Windows电脑直接运行安卓应用的终极指南

5分钟掌握APK安装器:Windows电脑直接运行安卓应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK安装器是一款革命性的Windows工具&#xff…

作者头像 李华
网站建设 2026/6/30 16:28:14

Selenium 4相对定位器:告别脆弱定位,提升自动化脚本健壮性

1. 项目概述:为什么我们需要相对定位器?如果你做过一段时间的Web自动化测试,尤其是用Selenium,那你肯定对“定位器”这三个字又爱又恨。爱的是,它让我们能精准地操控页面上的每一个按钮、输入框;恨的是&…

作者头像 李华
网站建设 2026/6/30 16:25:39

iOS激活锁绕过终极指南:使用applera1n免费解锁iPhone 6s至iPhone X

iOS激活锁绕过终极指南:使用applera1n免费解锁iPhone 6s至iPhone X 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾经面对一台被激活锁困住的iPhone,看着它变成"电…

作者头像 李华