EA&UML日拱一卒-活动图::活动

上篇文章说明对象流相关的内容,但是回避了解方程的细节,这部分在留给接下来的文章来说明。今天的内容是说明活动(activity)的概念以及活动的动作机制。


语义


活 动是对行为的说明,它描述了计算过程顺序和并发的步骤。状态机和活动有相似之处,它们都描述了一段时间中出现的状态序列以及引起状态之间改变的条件。两者 的不同点在于状态机关注的是执行或者经历一次计算的单个对象的状态,而活动关注的则是计算本身的状态,它可能跨越多个对象,并且显式地对活动节点之间的控 制流和信息流建模。


活动具有输入和输出参数,分别代表了提供给活动执行所需的值以及执行活动所产生的值。活动可以作为参数化的行为(behaviour)附加到其他各种行为上。


动作(活动也一样)要求其所有的输入上都出现令牌,并且会在所有的的输出上都产生令牌。


执行规则基本上是并发的。如果两个活动节点被不同的令牌集合**,那么它们可以并发执行。这意味着节点之间没有内在的执行顺序。


----UML参考手册(第二版)


示例


上面的内容来自UML参考手册,理解中文本身没有问题,但是和实际结合起来就没有那么容易了。我们以前一篇文章中那个解一元二次方程流程为例进行说明。这部分就来就是原创了。先上图。

EA&UML日拱一卒-活动图::活动

EA&UML日拱一卒-活动图::活动


中间的圆角方框SolveEquation中的内容就是活动。该活动是对解一元二次方程的说明,它描述了计算过程顺序和并发的步骤。


SolveEquation活动具有3个输入参数(系数a,b,c)和1个输出输出参数solution,分别代表了提供给活动执行所需的值以及执行活动所产生的值。


SolveEquation的执行是并发的。如果两个活动节点被不同的令牌集合**,那么它们可以并发执行。这节点之间没有内在的执行顺序。


当InputA动作(这里假设得到的a!=0)完成以后,执行令牌转移到InputB的同时,SolveEquation的输入a也得到执行令牌,SolveEquation内部使用a变量的节点的输入pin也同时得到令牌。


这里也包含判断a是否为0的判断节点。判断节点只有一个输入,已经具备了执行条件,因为a不等于0,所以计算delta值的动作的a管脚的得到令牌。


参见下图中红线部分。这一切可以认为是和InputB并发执行的。

EA&UML日拱一卒-活动图::活动

EA&UML日拱一卒-活动图::活动


在a!=0这个分支中一共有四个处理,下面3个处理需要等待delta的计算结果。而计算delta的处理需要等待b, c两个输入管脚上的令牌。


InputB处理结束以后,InputC处理的同时,b管脚得到令牌,同时分发给SolveEquation处理内部各个Action的b管脚。参见下图中蓝线部分。

EA&UML日拱一卒-活动图::活动

EA&UML日拱一卒-活动图::活动


这时计算delta的处理还差c管脚上的令牌没有到达,所有处理继续等待。


InputC处理结束后,c管脚得到令牌,分发给所有粉色线相连的管脚。终于可以计算delta值了。


delta值计算完成以后,根据判断结果,执行令牌被传送到适当的处理。该处理结束后,在输出管脚生成计算结果并随着令牌转移给SoloveEquation活动的输出管脚上。

EA&UML日拱一卒-活动图::活动

EA&UML日拱一卒-活动图::活动


接下来计算结果伴随着令牌转移到表示结果的ShowSolution处理后,整个流程结束。


你理解了么?


以上就是今天的文章,如果它能给您带来些许收获,欢迎点赞并推荐给您的朋友!

阅读更多更新文章,请扫描下面二维码,关注公众号【面向对象思考】!

EA&UML日拱一卒-活动图::活动