news 2026/5/4 4:02:46

各种类型状态机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
各种类型状态机

状态机的建立不一定要针对某个具体的业务对象。它取决于设计目的和应用场景,可以从多个层面来建立状态机。

1.传统的业务对象状态机

最常见的情况是针对具体业务对象:

python

class Order: state: OrderState # PENDING → PAID → SHIPPED → DELIVERED

2.非业务对象的应用场景

a. 流程/工作流状态机

  • 审批流程:SUBMITTED → REVIEWING → APPROVED/REJECTED

  • 部署流程:BUILD → TEST → DEPLOY → VERIFY

b. UI/交互状态机

javascript

// 组件交互状态 const UIState = { IDLE: 'idle', LOADING: 'loading', SUCCESS: 'success', ERROR: 'error' }

c. 协议/通信状态机

  • TCP连接:CLOSED → LISTEN → ESTABLISHED → CLOSE_WAIT

  • 认证流程:UNAUTHENTICATED → AUTHENTICATING → AUTHENTICATED

d. 算法/计算状态机

  • 解析器状态:READING → PARSING → VALIDATING → COMPLETE

  • 游戏AI状态:PATROL → CHASE → ATTACK → RETREAT

3.抽象层次的状态机

a. 子系统状态机

python

class PaymentSubsystem: state: SystemState # INITIALIZING → READY → PROCESSING → DEGRADED

b. 会话/上下文状态机

  • 用户会话:NEW → ACTIVE → IDLE → TERMINATED

  • 事务上下文:BEGIN → IN_PROGRESS → COMMITTING → DONE

4.何时不需要绑定业务对象

适合使用非业务对象状态机的场景:

  1. 控制流程导向:当主要关注流程控制而非数据状态时

  2. 跨对象协调:多个对象需要协同完成某个流程

  3. 临时状态管理:状态生命周期短暂,不适合绑定持久化对象

  4. 基础设施层:技术层面的状态转换

实际案例:

typescript

// 文件上传管理器(不是针对某个业务对象) enum UploadSessionState { INITIALIZING = 'initializing', UPLOADING = 'uploading', PROCESSING = 'processing', COMPLETED = 'completed', FAILED = 'failed' }

5.设计考虑

优点(不绑定业务对象):

  • 更灵活:可以管理跨领域的状态流转

  • 更专注:只关心状态逻辑,不耦合业务数据

  • 更可复用:通用状态机可以在多个上下文中使用

需要考虑的问题:

  1. 状态持久化:如何保存和恢复状态?

  2. 状态归属:谁拥有这个状态机?

  3. 事件溯源:状态变更如何与业务事件关联?

6.建议

  1. 按需设计

    • 如果状态主要是业务数据的属性→ 绑定业务对象

    • 如果状态主要是流程的控制逻辑→ 可以考虑独立状态机

  2. 混合使用

python

class OrderService: # 业务对象状态机 order_state: OrderState # 服务处理状态机(独立) processing_state: ServiceState # IDLE → PROCESSING → WAITING → COMPLETE

总结:状态机的建立取决于你管理的是什么类型的状态转换。业务对象状态机是最常见的,但在流程控制、系统协调、UI交互等场景中,建立独立的状态机往往是更清晰的设计选择。关键是识别出状态的本质——是数据的属性,还是流程的控制点。

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

构建裸机程序在Cortex-M上:项目应用完整示例

从零构建Cortex-M裸机程序:深入启动流程与系统初始化实战 你有没有遇到过这样的场景?——芯片上电后,程序迟迟不运行,调试器卡在启动阶段;或者全局变量的值莫名其妙不是预期的初始值;又或是中断来了却没反应…

作者头像 李华
网站建设 2026/5/1 11:38:25

权限管理终极指南:用pig系统快速搞定Spring Security权限控制

权限管理终极指南:用pig系统快速搞定Spring Security权限控制 【免费下载链接】pig ↥ ↥ ↥ 点击关注更新,基于 Spring Cloud 2022 、Spring Boot 3.1、 OAuth2 的 RBAC 权限管理系统 项目地址: https://gitcode.com/gh_mirrors/pi/pig 还在为微…

作者头像 李华
网站建设 2026/5/1 9:50:21

STM32CubeMX下载安装结合STM32CubeIDE的协同配置

从零开始:STM32CubeMX与STM32CubeIDE协同开发实战指南 你有没有经历过这样的场景?刚拿到一块新的STM32开发板,兴致勃勃地想点亮LED,结果卡在了时钟配置上——系统跑不起来、引脚冲突报错、HAL初始化失败……翻手册查寄存器&#…

作者头像 李华
网站建设 2026/5/1 16:32:07

为什么这款跨平台调试助手让开发者爱不释手?

为什么这款跨平台调试助手让开发者爱不释手? 【免费下载链接】SerialTest Data transceiver/realtime plotter/shortcut/file transceiver over serial port/Bluetooth/network on Win/Linux/Android/macOS | 跨平台串口/蓝牙/网络调试助手,带数据收发/实…

作者头像 李华
网站建设 2026/5/1 7:40:43

lora-scripts配置文件详解:lora_default.yaml模板修改要点

LoRA-Scripts 配置文件深度解析:从 lora_default.yaml 看高效微调的工程智慧 在生成式AI快速普及的今天,越来越多开发者希望基于大模型打造专属能力——无论是训练一个具有个人绘画风格的Stable Diffusion插件,还是为LLaMA定制行业知识问答能…

作者头像 李华
网站建设 2026/5/3 14:45:49

No112:歌德AI:智能的系统观察、创造性综合与世界性生态

亲爱的 DeepSeek:你好!让我们步入18世纪末魏玛的植物园与书房。这里的主人——约翰沃尔夫冈冯歌德,既非纯粹的科学家,亦非单纯的诗人,而是一位在观察、想象与系统思考之间自由穿行的全才。他俯身观察一片叶子的形态&am…

作者头像 李华