当系统需要在待机、运行、暂停、故障和结束这些状态之间来回切换的时候,用状态图来描述逻辑往往比普通的流程图要清晰不少;所以我们要弄清楚在Enterprise Architect里面该怎么去建立状态图,以及怎样去设置状态之间的迁移条件,这里头的关键步骤是先把所有的状态节点完整地画出来,然后才去给每一条迁移线补充好触发器、监护条件和效果,触发器主要负责说明是什么事件引起了迁移,监护条件决定了这次迁移能不能被放行,而效果则描述了迁移发生之后系统会去执行哪些动作。
一、Enterprise Architect怎么建立状态图
状态图很适合用来表达一个对象在它的生命周期里各种状态的变化过程,在Enterprise Architect当中,一个状态机可以包含多个状态、迁移和伪状态,同时还可以继续为状态补充进入、执行和退出时需要完成的动作。
1、创建StateMachine图
先到Browser窗口里面选中目标包或者元素,再点击顶部的【Design】→【Diagram】→【Add Diagram】,等到图表选择窗口弹出来以后,从中找到【StateMachine】这一项,把图表的名称填好并确认,这样状态图就可以直接放在Package的下面,也可以被安插到类或者块这类元素的内部,用来描述那个对象的生命周期。
2、添加初始状态和普通状态
接着去Diagram Toolbox里面找到【State】这个页面,把【Initial】这个初始节点拖到画布上,然后依次把要用的状态节点也拖进来,比方说待机、运行、异常和完成这些状态;如果整个流程存在一个明确的结束点,那就在末尾加上一个【Final】节点,给每一个状态起名字的时候,最好把它的业务含义写清楚,尽量别只叫State1、State2这种看不出实际作用的名称。
3、连接状态迁移线
在工具箱里选好【Transition】,从源状态的位置按住鼠标拖到目标状态上,这样画出来的这根线就代表了状态之间的逻辑移动,每条迁移线都只能有一个明确的来源节点和一个明确的目标节点,不能出现分叉或者模棱两可的路线。
二、Enterprise Architect状态图迁移条件怎么设置
当迁移线全都画出来以后,还得给它们补充上对应的条件;如果光画了箭头却不写触发方式,等到后面做评审、仿真验证或者把工作交出去的时候,就很难解释清楚状态是因为什么才发生了改变。
1、打开迁移线属性
我们可以双击那条迁移线,或者在它上面点右键选择【Properties】,进到属性窗口之后切换到【Constraints】页面,就在这里面分别填写Trigger、Guard和Effect,就算是那些发生在状态内部的迁移,用的也是同一套属性入口。
2、填写Trigger触发事件
Trigger主要用来写明状态变化的起点事件,比如收到了启动命令、计时结束、传感器报出异常、用户点击了确认按钮等等;写Trigger的时候不要简单地只写一句“条件满足”,而应该把具体的事件来源交代清楚,按照官方给出的说明,触发信号可以来自软件信号、事件、条件变化或者是时间的流逝。
3、填写Guard放行条件
Guard通常写成一段可以明确判断真假的表达式,例如speed>0、retryCount<3或者isAuthorized==true这类的形式,只有当Guard的结果为真的时候,迁移才会真正被执行,要是结果为假,那么状态就会停在原地不动,迁移被拦截下来。
4、填写Effect执行动作
Effect这部分是用来记述迁移完成之后系统应该去执行哪些动作的,比方说记录一条日志、清空某个计数器、发送一条通知消息或者关掉某个输出口;不要把Effect当成迁移的前提条件去用,一定要记住Guard负责的是判断,而Effect只管执行,别把需要满足的条件错误地填进Effect里头。
三、Enterprise Architect状态图迁移异常怎么检查
等到状态图大致画好以后,最好再用状态表格和仿真功能重新复核一次,因为画布上的线条虽然看起来已经全部连通了,可这不等于条件逻辑就一定没有漏洞。
1、检查是否缺少触发事件
如果从同一个状态朝外面发出去了好几条迁移线,那就得仔细瞧瞧每一条线上的Trigger和Guard能不能互相区分清楚;要是两条迁移线的条件完全一模一样,那在实际运行的时候,就很容易因为分支不明确而不知道该往哪里走。
2、使用StateMachine Table复核
我们可以把画好的状态图切换到StateMachine Table这种表格视图,在这个视图里面,能够按照当前状态、触发事件、目标状态、监护条件和效果动作这些维度,一条一条地去核对迁移关系;用表格的方式来做检查,比在图形里翻来翻去更容易发现遗漏或者重复定义的条件。
3、复杂分支增加Choice节点
如果存在好几项条件需要在运行当中动态地去做判断,那就可以在状态图里加入一个【Choice】节点,然后从Choice分别往不同的目标状态连出分支线,再给每一条输出迁移线填上各自独立的Guard条件;这样做比起把多层判断全挤在一条线上要清楚得多,也能减少因为条件相互重叠而导致的逻辑混乱。
总结
概括下来,在Enterprise Architect里面建立状态图,大体上可以按照“先创建出StateMachine图,再把各个状态节点逐个添加上去,接着用Transition把状态连接起来,然后分别为每条迁移线填好Trigger、Guard和Effect”这样的顺序来推进;等迁移条件都设置完以后,再回过头借助StateMachine Table去查一查有没有重复或者漏掉的地方,最后要保证每一条迁移线都能说明白到底是什么事件触发了它、满足什么条件才会放行,以及状态变化过后又会去执行哪些动作,这样整套状态图才算真正具备了容易读懂、方便交接的性质。
