如何绘画状态机来描述业务变化 (状态应该怎么画)
本文目录导航:
如何绘画状态机来描述业务变化
对于设计过商品、订单、优惠券等复杂功能的产品经理(PM)来说,描述清楚功能的本质会遇到挑战。
技术团队会不断追问:有几种状态?如何转移?何时转移?系统根据什么条件判断状态?这样的问题,往往是因为缺乏清晰的状态定义和转换规则。
本文将深入探讨如何使用状态机来描述业务变化,以及状态机的原理和应用方法。
为什么需要使用状态机?让我们从一个亲身经历的例子开始。
去年,我在设计电商系统的订单模块时,就遇到了上述问题。
最初,我参照淘宝的订单系统,将订单状态设计为待付款、已付款、已发货、已完成和已关闭等五种状态。
然而,上线后很快就发现了问题:付款之后直接传给仓库发货,导致很多订单信息有误时来不及修改;用户下单后想修改地址或商品,而发货信息已经传给仓库,修改起来非常困难。
因此,我们不得不新增了一个中间状态“已确认”,让客服审核无误后,再传给仓库进行发货流程。
随着业务的发展,我们又引入了退款退货功能,需要引入“退款中”状态,并且增加退款子状态机、退货子状态机。
这些变化最初是通过文字描述和流程图来表示的,但服务端的开发人员难以理解,不得不多次确认。
后来,我研究了状态机的概念,发现使用一张图就可以清晰地表示所有状态及转换条件,这极大地简化了沟通。
状态机的来源和发展状态机最早起源于电路设计领域,用于根据电路信号按照预设状态进行转移,协调相关信号动作并完成特定操作。
后来,这个概念被软件编程领域继承,用来表示有限多个状态以及在这些状态之间转移和动作的模型,称为有限状态机(FSM),是常见的软件设计模式之一。
对于产品经理来说,理解和应用状态机的概念,可以更好地阐述业务实体的功能本质,并让技术团队更容易理解。
如何定义状态机?从产品经理的角度来看,状态机是用来表示业务实体的所有状态以及相互间的转移关系的模型。
业务实体可以是客观上可以相互区分的事物,如订单、优惠券、商品等。
对于大部分对象,尽管存在状态的概念,但不一定需要画出状态机图。
在本文中,我们将重点探讨状态机的描述方法、常见状态机实例以及如何画出状态机。
状态机的描述方法文字描述是最古老的方法,但繁琐且不易理解。
表格可以更系统地描述状态和转换条件,但不够直观。
图形是最推荐的方法,通过圆角矩形表示状态,有向线条上的文字表示条件,线条的方向表示状态迁移。
一般从左向右画图表示初始到终止的顺序,无需特别标注。
常见状态机实例我们可以通过灯泡状态机和订单状态机等实例来理解状态机的基本概念。
灯泡状态机描述了电灯开关的简单状态迁移,而订单状态机则展示了网购过程中订单状态的复杂变化。
状态机的要素状态机的核心要素包括开始状态、终止状态和中间状态。
当达到终止状态,状态机停止。
在状态机中,条件和动作通常可以合并为一个描述,以明确状态迁移的具体条件。
命名时应站在用户立场,力求标准化。
如何画出状态机通常使用状态图工具如Axure来表示状态机。
在状态图中,“状态”用圆角矩形表示,“条件”用有向线条上的文字表示,线条的方向表示状态迁移。
状态图的起点和终点通常用实心圆圈表示。
在画图时,应去除无关状态,确保结构清晰,并考虑状态机的扩展性。
总结与思考并非所有的业务实体都需要产出状态机图,关键在于识别需要清晰定义状态转换的复杂功能。
在设计过程中,可以考虑京东小程序首页的领券功能、电商领域中优惠券功能模块等,尝试画出状态机图,以优化用户体验和业务流程。
此外,思考如何通过状态机图提升设计的可理解性和可维护性,对于提高团队协作效率具有重要意义。

状态机编程实例-面向对象的状态设计模式
面向对象的状态设计模式的核心思想在于通过不同的类表示不同的状态,状态机从一个状态转换到另一个状态时,表现为在运行时改变自己的类。
此模式引入了一个炸弹状态的抽象基类BombState,用于派生具体的工作状态类,例如设置状态(SettingState)和倒计时状态(TimingState)。
在模式下,BombState类为炸弹的两个工作状态声明了一些公共的接口:onUP、onDOWN、onARM和onTICK。
具体的工作状态类通过定义自己的onUP等操作,实现各自状态类需要处理的功能。
为了实现状态的维护,模式设计了一个上下文类Bomb3,它通过一个抽象类BombState的指针来实现。
上下文(context)可以理解为环境或语境,每一段程序都有很多的外部变量,要想让程序独立运行,必须把所有外部变量的值传进去,这些值的集合就是上下文。
在本例中,BombState的运行需要一个上下文类作为其参数,这个参数就是Bomb3类。
上下文类Bomb3中还包含需要用到的扩展状态变量,并通过提供对BombState一样的接口,即每派生一个事件对应一个操作。
上下文类中的事件处理是通过state_指针实现的,它代表了对当前状态对象的全部特定请求,状态的改变对应于当前工作状态类对象的改变,通过上下文操作tran()实现状态转换。
在C++语言中实现面向对象的状态设计模式,需要定义几个关键类:状态基类与派生类、炸弹业务类(上下文类)、以及主函数。
状态基类定义了通用接口,派生类则具体实现了不同的状态行为。
炸弹业务类提供通用的事件处理接口,其内部根据具体状态调用对应状态类的事件处理函数。
主函数简洁,主要调用通用的事件处理接口,实现状态转换和业务逻辑。
总结,面向对象的状态设计模式利用C++的继承特性及类指针,为状态机编程提供了一种高效、灵活的实现方式,简化了状态转换的管理,并通过上下文类实现了状态的动态维护。
通过本篇内容,重点理解了如何通过类的设计实现状态机的动态改变,以及上下文类在状态机中的作用。
pup软件开发过程特点
什么是人啊