EA&UML日拱一卒-状态图::内部迁移
在为昨天的文章写说明的时候,发现状态图中有错误,所以今天的文章就从纠错开始。需求不变。
背景
还是先回到交通信号系统的例子,编程也好,设计也好,都讲究一个对称,交通信号系统有启动过程,同样也应该有停止过程。需求大致如下:
-
操作者通过操作停止按钮关闭系统
-
如果系统处于准备状态(双方向红灯),则直接关闭。
-
如果某个方向处于通行状态(绿灯),则切换成安全停止状态(黄灯),安全停止时间经过以后,系统关闭。
-
如果正处于安全停止状态(黄灯),安全停止时间(不需要重新开始计时)经过以后,系统关闭。
-
任何一种情况,断电之前系统必须处于双方向红灯状态。
加入了停止过程之后,交通信号系统的状态图变成下面这个样子。为了说明方便,状态图中的相关要素进行了着色处理。
追加处理说明
操作者通过操作停止按钮关闭系统
从状态图的角度来看,就是系统收到了一个ShutDownSwitchPressed事件。
如果系统处于准备状态(双方向红灯),则直接关闭。
因为双方向信号已经都是红灯,所以系统可以直接停止。从状态图来说就是Idle状态中如果发生ShutDownSwitchPressed事件,直接迁移到完了状态。参见图中的红色迁移。
如果某个方向处于通行状态(绿灯),则切换成安全停止状态(黄灯),安全停止时间经过以后,系统关闭。
如 果系统处于Road1Go状态时发生了ShutDownSwitchPressed事件,那么不等Road1GoTimeout发生,系统就会从 Road1Go状态迁移到Road1StopSafely状态(蓝色迁移线)。与此同时,作为ShutDownSwitchPressed迁移的效应行 为,ShutingDown标志被设为true(蓝框内处理)。
Road1StopSafely状态的处理正常进行,等 Road1StopSafelyTimeout事件发生以后系统离开Road1StopSafely(粉色迁移),遇到choice伪状态,对 ShutingDown的状态进行判断,如果结果为true,则迁移到完了状态(绿色迁移)。
如果正处于安全停止状态(黄灯),安全停止时间(不需要重新开始计时)经过以后,系统关闭。
如果这时发生了,ShutDownSwitchPressed事件,则系统发生一次内部迁移,状态的进入行为和退出行为都不会被执行,只是执行内部迁移的效应行为,ShutingDown标志被设为true(粉色框内处理)。
Road1StopSafely 状态的处理正常进行,等Road1StopSafelyTimeout事件发生以后系统离开Road1StopSafely(粉色迁移),遇到 choice伪状态,对ShutingDown的状态进行判断,如果结果为true,则迁移到完了状态(绿色迁移)。
任何一种情况,断电之前系统必须处于双方向红灯状态。
Road1StopSafely状态的退出行为将Road1方向的信号设定为红色,可以保证两个方向的信号均为红色。
参考资料:
14.2 Behavior StateMachines (8)--内部迁移
14.2 Behavior StateMachines (10) --记法
打开方法如下:
-
进入【面向对象思考】 公众号
-
打开【UML】-【UML2.5中文译文】菜单
-
选择【状态图】分类
-
选择相关文章
相关推荐
- EA&UML日拱一卒--序列图(Sequence Diagram)::并行和临界区
- EA&UML日拱一卒--序列图(Sequence Diagram)::迭代表达式
- EA&UML日拱一卒--序列图(Sequence Diagram)::时间约束
- EA&UML日拱一卒-0基础学习微信小程序(16)-使用移动平均消除抖动
- EA&UML日拱一卒-0基础学习微信小程序(17)-学到什么程度算行?
- EA&UML日拱一卒-0基础学习微信小程序(3)- 创建自己的小程序账号
- EA&UML日拱一卒-0基础学习微信小程序(7)-WXSS和CSS
- EA&UML日拱一卒-0基础学习微信小程序(15)-弄得像真的一样
- EA&UML日拱一卒--序列图(Sequence Diagram)::消息签名
- EA&UML日拱一卒--序列图(Sequence Diagram)::生命周期
- 在windows平台下安装scrapy的完整步骤。小白看了都会装
- 【工具】Netcat(2)反弹shell