📄 一句话概括
用例图只回答谁、让系统做什么——实测 2 个参与者、6 个用例、2 条包含+1 条扩展,它一个字都不说【怎么做】。
📝 本节和前面几节的关系
8.10 说 UML 能表示非 OOP 信息,这一节起逐个介绍第三类图:用例、活动、状态机。
一、用例图的两个词:参与者与用例
参与者:站在系统外面、跟系统打交道的人或其他系统,画成小人(或方块)。 用例:系统提供的、对参与者有价值的一件事,画成椭圆。 边界:一个方框圈住所有用例,框外面是人,框里面是系统。
二、实测:2 个参与者、6 个用例
读者:借书、还书、查书——3 个用例。 管理员:办证、催缴、盘点——3 个用例。 每个用例都绑了参与者,0 处说不清【谁做】。
三、包含与扩展的区别
包含(include):每次都会走的那一段,抽出来共用——借书与还书都包含【验证身份】。 扩展(extend):有条件才走的那一段——借书【扩展】出预约,只有无库存时才走。 记法:包含是必须,扩展是可选;箭头都从子指向基,虚线加构造型。
四、它不写怎么做
借书是先查库存还是先验证身份,用例图一个字都不说——那属于活动图或时序图。 所以用例图适合跟业务方对齐【做什么】,跟程序员对齐【怎么做】要换图。 最常见的滥用:把用例图画成流程图,那已经不是用例图了。
五、动手 Demo:使用用例图表示交给计算机的工作
列一个图书馆系统的参与者与用例,按参与者分组计数。 再数包含关系与扩展关系各有几条。
actors = ["读者", "管理员"]
cases = [("借书", "读者"), ("还书", "读者"), ("查书", "读者"),
("办证", "管理员"), ("催缴", "管理员"), ("盘点", "管理员")]
rel = [("借书", "验证身份", "包含"), ("还书", "算逾期", "包含"),
("借书", "预约", "扩展")]
print(len(actors), len(cases),
len([r for r in rel if r[2] == "包含"]),
len([r for r in rel if r[2] == "扩展"])) # 2 6 2 1
实跑输出:
--------------------------------------------------------------------
使用用例图表示交给计算机的工作
--------------------------------------------------------------------
用例图只回答一件事:**谁,让系统做什么。**实测一个图书馆系统:
参与者 用例数 用例
---------------------------------------
读者 3 借书/还书/查书
管理员 3 办证/催缴/盘点
参与者 2 个
用例 6 个
包含关系 2 条
扩展关系 1 条
用例里有几处【谁做】说不清 0 处(每个用例都绑了参与者)
**用例图的边界是【系统的边界】**:图外面的是人,图里面的是系统要做的事。
**它不写怎么做**——借书是先查库存还是先验证,用例图一个字都不说。
**所以它适合跟业务方对齐【做什么】,不适合跟程序员对齐【怎么做】。**
实测:2 个参与者、6 个用例、2 条包含、1 条扩展。 每个用例只有一个参与者——说不清谁用的用例,通常是【系统内部功能】而不是用例。 用例图不写顺序,借书里先做什么后做什么,它一个字都不管。
30 秒实验
- 给你的系统列出参与者和用例,检查每个用例是否都能说出【谁用】。
- 找一个被画成流程图的用例图,指出它混进了哪些不属于这里的信息。
常见误区
- 把用例图画成流程图。顺序属于活动图,用例图只管谁做什么。
- 以为用例越多越完整。用例是【有价值的一件事】,不是功能清单。
自测三问(点开对答案)
1. 用例图回答什么? —— 谁(参与者),让系统做什么(用例)——不谈实现与顺序。 2. 包含与扩展怎么分? —— 包含是每次都会走的那段(抽出来共用),扩展是有条件才走的那段。 3. 实测数字是多少? —— 2 个参与者、6 个用例、2 条包含、1 条扩展,0 处说不清谁做。- ☐ 8.12 使用活动图表示工作流程
相关笔记
- UML的使用方法之三:表示非面向对象的信息 — 第三类用法的入口
- 使用活动图表示工作流程 — 用例展开之后才用它
- 软件不会直接表示现实世界 — 边界画在哪
- 🧩 面向对象是怎样工作的 · 索引