📄 一句话概括
UML 不绑 OOP——实测一段7 条语句、0 个类的过程式代码,照样能画成活动图;有顺序和分支就该用它。
📝 本节和前面几节的关系
8.7~8.9 讲完业务侧,这一节再往外扩一层:连面向对象都不是前提。
一、UML 不要求你有类
UML 诞生时确实围绕 OOP,但它表示的是一般性的【结构与行为】。 一段只有函数的代码,有调用顺序、有分支、有状态——这些都能画。 所以它是【描述工具】,不是【OOP 专用语法】。
二、实测:7 条语句、0 个类
读配置 → 开日志 → 逐行解析合并 → 写报告 → 关日志。 7 条语句、6 处函数调用、0 个类。 画成活动图就是 7 个节点,判定点和并行一看就清楚。
三、这种场合用哪两张图
活动图:有流程、有判定、有并行——过程式代码几乎都能画。 状态机图:一个东西有明确的状态与事件——协议、订单、连接都适合。 用例图:只谈【谁让系统做什么】,不谈实现——和语言无关,正好用在这里。
四、选错工具的判据
信息里没有顺序,也没有状态 → 别用活动图和状态机图,用类图或表格。 信息里没有类,却硬画类图 → 画出来的东西叫【假装面向对象】。 判据只有一句:这张图要回答的那个问题,它到底有没有?
五、动手 Demo:UML的使用方法之三:表示非面向对象的信息
拿一段没有类的过程式代码,逐条列出来。 数函数调用次数,看它能不能画成活动图。
flow = ["read_config()", "open_log()", "for line in data:",
" parse(line)", " merge(result, line)",
"write_report(result)", "close_log()"]
funcs = [l.strip().split("(")[0] for l in flow if "(" in l]
print(len(flow), len(funcs), 0) # 7 6 0
实跑输出:
--------------------------------------------------------------------
UML的使用方法之三:表示非面向对象的信息
--------------------------------------------------------------------
UML 不是 OOP 专用——**一堆函数顺序调用,照样能画**。实测一段过程式代码:
过程式代码(没有类,只有函数;表格里省掉了缩进):
序号 语句
------------------------------
1 read_config()
2 open_log()
3 for line in data:
4 parse(line)
5 merge(result, line)
6 write_report(result)
7 close_log()
函数调用 6 处
类 0 个
图 7 个节点的活动图
**这段代码一个类都没有,但它有【顺序】和【分支】——活动图正好表示这个。**
**所以 8.3 的第三种用法是把 UML 当【流程描述语言】用**,与 OOP 无关。
**反过来说**:如果一份信息连顺序都没有,那两种图都用不上,**这就叫选错工具。**
实测:7 条语句、6 处函数调用、0 个类。 这段代码一个类都没有,但顺序和分支都在——活动图正好表示这些。 反过来:一份连顺序都没有的信息,活动图和状态机图都用不上。
30 秒实验
- 找一段你写的纯脚本,画成活动图,看能不能发现多余的步骤。
- 找一个【本该用类图却画成流程图】的例子,说出它漏了什么。
常见误区
- 以为 UML 只能画面向对象的程序。过程式代码照样能画。
- 以为画了图就一定更清楚。选错工具的画图只是多一道工序。
自测三问(点开对答案)
1. UML 一定要求有类吗? —— 不要求;它表示的是一般性的结构与行为,过程式代码也能画。 2. 实测那段代码有几个类? —— 0 个类、7 条语句、6 处函数调用,仍可画成 7 个节点的活动图。 3. 选错工具的判据是什么? —— 看这张图要回答的问题在信息里到底有没有——没顺序却画活动图就是选错。- ☐ 8.11 使用用例图表示交给计算机的工作
相关笔记
- UML的使用方法大致分为三种 — 三种用法总览
- 使用活动图表示工作流程 — 这一节引出的活动图
- 软件不会直接表示现实世界 — 表示对象不是现实本身
- 🧩 面向对象是怎样工作的 · 索引