订单处于“待发货”状态时收到 cancel 事件,只有条件 [尚未出库] 为真才允许转到“已取消”,并执行 refund()。其中 [尚未出库] 属于()。
状态机转换常写成 event [guard] / effect。cancel 是触发事件,[尚未出库] 是守卫条件,refund() 是转换执行的动作。
选项分析
正确。方括号中的布尔条件决定该转换当前是否可用。
错误。触发事件是 cancel,而不是 [尚未出库]。
错误。转换动作是 refund(),通常写在斜杠后。
错误。终止状态是状态节点,不是转换标签中的条件。
本题为什么容易错
很多人看到“条件满足后执行退款”,会把条件和动作混在一起。先看符号:方括号是 Guard,斜杠后通常是 Effect。
简短答案
同一个事件发生后,状态转换是否执行由什么条件决定,正确答案是 A(守卫条件 Guard)。状态机转换常写成 event [guard] / effect。cancel 是触发事件,[尚未出库] 是守卫条件,refund() 是转换执行的动作。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 守卫条件 Guard | 本题正确答案 | 正确。方括号中的布尔条件决定该转换当前是否可用。 | 看到题干核心场景时优先联想到它 |
| 触发事件 Event | 本题干扰项 | 错误。触发事件是 cancel,而不是 [尚未出库]。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 转换动作 Effect | 本题干扰项 | 错误。转换动作是 refund(),通常写在斜杠后。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 终止状态 Final State | 本题干扰项 | 错误。终止状态是状态节点,不是转换标签中的条件。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 触发事件 Event:错误。触发事件是 cancel,而不是 [尚未出库]。
- 转换动作 Effect:错误。转换动作是 refund(),通常写在斜杠后。
- 终止状态 Final State:错误。终止状态是状态节点,不是转换标签中的条件。
知识点详解
UML 状态机用于描述对象在生命周期中的状态及事件驱动转换。事件触发候选转换,守卫是转换执行前求值的布尔条件,动作或 Effect 在转换发生时执行。进入动作、退出动作和状态内部活动属于不同位置的行为。设计守卫时应保持含义清晰,必要时确保多个候选转换的条件互斥或定义优先规则。
备考速记
Event敲门,Guard看资格,Effect进门后执行。
UML状态机 在行为建模场景中的作用
UML状态机在本题中的核心价值,是解决“订单处于“待发货”状态时收到 cancel 事件,只有条件 [尚未出库] 为真才允许转到“已取消”,并执行 refund()。其中 [尚未出库] 属于()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 根据状态图标签识别事件、守卫和动作。
- 判断相同事件对应多条转换时守卫条件是否互斥。
UML状态机 在系统分析师软考中的考法
软考选择题通常不会只考概念定义,还会把UML状态机放到行为建模场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
把标签按顺序读一遍:cancel 来了,这是事件;先检查订单是否尚未出库,这是门槛;门槛通过以后执行退款并切换状态。方括号里的表达式就是守卫条件。即使事件已经发生,只要 Guard 为假,这条转换也不能按该路径执行。
考点定位
事件说明发生了什么,守卫说明满足什么条件才允许转移,动作说明转移时做什么。三者的位置和语义要分清。
易错提醒
- 多条转换使用重叠守卫,导致同一事件下选择不明确。
- 把业务副作用写进守卫表达式,使条件判断不再纯粹。
- 遗漏 Guard 为假时系统应该保持原状态还是走其他转换。
备考提示
- 固定用 event [guard] / effect 格式拆状态转换标签。
- 给订单、工单和审批单各写一个带守卫的状态转换。
你可能还想了解
- 状态机中的 Guard 为假会怎样?
- 转换动作和进入动作有什么区别?
- 同一事件的多个守卫条件能否重叠?
本文小结
状态机标签event [guard] / effect中,cancel是事件,[尚未出库]是守卫条件,refund()是动作。事件发生后只有Guard为真,转换才可执行。