序列图

序列图将对象之间随时间的交互可视化。它们展示了参与者之间为完成特定任务或场景而交换的消息顺序。

核心概念

参与者

参与者表示交互中涉及的对象或角色。每个参与者都有一条 生命线 ——一条向下延伸的垂直虚线,表示时间的推移。

消息

消息是参与者之间的通信,以生命线之间的水平箭头表示。时间从上到下流动。

激活框

激活框(也称为执行规约)是生命线上的细长矩形,表示参与者正在活跃处理的时段。

创建参与者

使用参与者工具

在 UML 序列图 页面上,按 P 或从工具栏的 UML 菜单中选择 参与者,然后在画布上点击以放置参与者。新参与者会与已有的参与者对齐排列。选中参与者后按 Return 可重命名它。

参与者类型

参与者可以表示不同类型的实体:

  • 参与者 - 通用对象或系统部分(矩形)
  • 角色 - 用户或外部系统(火柴人)
  • 边界 - UI 或系统边界
  • 控制 - 流程或控制器逻辑
  • 实体 - 数据或领域对象
  • 数据库 - 数据存储

在检查器的 排列 标签页 → UML 部分设置 角色类型。

创建消息

使用消息工具

按 M 激活消息工具,然后:

  1. 点击源参与者的生命线
  2. 拖动到目标参与者的生命线
  3. 释放以创建消息

消息类型

类型箭头样式说明
同步实线,实心箭头发送方等待响应
异步实线,空心箭头发送方不等待即继续
返回虚线,空心箭头对同步调用的响应
创建虚线,指向框的空心箭头创建一个新参与者
销毁以 X 结尾的线条终止一个参与者
自调用回指到同一生命线的箭头参与者调用自身

在检查器的 UML 部分设置所选消息的 消息类型。

消息标签

选中一条消息,在检查器的 UML 部分编辑它的 标签。常见格式:

  • methodName() - 简单方法调用
  • methodName(param1, param2) - 带参数的调用
  • result := methodName() - 带返回赋值的调用
  • [condition] methodName() - 条件消息(守卫)

激活框

激活框表示参与者正在执行或等待响应的时段。

添加激活框

  1. 从工具栏的 UML 菜单中选择 激活
  2. 沿参与者的生命线拖动,覆盖其处于活跃状态的时间段
  3. 激活框会被放置在该生命线上

嵌套激活

当一个参与者调用自身(递归调用)或处理多个嵌套调用时,激活框可以堆叠显示。

片段

片段将消息分组,以展示条件逻辑、循环或其他控制流。

片段类型

类型关键字用途
替代altif-else 分支
可选opt可选执行(无 else 的 if)
循环loop重复执行
中断break退出所在循环
并行par并发执行
关键critical原子/关键区段
否定neg无效交互
断言assert必需的交互
忽略ignore可被忽略的消息
考虑consider必须考虑的消息
引用ref引用另一个交互

创建片段

  1. 从工具栏的 UML 菜单中选择 片段
  2. 在你想要分组的参与者和消息上拖出一个矩形
  3. 选中该片段,在检查器的 UML 部分设置其 片段类型
  4. 根据需要输入 守卫条件

片段守卫

守卫是以方括号表示的条件:

  • [x > 0] - 数值条件
  • [user.isAdmin] - 属性检查
  • [else] - alt 片段中的默认/else 分支

重新排序元素

移动参与者

水平拖动参与者以重新排序。相连的消息会跟随移动。

移动消息

选中一条消息,按 Cmd+↑ 或 Cmd+↓ 可将其在序列中提前或推后。

最佳实践

  1. 从主流程开始 - 先为正常路径建模,再添加备选方案
  2. 保持可读性 - 每张图限制在 5-7 个参与者以内
  3. 使用有意义的名称 - 用实际方法名或描述来标注消息
  4. 展示返回消息 - 尤其是当返回值很重要的同步调用
  5. 谨慎使用片段 - 过多的嵌套片段会降低可读性
  6. 添加注释 - 使用便签来解释复杂逻辑

示例:用户登录流程

一个典型的登录序列可能包括:

  1. 用户输入凭据
  2. 客户端向服务器发送登录请求
  3. 服务器向数据库验证
  4. 数据库返回用户记录
  5. 服务器创建会话
  6. 服务器向客户端返回成功/失败结果
  7. 客户端更新 UI

此流程展示了同步调用、返回消息,以及成功/失败路径可能用到的 alt 片段。