4、用例分析与场景驱动:编写用例文档,识别主成功场景与扩展场景,从用例到系统交互

好,咱们进入第四章。

前面几章我们聊了需求怎么来,怎么梳理。但说实话,光有需求列表还不够。你想想看,产品经理给你扔过来二十条需求,每条都写着「用户能下单」、「用户能退款」。然后呢?你怎么知道系统该先做什么,后做什么?

这时候,就需要用例分析登场了。

4.1 为什么非要用例不可?

我刚开始做架构那几年,也犯过傻。拿到需求直接画类图、画时序图,结果画到一半发现——哎?这个流程好像不对,用户到底是怎么操作的?

说白了,用例就是帮你把「用户想干什么」翻译成「系统该干什么」的桥梁。

我个人习惯,在写任何一行代码之前,先写用例文档。哪怕只是草稿,也能帮你避免至少一半的返工。

核心观点:用例不是需求文档,而是场景描述。它关注的是「用户与系统的交互过程」,而不是「系统有什么功能」。

4.2 用例文档长什么样?

一个标准的用例文档,通常包含这几个部分。我直接给你列出来:

要素 说明 示例(在线购物)
用例名称 动词+名词,清晰表达目标 提交订单
参与者 谁在使用系统 注册用户
前置条件 开始前必须满足的状态 用户已登录,购物车非空
后置条件 成功结束后系统的状态 订单已创建,库存已扣减
主成功场景 最理想、最常用的流程 用户点击提交→系统校验→生成订单
扩展场景 异常、分支、可选流程 库存不足、支付超时、地址无效

嗯,这里要注意。很多人写用例只写主场景,觉得扩展场景「以后再说」。我曾经就吃过这个亏——项目上线第一天,用户输入了一个特殊字符,系统直接崩了。为什么?因为用例里没写「输入校验失败」这个扩展场景。

4.3 主成功场景:先走通那条阳光大道

主成功场景,也叫「快乐路径」。就是一切顺利的情况下,用户怎么完成目标。

举个例子,我们做一个「用户注册」功能。主成功场景可能是这样的:

  1. 用户输入手机号、密码、验证码
  2. 系统校验手机号格式
  3. 系统发送短信验证码
  4. 用户输入验证码
  5. 系统校验验证码正确
  6. 系统创建用户账号
  7. 系统返回注册成功

你看,这就是一条完整的交互链路。每一步都是「用户做了什么」→「系统响应了什么」。

我的小技巧:写主场景时,尽量控制在5-10步。太长了说明粒度太粗,可以拆成多个子用例。太短了说明你漏了细节。

4.4 扩展场景:那些「万一」的情况

扩展场景才是真正体现架构功底的地方。

你想想看,一个系统健不健壮,不是看它正常跑的时候有多快,而是看它出问题的时候怎么处理。

扩展场景通常包括:

  • 异常流:比如网络断开、数据库超时、第三方服务挂了
  • 分支流:比如用户选择了不同的支付方式、不同的配送地址
  • 可选流:比如用户跳过了某个步骤、取消了操作

我建议你写扩展场景时,用「如果...那么...」的句式来思考。

比如上面那个注册的例子,扩展场景可以写:

  • 如果手机号格式错误,系统提示「请输入正确的手机号」
  • 如果验证码发送失败,系统提示「发送失败,请重试」
  • 如果验证码输入错误超过3次,系统锁定该手机号15分钟
  • 如果用户中途关闭页面,系统不做任何处理(会话超时后自动清理)

避坑指南:我曾经见过一个团队,写了30多个扩展场景,结果主场景只有5步。这其实走偏了。扩展场景不是越多越好,而是要覆盖「真正可能发生」的情况。那些概率极低、影响极小的场景,可以放到后续迭代里。

4.5 从用例到系统交互:画出来才清楚

用例文档写完了,下一步就是把它变成系统交互图。

我个人习惯用「系统时序图」或者「交互图」来呈现。说白了,就是把用例里的每一步,对应到系统的哪个模块、哪个接口。

举个例子,还是「提交订单」这个用例。主场景中的一步是「系统校验库存」。那对应的系统交互可能是:

用户点击「提交订单」
  → 前端调用 POST /api/orders
  → 订单服务调用 库存服务 checkStock(productId, quantity)
  → 库存服务返回 true/false
  → 如果 true,订单服务创建订单记录
  → 如果 false,返回「库存不足」

你看,这样一画,架构的边界就清晰了。哪个服务负责什么,接口怎么设计,一目了然。

4.6 一个完整的用例文档示例

我直接给你一个我常用的模板,你拿去就能用:

用例名称 用户取消订单
参与者 已登录用户
前置条件 订单状态为「待支付」或「待发货」
后置条件 订单状态变为「已取消」,库存恢复
主成功场景 1. 用户进入订单详情页
2. 用户点击「取消订单」
3. 系统弹出确认对话框
4. 用户确认取消
5. 系统校验订单状态
6. 系统更新订单状态为「已取消」
7. 系统调用库存服务恢复库存
8. 系统返回取消成功
扩展场景 3a. 如果订单已发货,取消按钮置灰
5a. 如果订单状态异常(如已被系统取消),提示「订单状态异常,请联系客服」
7a. 如果库存服务恢复失败,记录异常日志,人工介入处理

关键提醒:用例文档不是写完了就完事的。它需要和产品、开发、测试一起评审。我见过太多因为「我以为」而导致的返工——你以为用户会这样操作,其实用户根本不按你的套路来。

4.7 小结:用例驱动,架构不迷路

好了,这一章的内容差不多就这些。

总结一下:

  • 用例文档是需求到架构的翻译器
  • 主成功场景走通核心流程
  • 扩展场景覆盖异常和分支
  • 从用例到系统交互,画出时序图,架构边界自然就出来了

下一章,我们会聊怎么把这些用例转化成真正的系统模块划分。说白了,就是怎么从「用户故事」变成「系统结构」。到时候见。