🧩 第八章 UML:查看无形软件的工具
📄 一句话概括

一个程序拆成不动的结构和动起来的动作两半——实测 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 秒实验

  1. 给你的项目画一张只有 3 个格子的类图(类名/属性/方法)。
  2. 再挑一条最常走的调用链,画成 6 条消息以内的时序图。

常见误区

  1. 以为一张图能把结构和顺序都画完。一张图只回答一个问题。
  2. 以为类图里能看出执行顺序。类图没有时间轴。
自测三问(点开对答案) 1. 程序的两半分别是什么图? —— 结构用类图(类/属性/关系),动作用时序图或通信图(消息与顺序)。 2. 实测 7 项结构指什么? —— 3 个类+4 个属性;4 个方法属于动作侧。 3. 为什么不能一张图画完? —— 类图没有先后、时序图没有属性,混着画谁都看不清。

相关笔记