4. 需求分析与建模:用例图与活动图在嵌入式系统中的应用

说到需求分析,很多嵌入式工程师第一反应是「写文档太虚了,不如直接开干」。我以前也这么想,直到有一次项目做到一半,客户突然说「我要的不是这个功能」——嗯,那感觉,真叫一个酸爽。

其实需求分析不是让你当作家,而是让你把脑子里的想法画出来。画出来,大家才能对齐。今天我就聊聊两个最实用的工具:用例图和活动图。

4.1 为什么嵌入式系统需要用例图?

用例图(Use Case Diagram)说白了就是回答三个问题:

  • 谁在用这个系统?
  • 他要干什么?
  • 系统给他什么结果?

在嵌入式领域,这个「谁」不一定是人。可能是另一个MCU、一个传感器、一个云平台。我习惯把外部交互者统称为「Actor」——参与者。

核心原则:用例图只关注「做什么」,不关注「怎么做」。别在用例图里画流程图,那是活动图的事。

4.2 用例图的核心元素

元素 符号 嵌入式示例
参与者(Actor) 小人图标 用户、传感器、上位机、云服务器
用例(Use Case) 椭圆 读取温度、发送报警、校准零点
系统边界 矩形框 智能温控器系统
关系 连线 + 箭头 包含(include)、扩展(extend)、泛化

我的习惯:画用例图时,先把所有参与者列出来,再给每个参与者列他关心的功能。别贪多,一张图控制在8-12个用例以内,多了就拆子系统。

4.3 实战案例:智能灌溉控制器

假设我们要做一个智能灌溉系统。我带着团队做需求分析时,第一版用例图是这样的:

智能灌溉控制器 - 用例图 智能灌溉控制器系统 农户 土壤湿度传感器 云平台 设置灌溉计划 手动灌溉 读取土壤湿度 自动灌溉决策 发送报警 上传数据 校准传感器 «include» 说明:农户可设置计划、手动灌溉、查看报警;传感器提供湿度数据;云平台接收上传数据

避坑指南:我曾经在一个项目里把「读取温度」和「计算平均值」画成两个用例,结果评审时被怼了——用例是给用户看的,不是给程序员看的。用户只关心「读取温度」,至于怎么算平均值,那是设计阶段的事。

4.4 活动图:把用例展开成流程

用例图画完了,大家知道「要做什么」了。但具体怎么做?这时候活动图(Activity Diagram)就派上用场了。

活动图本质上就是流程图,但它比普通流程图多了几个好东西:

  • 泳道(Swimlane):谁负责哪一步,一目了然
  • 并发分叉(Fork):多个任务同时跑
  • 事件流:带触发条件的动作

我习惯把活动图用在两个地方:一是描述一个用例的内部流程,二是描述多个Actor之间的交互流程。

4.5 实战:自动灌溉决策的活动图

拿刚才的「自动灌溉决策」用例来说,我们把它展开成活动图:

自动灌溉决策 - 活动图 土壤湿度传感器 灌溉控制器 电磁阀/水泵 定时触发采集 发送采集指令 读取土壤湿度 判断湿度阈值 记录采集日志 湿度 < 阈值? 开启电磁阀 灌溉进行中 保持关闭状态 说明:传感器采集与日志记录可并发执行;只有湿度低于阈值时才触发灌溉动作

我的经验:活动图里的并发分叉特别适合嵌入式系统。比如这个例子,采集数据和写日志可以同时做,不用等一个完了再做另一个。我在做低功耗设备时,经常用并发分叉来优化任务调度——能并行就别串行,省时间就是省电。

4.6 用例图 vs 活动图:什么时候用哪个?

维度 用例图 活动图
关注点 系统功能边界 业务流程细节
使用阶段 需求分析初期 需求细化阶段
读者 客户、产品经理 开发、测试人员
粒度 粗粒度 细粒度
嵌入式典型场景 定义系统与外部的交互 描述中断处理、状态机流转

4.7 嵌入式需求建模的常见坑

做了这么多年项目,我踩过不少坑。挑几个典型的说说:

  • 坑一:用例图里画了太多技术细节。 比如把「I2C通信」「SPI配置」画成用例。记住,用例是给业务看的,不是给驱动工程师看的。
  • 坑二:活动图没有泳道。 没有泳道的活动图,你根本分不清哪个动作是谁干的。嵌入式系统里Actor多(MCU、传感器、上位机),泳道是刚需。
  • 坑三:忽略了异常流程。 我曾经画了一个完美的灌溉流程,结果没考虑传感器断线的情况。现场跑起来,传感器一掉线,系统直接死循环。从那以后,我每个活动图都加一个「异常分支」。

避坑指南:画活动图时,一定要把「超时处理」「通信失败」「数据异常」这些分支画出来。嵌入式系统不像App,崩溃了可以重启——设备在现场,重启可能意味着停产。

4.8 小结:两张图,一个框架

用例图和活动图,一个管「做什么」,一个管「怎么做」。两者配合,基本能把嵌入式系统的需求说清楚。

我个人习惯的做法是:先画用例图,和客户确认功能边界;再针对核心用例画活动图,和团队对齐实现流程。两张图加起来,需求文档的骨架就有了。