📄 一句话概括
一个程序拆成不动的结构和动起来的动作两半——实测 3 个类 4 个属性 4 个方法,结构用类图、动作用时序图,一张图只回答一个问题。
📝 本节和前面几节的关系
8.3 列了三种用法,这一节开始展开第一种:看代码的那些图。
一、程序可以拆成两半
结构:有哪些类、每个类有什么属性、类之间什么关系——不随时间变。 动作:谁调用了谁、按什么顺序、传了什么——只在运行时存在。 两半要用不同的图画,用错图就等于用体温计量血压。
二、实测:3 类 4 属性 4 方法
一段最小的借书程序:Reader、Book、Loan 三个类。
属性 4 个:name、title、on_shelf、days。
方法 4 个:borrow、lend、make、back。
结构项合计 7 项(3 类+4 属性),全部进类图。
三、一张图只回答一个问题
类图里没有【先后】:borrow 写在 Reader 的格子里,但看不出它第几步被调用。
时序图里没有【属性】:你能看到 borrow 被调用,但看不到 Reader 有几个字段。
想在一张图里既看结构又看顺序,结果就是谁都看不清——这是 UML 最容易被违背的规矩。
四、用法一的图怎么配
先画类图:把结构定下来,顺便检查有没有多余或缺失的类。 再画时序图:挑一条主线(比如借书)把消息排开。 最后按需要折算成通信图:想强调耦合圈就画它,两者可以互推。
五、动手 Demo:UML的使用方法之一:表示程序结构和动作
把一段小程序的类、属性、方法逐项抽出来。 看每一项该进哪张图。
code = [
"class Reader:", " name: str", " def borrow(self, b): ...",
"class Book:", " title: str", " on_shelf: bool", " def lend(self): ...",
"class Loan:", " days: int", " def make(self, r, b): ...", " def back(self): ...",
]
classes = [l[6:-1] for l in code if l.startswith("class ")]
attrs = [l.strip().split(":")[0] for l in code
if l.startswith(" ") and ":" in l and "def" not in l]
meths = [l.strip().split("(")[0][4:] for l in code if l.strip().startswith("def ")]
print(len(classes), len(attrs), len(meths)) # 3 4 4
实跑输出:
--------------------------------------------------------------------
UML的使用方法之一:表示程序结构和动作
--------------------------------------------------------------------
一个 OOP 程序可以拆成两半来画:**不动的结构**和**动起来的动作**。实测:
类别 条目 用什么图
--------------------------------------------------
结构 Reader/Book/Loan 类图
结构 name/title/on_shelf/days 类图
动作 borrow/lend/make/back 时序图
动作 调用顺序(借书 4 步) 通信图
类 3 个
属性 4 个
方法 4 个
结构项合计 7 项
**结构和动作要分开画**:类图里没有【先后】,时序图里没有【属性】。
**一张图只回答一个问题**——这是 UML 最容易被违背的规矩。
**想在一张图里既看结构又看顺序,结果就是谁都看不清。**
实测:3 个类、4 个属性、4 个方法;结构项 7 项全部进类图,4 个方法进时序图。 属性与方法的数目通常不成比例——属性是【记什么】,方法是【能做什么】。 先画结构再画动作:结构不定,动作图会白画。
30 秒实验
- 给你的项目画一张只有 3 个格子的类图(类名/属性/方法)。
- 再挑一条最常走的调用链,画成 6 条消息以内的时序图。
常见误区
- 以为一张图能把结构和顺序都画完。一张图只回答一个问题。
- 以为类图里能看出执行顺序。类图没有时间轴。
自测三问(点开对答案)
1. 程序的两半分别是什么图? —— 结构用类图(类/属性/关系),动作用时序图或通信图(消息与顺序)。 2. 实测 7 项结构指什么? —— 3 个类+4 个属性;4 个方法属于动作侧。 3. 为什么不能一张图画完? —— 类图没有先后、时序图没有属性,混着画谁都看不清。- ☐ 8.5 类图表示OOP程序的结构
相关笔记
- UML的使用方法大致分为三种 — 用法总览
- 三大要素之一:具有三种功能的类 — 类图要画的那三件事
- 类图表示OOP程序的结构 — 类图细讲
- 🧩 面向对象是怎样工作的 · 索引