在状态图和状态转换图中,“箭头”和“转换边”本质上是同一个东西的两种叫法——都是用带箭头的有向线段表示状态之间的转移。但在 UML 状态图和传统状态转换图中,它们的语义、表示能力和连接对象有显著区别。
一、核心结论
| 对比项 | 状态转换图(传统 FSM) | UML 状态图(State Machine Diagram) |
|---|---|---|
| 箭头含义 | 状态之间的转移 | 转换(Transition),可连接状态或伪状态 |
| 转换边本质 | 就是箭头本身 | 箭头是转换的可视化表示 |
| 标注内容 | 事件[条件]/动作 | 事件[守卫]/动作,可省略部分 |
| 内部转移 | 不存在 | 存在,但不画箭头,写在状态内部 |
| 连接对象 | 只能连接简单状态 | 可连接简单状态、复合状态、伪状态(初始、终止、历史、选择、分叉、汇合等) |
| 层次跨越 | 不支持 | 支持跨层次转换、本地转换、外部转换 |
| 优先级 | 无 | 内层状态优先处理事件 |
二、状态转换图中的箭头与转换边
1. 图形表示
用带箭头的有向线段连接两个状态。
箭头从源状态指向目标状态。
2. 标注格式
通常标注为:
text
事件[条件]/动作
事件:触发转移的信号或条件。
条件:守卫条件,只有为真时才允许转移。
动作:转移发生时执行的操作。
3. 语义
当源状态处于活动状态,且事件发生、条件满足时,执行动作,并进入目标状态。
转移是原子的、不可中断的。
4. 特点
只有外部转移,没有内部转移。
没有伪状态,箭头只能连接简单状态。
没有层次、并发、历史等概念。
适合描述简单的有限状态机。
三、UML 状态图中的箭头与转换边
1. 图形表示
同样用带箭头的有向线段表示转换。
但箭头可以连接:
简单状态 ↔ 简单状态
简单状态 ↔ 复合状态
复合状态 ↔ 复合状态
伪状态 ↔ 状态(如初始伪状态、历史伪状态、选择伪状态、分叉/汇合等)
2. 标注格式
完整格式:
text
事件[守卫]/动作
事件:触发器(可为空,表示完成转移)。
守卫:布尔条件。
动作:转移时执行的动作(effect)。
3. 转换的类型
| 类型 | 说明 | 是否画箭头 |
|---|---|---|
| 外部转换 | 从源状态退出,进入目标状态,执行 exit/entry 动作 | ✅ 画箭头 |
| 内部转换 | 不离开当前状态,不执行 exit/entry 动作 | ❌ 不画箭头,写在状态内部 |
| 本地转换 | 在复合状态内部转移,不退出复合状态 | ✅ 画箭头,但有特殊语义 |
| 完成转换 | 无事件,源状态完成活动后自动触发 | ✅ 画箭头,无事件标签 |
4. 语义
外部转换:源状态执行 exit 动作 → 转移动作 → 目标状态执行 entry 动作。
内部转换:只执行转移动作,不执行 exit/entry。
本地转换:在复合状态内转移,不触发复合状态的 exit/entry。
完成转换:当源状态的 do 活动完成或达到完成条件时自动触发。
5. 特点
支持层次:箭头可以跨越复合状态的边界。
支持并发:箭头可以连接并发区域。
支持历史:箭头可以指向历史伪状态,恢复上次退出时的子状态。
支持选择、分叉、汇合等伪状态。
转移有优先级:内层状态优先处理事件,未被处理才向外层冒泡。
四、箭头与转换边的具体区别
| 区别点 | 状态转换图 | UML 状态图 |
|---|---|---|
| 箭头是否等于转换边 | 是,箭头就是转换 | 箭头是转换的可视化,但转换还包括内部转换(不画箭头) |
| 连接对象 | 只能连接状态 | 可连接状态、伪状态、复合状态边界 |
| 标注内容 | 事件/条件/动作 | 事件[守卫]/动作,可省略事件(完成转移) |
| 是否支持内部转移 | 不支持 | 支持,不画箭头 |
| 是否支持完成转移 | 不支持 | 支持,无事件标签 |
| 是否支持层次跨越 | 不支持 | 支持 |
| 是否支持伪状态 | 不支持 | 支持(初始、终止、历史、选择、分叉、汇合等) |
| 优先级规则 | 无 | 内层优先 |
| 动作执行顺序 | 源状态动作→转移动作→目标状态动作 | 外部转移:exit→effect→entry;内部转移:只执行 effect |
五、示例对比
状态转换图(简单门)
text
Closed --open--> Open Open --close--> Closed Open --lock--> Locked Locked --unlock--> Closed
箭头就是转换,只连接简单状态,标注事件。
UML 状态图(带复合状态)
text
Operating ├─ Door: Closed / Open └─ Motor: Idle / Moving History: 记住上次 Door 状态
箭头可以:
从初始伪状态指向 Operating
从 Operating 指向历史伪状态
从 Door 内部状态指向 Motor 内部状态(跨并发区域)
在 Door 内部写内部转换:
entry/启动电机
六、总结
| 要点 | 状态转换图 | UML 状态图 |
|---|---|---|
| 箭头 | 就是状态转移,简单直接 | 是转换的可视化,转换类型丰富 |
| 转换边 | 等价于箭头 | 包括外部转换、本地转换,内部转换不画箭头 |
| 核心区别 | 扁平、简单、无层次 | 层次、并发、历史、伪状态、优先级 |
一句话:状态转换图中的箭头就是简单的状态转移;UML 状态图中的箭头是转换的可视化,但转换有更丰富的类型和语义,并且存在不画箭头的内部转换。两者形似而神不同,前者是 FSM 的扁平表示,后者是 Harel 状态机的层次化表示。