系统分析师 · 高频练习

同一个事件发生后,状态转换是否执行由什么条件决定?

高级 单选题 第 944 题 中等 系统分析师UML状态机Guard状态转换行为建模
题目

订单处于“待发货”状态时收到 cancel 事件,只有条件 [尚未出库] 为真才允许转到“已取消”,并执行 refund()。其中 [尚未出库] 属于()。

A 守卫条件 Guard
B 触发事件 Event
C 转换动作 Effect
D 终止状态 Final State
题目类型:原创高频练习题 用途:用于帮助理解系统分析师相关考点和答案解析,不等同于官方真题。
正确答案
A
答案解析

状态机转换常写成 event [guard] / effect。cancel 是触发事件,[尚未出库] 是守卫条件,refund() 是转换执行的动作。

选项分析

A

正确。方括号中的布尔条件决定该转换当前是否可用。

B

错误。触发事件是 cancel,而不是 [尚未出库]。

C

错误。转换动作是 refund(),通常写在斜杠后。

D

错误。终止状态是状态节点,不是转换标签中的条件。

本题为什么容易错

很多人看到“条件满足后执行退款”,会把条件和动作混在一起。先看符号:方括号是 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为真,转换才可执行。