序列图
序列图将对象之间随时间的交互可视化。它们展示了参与者之间为完成特定任务或场景而交换的消息顺序。
核心概念
参与者
参与者表示交互中涉及的对象或角色。每个参与者都有一条 生命线 ——一条向下延伸的垂直虚线,表示时间的推移。
消息
消息是参与者之间的通信,以生命线之间的水平箭头表示。时间从上到下流动。
激活框
激活框(也称为执行规约)是生命线上的细长矩形,表示参与者正在活跃处理的时段。
创建参与者
使用参与者工具
在 UML 序列图 页面上,按 P 或从工具栏的 UML 菜单中选择 参与者,然后在画布上点击以放置参与者。新参与者会与已有的参与者对齐排列。选中参与者后按 Return 可重命名它。
参与者类型
参与者可以表示不同类型的实体:
- 参与者 - 通用对象或系统部分(矩形)
- 角色 - 用户或外部系统(火柴人)
- 边界 - UI 或系统边界
- 控制 - 流程或控制器逻辑
- 实体 - 数据或领域对象
- 数据库 - 数据存储
在检查器的 排列 标签页 → UML 部分设置 角色类型。
创建消息
使用消息工具
按 M 激活消息工具,然后:
- 点击源参与者的生命线
- 拖动到目标参与者的生命线
- 释放以创建消息
消息类型
| 类型 | 箭头样式 | 说明 |
|---|---|---|
| 同步 | 实线,实心箭头 | 发送方等待响应 |
| 异步 | 实线,空心箭头 | 发送方不等待即继续 |
| 返回 | 虚线,空心箭头 | 对同步调用的响应 |
| 创建 | 虚线,指向框的空心箭头 | 创建一个新参与者 |
| 销毁 | 以 X 结尾的线条 | 终止一个参与者 |
| 自调用 | 回指到同一生命线的箭头 | 参与者调用自身 |
在检查器的 UML 部分设置所选消息的 消息类型。
消息标签
选中一条消息,在检查器的 UML 部分编辑它的 标签。常见格式:
methodName()- 简单方法调用methodName(param1, param2)- 带参数的调用result := methodName()- 带返回赋值的调用[condition] methodName()- 条件消息(守卫)
激活框
激活框表示参与者正在执行或等待响应的时段。
添加激活框
- 从工具栏的 UML 菜单中选择 激活
- 沿参与者的生命线拖动,覆盖其处于活跃状态的时间段
- 激活框会被放置在该生命线上
嵌套激活
当一个参与者调用自身(递归调用)或处理多个嵌套调用时,激活框可以堆叠显示。
片段
片段将消息分组,以展示条件逻辑、循环或其他控制流。
片段类型
| 类型 | 关键字 | 用途 |
|---|---|---|
| 替代 | alt | if-else 分支 |
| 可选 | opt | 可选执行(无 else 的 if) |
| 循环 | loop | 重复执行 |
| 中断 | break | 退出所在循环 |
| 并行 | par | 并发执行 |
| 关键 | critical | 原子/关键区段 |
| 否定 | neg | 无效交互 |
| 断言 | assert | 必需的交互 |
| 忽略 | ignore | 可被忽略的消息 |
| 考虑 | consider | 必须考虑的消息 |
| 引用 | ref | 引用另一个交互 |
创建片段
- 从工具栏的 UML 菜单中选择 片段
- 在你想要分组的参与者和消息上拖出一个矩形
- 选中该片段,在检查器的 UML 部分设置其 片段类型
- 根据需要输入 守卫条件
片段守卫
守卫是以方括号表示的条件:
[x > 0]- 数值条件[user.isAdmin]- 属性检查[else]- alt 片段中的默认/else 分支
重新排序元素
移动参与者
水平拖动参与者以重新排序。相连的消息会跟随移动。
移动消息
选中一条消息,按 Cmd+↑ 或 Cmd+↓ 可将其在序列中提前或推后。
最佳实践
- 从主流程开始 - 先为正常路径建模,再添加备选方案
- 保持可读性 - 每张图限制在 5-7 个参与者以内
- 使用有意义的名称 - 用实际方法名或描述来标注消息
- 展示返回消息 - 尤其是当返回值很重要的同步调用
- 谨慎使用片段 - 过多的嵌套片段会降低可读性
- 添加注释 - 使用便签来解释复杂逻辑
示例:用户登录流程
一个典型的登录序列可能包括:
- 用户输入凭据
- 客户端向服务器发送登录请求
- 服务器向数据库验证
- 数据库返回用户记录
- 服务器创建会话
- 服务器向客户端返回成功/失败结果
- 客户端更新 UI
此流程展示了同步调用、返回消息,以及成功/失败路径可能用到的 alt 片段。