UML(统一建模语言)定义了 14 种图表类型,分为两大类:展示系统静态结构的结构图,以及展示系统动态行为的行为图。
在实际工作中,大多数软件团队只会经常使用其中三四种,其余的很少接触。这篇指南覆盖全部 14 种,解释每种图的用途,并对哪些真正值得学习给出实在的判断。
结构图
结构图展示系统的静态架构——组件是什么,以及它们之间的关系。
类图
展示什么: 系统中的类、它们的属性和方法,以及类之间的关系(继承、关联、组合、聚合)。
什么时候用: 设计面向对象系统时。类图是代码的蓝图——展示存在哪些对象、它们知道什么、能做什么。在写代码之前用来与团队讨论领域模型,或用来记录现有架构都很合适。
使用频率: 非常常见。如果你在用面向对象语言,类图是传达结构的标准方式。
对象图
展示什么: 特定时间点的类实例快照——系统对象状态的具体呈现。
什么时候用: 通过展示具体案例来调试或澄清复杂的类关系。类图可以很抽象,对象图让它变得具体。
使用频率: 实际工作中不常见。通常被单元测试夹具或代码评审中的示例走查所替代。
组件图
展示什么: 高层次的软件组件及其之间的接口。组件可以代表服务、库、模块或可执行文件。
什么时候用: 在类级别之上记录系统架构——展示服务或模块如何通信、暴露什么 API、依赖什么。
使用频率: 在分布式或微服务架构中较为常见。当时序图太细、方块图太粗时,通常是合适的选择。
部署图
展示什么: 物理部署情况——服务器、容器、云资源,以及哪些软件运行在哪里。
什么时候用: 基础设施规划、记录生产环境,或向 DevOps 团队交接。展示哪些服务运行在哪些节点上,以及它们如何通信。
使用频率: 在基础设施密集的项目中很常见。前端或移动端项目中较少使用。
包图
展示什么: 代码如何组织成包、模块或命名空间,以及它们之间的依赖关系。
什么时候用: 识别循环依赖、规划模块化架构,或记录大型代码库的高层组织结构。
使用频率: 不常见。大多数团队用目录结构和导入关系图代替。
复合结构图
展示什么: 类或组件的内部结构——其组成部分如何连接以及如何在内部协作。
什么时候用: 需要展示一个复杂类内部多个协作关系的运行时结构时。
使用频率: 很少见。大多数工程师从未画过。
配置文件图
展示什么: UML 本身的扩展——针对特定领域的自定义构造型、标记值和约束。
什么时候用: 为特定领域(嵌入式系统、数据库建模等)创建 UML 扩展时。
使用频率: 极少见。主要用于工具厂商和标准机构。
行为图
行为图展示系统的动态行为——如何响应事件、流程如何推进、组件如何随时间交互。
用例图
展示什么: 用户(参与者)想通过系统实现的目标,以及系统如何支持这些目标。不是流程图——没有实现细节。
什么时候用: 早期需求收集。用例图适合在高层次上与非技术利益相关方对齐"系统做什么",而不涉及"怎么做"。
使用频率: 在企业级和学术场景中常见,初创公司或敏捷产品团队较少使用,更倾向于用用户故事。
时序图
展示什么: 对象或服务如何随时间交互——它们发送什么消息、按什么顺序发送。
什么时候用: 设计或记录特定的交互流程:API 请求响应周期、认证流程、结算流程。时序图非常适合发现边缘情况——画图的过程会暴露缺失的错误路径。
使用频率: 非常常见。是工程师最实用的图表类型之一。如果你只学一种 UML 图,学这个。
通信图
展示什么: 与时序图信息相同——对象和消息交换——但以空间布局而非时间线方式呈现。
什么时候用: 当协作对象的结构比消息时序更重要时。
使用频率: 不常见。时序图几乎总是首选,因为时间顺序通常很重要。
状态机图
展示什么: 系统或对象可以处于的状态、触发状态转换的事件,以及转换过程中发生的动作。
什么时候用: 任何有实质性状态的系统:用户账号生命周期(未验证、活跃、已暂停、已注销)、订单状态(待支付、已确认、已发货、已完成)、媒体播放器(播放、暂停、停止)。状态机把隐式的状态逻辑变得显式。
使用频率: 在后端系统和嵌入式软件的复杂状态管理中很常见。
活动图
展示什么: 流程中的控制流——类似流程图,但支持并行流和泳道。
什么时候用: 记录业务流程、复杂算法,或包含并发活动的工作流。泳道变体适合展示每个动作由哪个参与者或系统负责。
使用频率: 较常见,尤其在业务流程建模中。通常作为更正式的流程图使用。
交互概述图
展示什么: 多个交互片段(时序图或通信图)如何组合在一起的高层次视图。
什么时候用: 复杂系统中多个时序图需要组合成更大的流程时。
使用频率: 少见。大多数团队选择分别引用多张时序图。
时序图(Timing Diagram)
展示什么: 一个或多个对象的状态或条件随时间的变化——状态转换的时间轴视图。
什么时候用: 实时系统、嵌入式软件,或任何时序约束重要的场景(这个事件必须在那个事件后 50ms 内完成)。
使用频率: 在 Web 开发中很少见。在嵌入式系统和硬件软件集成工作中较常见。
真正值得学的三种
如果你是软件工程师,不在重度流程驱动的环境里工作,三种 UML 图就能覆盖大多数实际场景:
时序图 — 任何需要展示组件如何为特定流程交互的场景都适用。在开发功能前画它,设计变更时更新它。
类图 — 用于记录领域模型和对象关系。在新同学熟悉代码库或设计新子系统时特别有用。
状态机图 — 任何系统有非简单状态时使用:用户账号、订单、工作流。把状态和转换显式化,能防止隐式假设引发的 bug。
其余 11 种图都有其存在的理由,但除非你在实践正式 UML 建模,或在需要它们的特定领域工作(嵌入式、企业架构),你很少会用到它们。