news 2026/6/10 16:33:49

各种类型状态机

作者头像

张小明

前端开发工程师

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/6/10 11:27:43

k6负载测试可视化终极指南:从数据到洞察的完整实践

k6负载测试可视化终极指南:从数据到洞察的完整实践 【免费下载链接】k6 A modern load testing tool, using Go and JavaScript - https://k6.io 项目地址: https://gitcode.com/GitHub_Trending/k6/k6 k6作为现代化的负载测试工具,其强大的数据可…

作者头像 李华
网站建设 2026/6/10 11:14:05

如何用SymPy快速解决工程数学难题:完整实战指南

如何用SymPy快速解决工程数学难题:完整实战指南 【免费下载链接】sympy 一个用纯Python语言编写的计算机代数系统。 项目地址: https://gitcode.com/GitHub_Trending/sy/sympy 还在为复杂的工程计算和数学推导而头疼吗?面对微分方程、积分运算和符…

作者头像 李华
网站建设 2026/6/10 11:11:34

基于Java的天文科研论文智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 基于Java的天文科研论文智慧管理系统的设计与实现旨在构建一个全面覆盖会员、期刊、论文及审稿等管理功能模块的天文科研论文智慧管理系统。相比于传统系统,该设计不仅具备高度实用性,还融入了多项创新特性。首先&…

作者头像 李华
网站建设 2026/6/10 12:52:53

OpenHashTab强力教程:三步掌握文件哈希值验证技巧

OpenHashTab强力教程:三步掌握文件哈希值验证技巧 【免费下载链接】OpenHashTab 📝 File hashing and checking shell extension 项目地址: https://gitcode.com/gh_mirrors/op/OpenHashTab 在数字时代,文件哈希校验已成为确保数据完整…

作者头像 李华
网站建设 2026/6/10 14:29:17

开源项目文档体系:从使用场景到高效协作的完整指南

开源项目文档体系:从使用场景到高效协作的完整指南 【免费下载链接】twenty 构建一个由社区驱动的Salesforce的现代替代品。 项目地址: https://gitcode.com/GitHub_Trending/tw/twenty 在开源项目的世界里,文档不仅是技术说明,更是项…

作者头像 李华