UML2.0中添加了时序片段来表示循环、分支和其他符号,使更好的管理顺序图「时序图/序列图」。

顺序图(sequence diagram 序列图、时序图)是一种交互图,强调对象之间消息发送的顺序,同时显示对象之间的交互。

表1 时序片段类型简要描述

类型描述alt「条件分支」只执行结果为true的可选片段(if/else 或 switch)assert注意:如果守卫条件为true,那么片段中的操作就是有效的break退出一个循环的片段(基于某些守卫条件的结果)consider提供某个时序片段中有效的消息列表ignore提供某个时序片段中无效的消息列表loop「循环」执行多次,根据守卫条件来判断是否需要重复执行neg永远不执行opt「可选分支」只有当关联条件为true时才执行,与alt相比,只有一个可选片段。par并行执行多个片段ref表示调用另一个时序图region(也被称为critical)定义一个关键区域,其中只有一个线程可以执行seq表示操作(在多任务环境中)必须以指定的顺序发生strict比seq更为严格的类型

1、alt片段

对于更复杂的逻辑,可以使用alt时序片段,作用类似if/else 或 switch/case。要创建alt时序片段,需要组合几个矩形,每个矩形都有自己的守卫条件和一个可选的else,从而形成一个多路决策。

图1 alt时序片段示例

2、assert片段

assert时序片段会告诉系统实现者,只有当守卫条件为true,那么片段中的操作就是有效的。在assert片段末尾,通常会提供某种bool条件表达式(守卫条件),一旦时序执行完成,该有条件表达式必须为true。如果不为true,那么设计不能保证正确的结果。

图2 assert时序片段示例

3、break片段

break时序片段由一个带有break文字的五边形,以及一个守卫条件组成。如果守卫条件为true,那系统将执行break时序片段内的消息,此后,控制将立即退出其所在的时序片段。

图3 break时序片段示例

4、consider片段

consider时序片段列出了序列图中某个部分的全部有效消息,所有其他消息或操作符都是非法的。consider要么作为操作符与某个时序片段一起使用,要么自己作为时序片段。

图4 consider时序片段示例

5、ignore片段

ignore时序片段列出了序列图中某个部分的全部无效消息,所有其他消息或操作符都是合法的。ignore要么作为操作符与某个时序片段一起使用,要么自己作为时序片段。

图5 ignore时序片段示例

6、loop片段

图6.1 loop「无限循环」时序片段示例

图6.2 loop「无限循环」时序片段示例

7、neg片段

可以使用一个neg时序片段来封装一个不属于最终设计的时序,即,使用neg注释掉一个时序。「这样做有两个好处:代码生成和考虑未来的功能」

图7 neg时序片段示例

8、opt片段

opt片段允许使用一个守卫条件来控制一组消息的执行,尤其是当组成守卫条件的值可以在时序执行过程中被改变时。

opt时序片段就像一个没有else子句的简单if语句,可以添加一个守卫条件,只有当守卫条件的结果为true时,系统才会执行opt片段中所包含的消息。

图8 opt片段

9、par片段

图 9 par时序片段示例

「这些时序(操作)可以互相并行执行」

10、ref片段

一个ref时序片段有两个组成部分:UML交互事件和引用本身。交互事件是一个独立的时序图,对应于代码中的子程序(过程或者函数)。引用本身:如何在一个不同的书序图中引用交互事件,引用交互事件对应于代码中对某个子程序(过程或者函数)的调用。

图10 ref时序片段示例

11、region片段

UML活动图不支持临界区,但是时序图支持。

region时序片段指定,一旦操作执行进入该区域,同一个并行执行上下文中的其他操作都不能交叉执行,直到操作执行完成。region片段必须重视与其他的并行时序片段一同出现(通常是par或seq时序片段)

图11 region时序片段

「系统根据par时序片段给出规则,可自由交叉执行任何操作的消息,但是一旦系统进入临界区(执行msg4a操作),par时序片段中的其他线程就不能执行」

12、seq片段

par时序片段会强制按照以下限制来执行

系统会维护运算对象中的操作顺序

系统允许以任何顺序,执行不同运算对象的不同生命线上的操作。

而seq时序片段增加了一个限制:

在同一条生命线上,不同运算对象的操作必须按照图中显示的顺序来执行(从上到下)

图 12 seq时序片段示例

「Operand1和Operand3的消息都被发送到同一个对象(生命线)上,因此,在一个seq时序片段中,msg2a、msg2b和msg2c都必须在msg4a之前执行」

13、strict片段

strict时序片段会强制各个操作按照它们在每个运算对象中出现的顺序来执行,即不允许在运算对象之间交叉执行操作,类似于par和seq时序片段。

strict并行操作允许运算对象以任何顺序执行,但是一旦指定的运算对象开始执行,它内部的所有操作就必须按照指定的顺序完成,然后其他运算的对象才能开始执行。

图13 strict 时序片段实例