UML中状态机图概念
Posted 系斯模科技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UML中状态机图概念相关的知识,希望对你有一定的参考价值。
从状态机的角度来思考一开始有点令人惊讶,所以让我们快速浏览一下这些概念。
状态机、状态、转换、事件
状态机是描述系统行为的具体模型。它由有限数量的状态和转换组成。
简单状态没有子状态。它可以有数据、进入和退出行为以及延迟事件。可以为状态(或状态机)提供进入和退出行为(也称为动作),无论何时进入或离开状态,都会执行这些行为。
一个状态也可以有内部转换,导致没有进入或退出行为被调用。状态可以将事件标记为延迟。这意味着如果此状态处于活动状态,则无法处理该事件,但必须保留它。下次不推迟此事件的状态处于活动状态时,将处理该事件,就像它刚刚被触发一样。
转换是由事件触发的活动状态之间的切换。动作和守卫条件可以附加到转换。动作在转换触发时执行,守卫是首先执行的布尔运算,它可以通过返回 false 来防止转换触发。
初始状态标志着状态机的第一个活动状态。它没有真实的存在,也没有源自它的转换。
子机,正交区域,伪状态
复合状态是包含一个区域或分解为两个或多个区域的状态。复合状态包含自己的一组状态和区域。
子机是作为状态插入另一个状态机的状态机。同一个子机可以插入多次。
正交区域是复合状态或子机的一部分,每个区域都有自己的一组相互排斥的状态和转换。
UML 还定义了许多伪状态,它们被认为是要建模的重要概念,但还不足以使它们成为一等元素。终止伪状态终止状态机的执行。
退出点伪状态退出复合状态或子机状态并强制终止所有包含区域中的执行。
入口点伪状态允许在复合内部进行一种受控的入口。准确地说,它将复合外部的转换连接到复合状态内部的转换。重要的一点是,这种机制只允许进入单个区域。在下图中,在 region1 中,初始状态将变为活动状态。
还有另外两种方法可以进入 submachine。显式进入意味着内部状态是转换的目标。与直接进入不同,不进行临时封装,只执行一次转换。显式退出是从内部状态到子机外部状态的转换。不建议使用显式进入或退出。
最后一个进入的可能性是使用 fork。分叉是进入一个或多个区域的显式入口。使用它们的初始状态再次激活其他区域。
历史伪状态
UML 定义了两种历史,浅历史和深历史。浅历史是一种伪状态,表示子机器的最新子状态。一台子机器最多只能有一个浅层历史。以历史伪状态为目标的转换等效于以最近的子状态为目标的转换。非常重要的是,只有一种转变可能源于历史。深层历史是递归地重新激活最近子状态的子状态的浅历史。它被表示为带有星星的浅层历史(圆圈内的 H*)。
历史伪状态并不是一个完全令人满意的概念。首先,可以只有一个历史伪状态,并且只有一个转换可能源自它。因此它们不能与正交区域很好地混合,因为只能“记住”一个区域。深历史更糟,看起来像是最后一分钟的补充。历史必须由转换激活,并且只有一个转换源自它,那么如何对源自深历史伪状态并指向该子状态的最新子状态的转换进行建模?它也是不灵活的,不接受新的历史类型。让我们面对现实吧,历史伪状态听起来很棒并且在理论上很有用,但是 UML 版本并不完全符合要求。
完成转换/匿名转换Completion transitions / anonymous transitions
完成事件(或转换),也称为匿名转换,被定义为没有定义事件触发它们的转换。这意味着当作为匿名转换源的状态变为活动状态时,只要守卫允许,此类转换将立即触发。它们在建模算法中很有用,就像活动图通常那样。在实时世界中,它们的优势在于可以更轻松地估计定期执行的操作将持续多长时间。例如,考虑下图。
设计师现在随时知道他将需要最多 4 个转换。能够估计转换需要多长时间,他可以估计需要多少时间框架(实时任务通常定期执行)。如果他还可以估计动作的持续时间,他甚至可以使用图算法来更好地估计他的时序要求。
内部转换
内部转换是在活动状态范围内执行的转换,可以是简单状态或子机状态。 人们可以将它们视为此状态的自转换,无需调用进入或退出操作。
相互矛盾的转换
如果对于给定的事件,启用了多个转换,则称它们存在冲突。有两种冲突:
对于给定的源状态,定义了多个转换,由同一事件触发。通常,每个转换中的守卫条件定义了哪个被触发。
源状态是子机状态或简单状态,冲突发生在该状态内部的转换与由同一事件触发并以另一个状态为目标的转换之间。
第一种是简单的;只需在转换表中定义两行或多行,使用相同的源和触发器,使用不同的守卫条件。但是,请注意,UML标准希望这些条件不重叠。如果他们这样做了,标准只会说这是不正确的,所以实现者可以自由地以他认为合适的方式实现它。
在第二种情况下,UML定义首先选择最内部的转换,这是有意义的,否则就不可能有出口点伪状态(内部转换将我们带到出口点,从那里包含状态机可以接管)。
以上是关于UML中状态机图概念的主要内容,如果未能解决你的问题,请参考以下文章