UML跨多层级本地/外部转换的执行规则与合法性咨询
UML本地/外部转换工作机制详解
核心定义区分
首先明确:本地转换是同一复合状态内部子状态之间的切换,外部转换是跨复合状态、或者到完全独立状态的切换——这是两者所有行为差异的根源。
Entry/Exit动作执行规则
本地转换场景
- 只会执行源子状态的exit动作,不会触发父复合状态的exit或entry(因为整个复合状态的上下文还在,只是内部子状态切换)
- 目标子状态的entry动作一定会执行,哪怕之前进入过这个子状态(从兄弟状态切回来也算重新进入)
外部转换场景
- 源端:从最内层的源子状态开始,依次向外执行所有父状态的exit动作(直到最顶层的状态)
- 目标端:从最顶层的父状态开始,依次向内执行所有子状态的entry动作(直到目标子状态本身)
转换关联动作的执行顺序
不管是本地还是外部转换,执行流程都是固定的,按这个顺序来:
- 先处理源端的exit动作(按层级顺序,本地仅源子状态,外部包含所有父状态)
- 执行转换自身绑定的动作(Action)
- 最后处理目标端的entry动作(按层级顺序,本地仅目标子状态,外部包含所有父状态)
举个实际例子:
假设我们有复合状态OrderProcessing,包含子状态Validating和Charging,还有一个独立状态Completed:
- 本地转换
Validating → Charging:先跑Validating.exit,再执行转换动作(比如logValidationPassed),最后跑Charging.entry - 外部转换
Charging → Completed:先跑Charging.exit,再跑OrderProcessing.exit,接着执行转换动作(比如sendReceipt),最后跑Completed.entry
合法性说明
这类转换是UML状态机规范完全认可的合法特性:
- 本地转换适合在复用父状态上下文的场景下切换子状态,避免重复执行父状态的初始化/清理逻辑
- 外部转换适合彻底切换状态上下文的场景,比如流程结束、跳转至完全不同的业务分支
内容的提问来源于stack exchange,提问作者Yamahari
相关产品推荐
相关产品推荐

