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

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 秒实验

  1. 找一段你写的纯脚本,画成活动图,看能不能发现多余的步骤。
  2. 找一个【本该用类图却画成流程图】的例子,说出它漏了什么。

常见误区

  1. 以为 UML 只能画面向对象的程序。过程式代码照样能画。
  2. 以为画了图就一定更清楚。选错工具的画图只是多一道工序。
自测三问(点开对答案) 1. UML 一定要求有类吗? —— 不要求;它表示的是一般性的结构与行为,过程式代码也能画。 2. 实测那段代码有几个类? —— 0 个类、7 条语句、6 处函数调用,仍可画成 7 个节点的活动图。 3. 选错工具的判据是什么? —— 看这张图要回答的问题在信息里到底有没有——没顺序却画活动图就是选错。

相关笔记