4、需求建模基础:UML用例图、UML活动图、UML状态机图、SysML需求图
说到需求建模,我脑子里第一个蹦出来的词就是「可视化」。你想想看,光靠文字描述需求,就像让一个厨师只看菜谱不看食材——能做出菜来才怪。建模就是把那些抽象的文字,变成大家都能看懂的图形。今天咱们就聊聊四种最常用的建模手段。
4.1 UML用例图:谁在用系统做什么
用例图是我个人最常用的需求分析工具。它解决一个核心问题:谁(角色)要干什么(功能)。说白了,就是画清楚系统边界和交互关系。
核心三要素:
- 参与者(Actor):可以是人、外部系统、硬件设备。用小人图标表示。
- 用例(Use Case):系统提供的完整功能。用椭圆表示。
- 关系(Relationship):包括关联、包含、扩展、泛化。
举个例子。我在做车载信息娱乐系统时,画过一个「音乐播放」的用例图。参与者有「驾驶员」和「乘客」。用例包括「播放歌曲」「切换曲目」「创建播放列表」等。这里有个坑——用例粒度要适中。太粗了看不清细节,太细了图就变成蜘蛛网。
我的经验:一个用例图控制在5-9个用例之间。超过这个数,建议拆成多个子图。我曾经在一个项目里画了20多个用例在一张图上,结果评审时没人愿意看。
用例图里有个容易混淆的概念:包含(include)和扩展(extend)。包含是「必须做的」,扩展是「可选做的」。比如「播放歌曲」必须包含「加载音频文件」,但可以扩展「显示歌词」。嗯,这个区别很重要,搞反了会导致需求遗漏。
4.2 UML活动图:流程怎么走
活动图,说白了就是流程图。它描述的是业务逻辑或工作流。我习惯用它来梳理复杂的功能流程,特别是那些涉及多个角色、多个分支的场景。
活动图的基本元素包括:
- 起始节点:实心圆,流程开始的地方
- 活动节点:圆角矩形,表示一个动作或步骤
- 决策节点:菱形,表示条件分支
- 合并/分叉:粗横线,表示并行或同步
- 结束节点:实心圆加外圈,流程结束
我记得有一次做ADAS(高级驾驶辅助系统)的需求分析。功能是「自动紧急制动」。这个流程涉及传感器检测、决策判断、执行制动等多个步骤,而且还有各种条件分支——比如车速、障碍物距离、驾驶员是否干预。用活动图一画,整个逻辑就清晰了。
避坑指南:活动图容易画得太「理想化」。我曾经画过一个完美的活动图,结果开发说「这个分支在硬件上实现不了」。所以画图时一定要考虑技术约束,别光顾着逻辑完美。
活动图还有一个妙用:发现遗漏的需求。当你把流程一步步画出来时,那些「如果这样怎么办」的场景就会自然浮现。比如「如果传感器故障怎么办?」——嗯,这就是一个异常处理需求。
4.3 UML状态机图:对象的状态变化
状态机图,关注的是单个对象在其生命周期中的状态变化。你想想看,一个车机系统里的「蓝牙连接」功能,它有哪些状态?断开、连接中、已连接、配对中、配对失败……每个状态之间怎么跳转?这就是状态机图要解决的问题。
状态机图的核心元素:
- 状态(State):圆角矩形,表示对象的一个稳定状态
- 转移(Transition):箭头,表示状态之间的跳转
- 事件(Event):触发转移的条件
- 动作(Action):转移时执行的操作
一个实际案例:车载空调系统的「温度调节」状态机。
- 状态:关闭、制冷、制热、通风
- 事件:用户按下A/C按钮、温度旋钮转动、达到目标温度
- 动作:启动压缩机、切换风门、调节风扇转速
画完这个状态机图,开发人员就知道每个状态下系统该做什么,测试人员也知道要覆盖哪些场景。
我个人建议:状态机图不要画得太复杂。如果一个对象有超过10个状态,或者转移线交叉得像蜘蛛网,那就说明这个对象需要拆分了。我曾经接手过一个项目,一个状态机图有30多个状态,结果没人能看懂,最后重构了。
小技巧:画状态机图时,先列出所有可能的状态,再画转移。别一上来就画线,容易漏状态。我习惯用Excel先列个状态转移表,确认无误后再画图。
4.4 SysML需求图:需求的结构化表达
SysML需求图,是系统工程领域专门用来管理需求关系的图。它不像UML那三种图那么「动态」,它更关注需求本身的结构——谁派生谁、谁满足谁、谁验证谁。
需求图的核心元素:
- 需求节点:矩形,包含需求ID、文本描述
- 关系:
- 派生(derive):一个需求从另一个需求衍生出来
- 满足(satisfy):某个设计元素满足某个需求
- 验证(verify):某个测试用例验证某个需求
- 细化(refine):对需求的进一步解释
为什么需要需求图?我举个例子。你写了一份需求文档,里面有100条需求。开发说「我实现了第35条」,测试说「我验证了第35条」。但你怎么知道第35条是从哪条顶层需求来的?怎么知道它和别的需求有没有冲突?需求图就是干这个的。
实际应用场景:在做一个车载网关项目时,我们用了需求图来管理功能安全需求(ISO 26262)。顶层需求是「系统在发生单点故障时仍能安全运行」。从它派生出了「电源监控」「通信冗余」「故障诊断」等子需求。每个子需求又关联到具体的硬件模块和测试用例。这样,评审时一眼就能看出需求链是否完整。
SysML需求图有个好处:它让需求可追溯。你想想看,如果客户问「为什么这个功能要这么做?」你可以顺着需求图一路追溯到顶层需求。我曾经用这个图说服了客户放弃一个不合理的需求——因为那个需求无法追溯到任何顶层目标。
注意:需求图不是万能的。它适合管理结构化、层次化的需求,但不适合描述动态行为。动态行为还是得靠活动图或状态机图。别指望一张图解决所有问题。
4.5 四种图的对比与选择
说了这么多,你可能想问:到底什么时候用哪种图?我整理了一个对比表,方便你参考。
| 图类型 | 关注点 | 适用场景 | 输出物 |
|---|---|---|---|
| 用例图 | 系统边界、角色与功能 | 需求获取阶段,明确功能范围 | 功能列表、角色定义 |
| 活动图 | 业务流程、工作流 | 复杂流程梳理、异常路径分析 | 业务流程图、操作手册 |
| 状态机图 | 对象状态、事件驱动 | 有明确状态转换的功能(如通信协议、模式切换) | 状态表、事件列表 |
| 需求图 | 需求结构、追溯关系 | 大型项目、功能安全、合规性需求管理 | 需求追溯矩阵、影响分析报告 |
我个人习惯是:先用例图定范围,再活动图画流程,状态机图补细节,需求图管结构。当然,这不是死规矩。你完全可以根据项目特点灵活组合。
最后说一句:建模工具只是手段,不是目的。别为了画图而画图。我见过有人把活动图画得跟艺术品一样精美,但开发根本看不懂。记住,图是给团队看的,不是给自己看的。画完图后,找个人讲讲,看他能不能听懂——这是检验建模质量的最好方法。