状态机如下图所示。如果对象创建之后,事件e2、e1、e3、e4、e1和e5按给定顺序发生,请问,事件发生结束后,变量x、y和z值分别是_______________________。
【答案】
x=-1,y=1,z=0。
【解析】
竞赛题的绝大多数题目是我自己出的,但本题来自Martina Seidl等所著的“UML @ Classroom”。
Martina Seidl照片
这道题目覆盖了状态机图的各个知识要点。
先补充解释可能比较陌生的概念:
(1)历史状态。
历史状态(带圆圈H)记录最近一次离开一个组合状态之前所处的子状态。浅历史状态(不带*号)只记住同一层的子状态,深历史状态(带*号)可以记住更深的子状态。
历史状态有向外的迁移,表示如果历史状态空白,那么缺省迁移到该迁移的目标状态。这个地方经常有人误解,以为迁移到历史状态就等于迁移到历史状态向外迁移所指向的目标状态。想想就知道是错的,如果是这样,中间插入一个历史状态不是多此一举吗?
(2)完成迁移。
不带触发事件的迁移,在到达状态的终态时隐式触发。
再说一下执行顺序。无警戒条件或警戒条件为真,按以下顺序执行:
(1)源状态的出口活动,先子后父;
(2)迁移上的动作和消息;
(3)改变状态;
(4)目标状态的入口活动,先父后子。
一开始,状态机缺省进入A。在进入A之前,执行迁移上的动作x=2。进入A时,执行A的入口活动z=0。
e2发生,状态机离开A迁移到C。离开A时,执行A的出口活动z++,z的值变为1。然后,执行迁移上的动作z=z*2,z的值变为2。进入组合状态C时,执行C的入口活动z++;y=2。z的值变为3,y的值变为2。C的缺省子状态是C1,状态机进入C1,执行C1的入口活动z=z*2,z的值变为6。
e1发生,状态机保持在C1,执行动作x=4,x的值变为4。
e3发生,先检查迁移的警戒[z==6]。因为z当前值为6,警戒[z==6]为真。状态机离开C1,执行C1的出口活动z=3,z的值变为3。进入C2时,执行C2的入口活动y=0,y的值变为0。
e4发生,状态机离开C2,执行C2的出口活动x=-1,x的值变为-1。然后,状态机离开C,执行C的出口活动y=1,y的值变为1。浅历史状态记住离开时所处的同一层的子状态C2。然后状态机进入E,执行E的入口活动y++,y的值变为2。
e1发生,状态机返回历史状态,即C2。先父后子执行入口活动。先执行C的入口活动z++;y=2。z的值变为4,y的值变为2。然后执行C2的入口活动y=0,y的值变为0。
e5发生,状态机离开C2,执行C2的出口活动x=-1,x的值变为-1。状态机迁移到C的终止状态,触发了完成迁移。图上有完成迁移由C指向A。离开C时,执行C的出口活动y=1,y的值变为1。状态机进入A时,执行A的入口活动z=0。因此,最终x=-1,y=1,z=0。
用表格表示如下:
事件 |
状态 |
历史 |
x |
y |
z |
开始 |
A |
2 |
0 |
||
e2 |
C1 |
2 |
6 |
||
e1 |
C1 |
4 |
|||
e3 |
C2 |
0 |
3 |
||
e4 |
E |
C2 |
-1 |
2 |
|
e1 |
C2 |
0 |
4 |
||
e5 |
A |
-1 |
1 |
0 |
===广告分隔线===
|
||||||||||||||||||||
[训练介绍] 软件开发中,需求是解决“产品怎样好卖”的问题,设计是解决“降低生产成本”的问题。二者相辅相成,缺一不可。而且,不能相互取代。要迈向“低成本制造好卖的产品”的境界,并非喊喊口号就能达到,需要静下心来,学习和实践各种技能。 在这个强调“做减法”的时代,建模是正确帮助您“做减法”的绝佳工具。 本训练就是教授如何使用UML2.5相关的需求和设计技能来全程实例剖析一个系统的过程。 本训练对每个开发工作流,结合讲解、做练习巩固、应用到实际项目三种方式,展示使用UML2.5相关技能开发软件系统的全过程,解答实际应用中的疑难细节问题。 [学员要求] 有一年以上项目经验的需求或设计(编码)人员。不需要您有“UML基础”,只需要您有项目经验。欢迎学员携带自己的项目来听课,由专家在现场进行剖析。 [专家] UMLChina首席专家 潘加宇。在1999年还是一名程序员时,利用业余时间创建了UMLChina,潜心研究软件需求和设计技能。2002年开始对外提供UML需求和设计的技术指导和训练服务,到现在为止,已经上门为超过280家的软件组织提供服务,覆盖了国内各个领域的领袖企业,包括通信、企业管理、电子商务、房地产、网络游戏、地理信息、物流、数码设备、医疗设备、工业控制.....等领域。 [课程大纲] 1. 概论 以上时间分配会根据项目特点和训练进程调整。 |