state machine diagrams用于需求分析阶段还是设计阶段
状态机图在两个阶段都会使用,但其抽象层次、目的和描述的对象有根本区别。
下面我们来详细分解这个问题。
总结:核心区别
| 方面 | 需求分析阶段 | 设计阶段 |
|---|---|---|
| 主要目的 | 厘清和规定系统外部可见的行为。 | 定义系统内部如何实现这些行为。 |
| 描述对象 | 系统(作为一个黑盒)或关键业务实体的状态。 | 软件组件、类或模块的状态。 |
| 抽象层次 | 高,关注“做什么”,与实现技术无关。 | 低,关注“怎么做”,与实现技术紧密相关。 |
| 属于 | 功能需求(具体来说是行为需求) | 技术设计(架构设计或详细设计) |
1. 状态机图在需求分析阶段
在需求分析阶段,我们使用状态机图来捕捉和定义系统的功能需求。
它属于功能需求吗?是的。
用户需求 通常是高层次的、用自然语言描述的目标和场景,例如“用户希望能够在线支付订单”。
功能需求 则更具体,描述了系统必须提供的功能、行为或服务。状态机图通过描绘系统或关键业务对象(如“订单”、“保单”)在各种事件下的状态变化,精确地定义了系统的行为,因此它是功能需求的一种形式化、可视化的描述方式。
在需求分析阶段的作用:
发现遗漏的需求: 绘制状态机图的过程会迫使分析师和领域专家思考所有可能的事件和状态,常常能发现被忽略的异常流程或边界情况(例如,“已发货的订单还能取消吗?”)。
与用户/客户沟通: 图形化的表示比纯文字更易于理解,可以用于和领域专家确认业务规则是否正确。
作为测试的基础: 测试人员可以根据需求阶段的状态机图来设计覆盖所有状态路径的测试用例。
需求分析阶段的状态机图示例:
我们为一个“订单”系统建模。
状态:
待支付、已支付、已发货、已完成、已取消、退款中。事件:
用户付款、用户取消、商家发货、用户确认收货、用户申请退款。
这个图描述的是系统需要对外提供的、与订单生命周期相关的完整行为,不关心你是用Java、C#还是数据库触发器来实现它。
2. 状态机图在设计阶段
在设计阶段,状态机图被用来实现在需求中规定的行为。
它属于设计工件。
此时,状态机图从“系统要做什么”转向“软件模块如何做”。
它可能会描述一个具体的类(如
Order类)、一个控制器(如OrderController)或一个微服务的内部状态逻辑。
在设计阶段的作用:
指导编码: 设计阶段的状态机图可以非常直接地转化为代码(例如,使用
switch-case语句、状态模式等)。定义组件接口: 状态变化可能涉及多个组件之间的交互,状态机图可以帮助厘清这些接口。
处理技术细节: 它会包含更多技术相关的状态,如
等待数据库响应、网络连接超时等,这些在需求分析阶段是不会出现的。
设计阶段的状态机图示例:
为了实现上述订单需求,我们为 OrderService 类设计一个状态机。
状态: 可能新增
数据验证中、支付网关通信中、库存锁定中、持久化到数据库中。事件:
支付API回调、数据库提交成功、库存服务响应。
这个图关注的是系统内部组件如何协作和流转以实现“用户付款”这个业务需求。
