本文主要是介绍第七章:Sysml之序列图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
序列图
1 序列图介绍
2 序列图外框
3 生命线
4 消息
4.1 消息的介绍
4.2 消息事件
4.3 消息类型
1 异步消息
2 同步消息
3 回复消息
4 创建消息
5 析构事件
6 执行说明
7 约束
约束介绍
7.1 时间约束
7.2 期间约束
7.3 状态常量
8 组合片段
基本介绍
8.1 opt操作符
8.2 alt操作符
8.3 loop操作符
8.4 par操作符
9 交互使用
序列图
1 序列图介绍
序列图是一种行为图;和活动图一样,它表示了系统的一种动态视图,这种视图会说明随着时间推移而发生的行为和事件的序列。
交互:模块的各个部分会通过操作调用和异步信号彼此交互,以产生浮现式的行为。、
序列图会提供三种重要的前提信息:
- 行为执行的顺序
- 哪个结构会执行哪种行为
- 哪个结构会触发哪种行为
序列图使用时机:需要精确地指定实体之间的交互、系统问题域内的交互或者解决方案域内的交互
2 序列图外框
序列图的图类型缩写是sd。在序列图中唯一允许使用的模型元素就是交互。序列图的外框总是表示建模者在系统模型某处定义的一个交互。
- 交互本身是一种模型元素;和活动一样,它是一种行为
- 和活动、模块和包一样,交互也是一种命名空间
如下图所示,这幅序列图的外框代表名为Execute Hohmann Transfer,Main Success Scenario的交互,它在系统模型中的某处被定义,内部的元素都包含在了这个交互之中。
3 生命线
生命线是代表交互参与者的一种元素,更准确地说,生命线代表交互中参与者的单一实例,它会与其他生命线交换数据
- 时间会沿着生命线向下进行,先发生的事件会显示在生命线中比较高的位置,而后发生的会显示在比较低的位置。但是序列图只表达事件发生的时序,生命线上两个事件发生之间的距离没有任何意义
生命线的标识法是一个矩形,附着有虚线,在序列图中显示为上下方向,矩形指的是生命线的头部,它包含了一个名称字符串,可以标识生命线所代表的组成部分属性。名称字符串的格式如下:
“<part property name>[<selector expression>]:<type>”
- 已命名的组成部分属性(part property name)的类型是一个模块或者执行者,建模者在模型层级关系中的某处已经对其进行了定义,常见的是模块
- 选择器表达式(selector expression)是名称字符串的可选部分,选择器表达式会指定(在一个集合中)生命线代表的特定实例,只有在选择器表达式真正能够影响集合中的某个实例参与到交互中的时候,才需要在生命线上添加一个选择器表达式(看下述例子更好理解)
如下图所示:
- BBD显示了Software Subsystem模块有一个ssdd组成部分属性,类型为Star Sensor Device Driver,多重性为3,表示该类型的3个实例,所以ssdd组成部分属性代表实例的集合(多重性大于1)
- 序列图有名为ssdd的生命线,指定了一个选择器表达式x-axis,代表ssdd集合中的特定实例(类似数组索引)
- 没有选择器表达式,则生命线可以代表任意实例,即任意实例参与到交互中,都无关紧要
在生命线可以出现6种类型的事件:
- 消息发送事件
- 消息接收事件
- 生命线创建事件
- 生命线销毁事件
- 行为执行开始事件
- 行为执行结束事件
4 消息
4.1 消息的介绍
消息代表的是发送生命线和接收生命线之间的通信。那种通信可能是启动行为、在行为的末尾发送回应、创建生命线或者销毁生命线。
- 消息的标识法一般是带有箭头的线,连接发送和接收生命线。消息的尾端与发送生命线连接,消息的箭头端与接收生命线连接
- 每种类型的消息都有其特殊的线形(例如虚线或实线)和箭头形状(开口箭头或者实心箭头)
- 消息上面还会有一个指定消息名称的字符串,它会和其他可选的消息片段(参数名称、参数值和返回值)在一起。名称字符串的具体格式取决于消息的类型
- 一条生命线可以同时是消息的发送方和接收方。
4.2 消息事件
消息发送事件和消息接收事件,可以把这两种称为消息事件。每次创建从一条生命线到另一条的消息时(或者从一条生命线到其自身),建模者就可以同时为消息发送事件和消息接收事件建模了
如下图所示:
- 这个部分显示了fc生命线向mans生命线发送measureAltitude消息
- fc生命线与measureAltitude消息尾端相交处存在一个消息发送事件
- mans生命线与measureAltitude消息箭头端相交处存在一个消息接收事件
4.3 消息类型
1 异步消息
异步消息代表的是发送生命线和接收生命线之间的一种通信,而发送方会在发送消息之后马上继续执行。发送方不会等待接收方完成被触发的行为,也不会等待接收方在完成行为的时候发送回应。
异步消息的标识法是带有开口箭头的实线(从发送生命线画向接收生命线),在线上有一个标签,格式如下:
“<message name> (<input argument list> )”
- 消息名称(message name)必须与接收生命线所拥有的接收的名称匹配(和第三章说过的接收是一样的)
- 输人参数列表(input argument list)是可选的信息片段。如果选择不显示它,那么就可以在消息名称之后显示一组空括号,或者什么都不显示;如果选择显示参数,那么就要以逗号分隔的列表形式显示
上述的输入参数列表如果选择显示参数,列表中的每个参数都会遵循下面的格式:
“<input parameter name> = <value specification>”
- 输入参数名称(input parameter name)是可选的。如果显示,则必须与被触发的接收的输入参数名称匹配
- 所传递的值(value specification)必须与相关输入参数的类型相匹配(例如:Integer、Real、Boolean、String、Complex,或者自定义的值类型,或者在模型某处定义的模块)
如下图所示:
- 有三个异步消息:measureAltitude、currentAltitudeUpdated、orbitRadiusUpdated
- 消息measureAltitude、currentAltitudeUpdated和MANS模块的一个接收相关,orbitRadiusUpdated消息与Flight Computer模块的一个接收相关
- measureAltitude没有任何参数,可能measureAltitude没有任何输入参数,可能参数对看图者来说不重要
- orbitRadiusUpdated消息有参数currentOrbitRadius,mans生命线把消息的这个值传给fc生命线,fc生命线在执行与orbitRadiusUpdated消息相关的行为时,访问那个值。currentAltitudeUpdated类似
2 同步消息
同步消息代表的是发送生命线和接收生命线之间的一种通信,其中发送方会等待接收方完成被触发行为的执行,发送回复消息,然后才会继续自身的执行。
同步消息的标识法是带有实心箭头的实线(从发送生命线画向接收生命线)
。同步消息的标签和异步消息的标签格式相同:
“<message name> (<input argument list> )”
- 消息名称(message name)必须与接收生命线所拥有的接收的名称匹配
- 输人参数列表(input argument list)是可选的信息片段
输人参数列表的每个参数格式也一样:
“<input parameter name> = <value specification>”
如下图所示:
- 和异步消息一样,当接收生命线执行与被触发的操作相关的行为时,所有在同步消息中传送过来的参数都是可以访问的。
- fc把第一个同步消息fireThrusters发送给ps;接收到该消息后(或者某个不确定的时间),ps开始执行与fireThrusters相关的行为;fc生命线必须等待那个行为完成且ps发送标志着行为完成的回复信息,才能继续自身执行
3 回复消息
回复消息代表一种标记同步调用行为结束的通信。它总是(通过交互中早期的同步消息)从执行行为的生命线发送到触发行为的生命线。
回复消息的标识法是带有开口箭头的虚线。可以选择在回复消息上显示一个标签,格式如下:
“<assignment target> =<message name>(<output argument list> ) : <value specification>”
- assignment target(赋值目标)是可选的信息。如果显示,它表示捕获返回值的属性名称——触发操作的生命线拥有的属性,一般会忽略这个信息
- message name(消息名称)必须与相应同步消息的名称匹配(即同步消息所触发的操作的名称)
- output argument list(输出参数列表)是可选的
- 冒号后面的value specification代表刚刚完成执行的行为的返回值,只有在被触发的操作真的拥有声明的返回类型时,这段字符串才会出现
output argument list(输出参数列表)是可选的,如果选择显示参数,会以逗号分隔的列表形式显示,每个参数都会遵循下面的格式:
“<output parameter name> : <value specification>”
- 输出参数的名称(output parameter name)是可选的,如果显示的话,它必须与被触发操作的输出参数名称匹配。建模者通常会忽略这条信息
- 一般只显示发送回调用者的值说明(value specification)
如下图所示,建模者一般会忽略回复消息,以节省序列图中的空间
4 创建消息
创建消息代表在系统中创建新实例的通信——之后会参与到交互中的一个实例。
创建消息的标识法是带有开口箭头的虚线。消息的尾端与发送生命线连接,消息的箭头端会和被创建的生命线的头部相连。
第三种事件:生命线创建事件会存在于创建消息与生命线头部的交点处(在那里也会存在消息接收事件,因此它和生命创建事件是同时发生的。)
如下图所示:
- fc生命线画向新生命线mansdd头部,表示在交互的这个点上创建MANS Device Driver的新实例
- mansdd生命线会在创建事件之后接收和发送消息(参与到交互中)
5 析构事件
第四种事件是生命线析构事件(简称析构事件)
析构事件代表生命线的结束,并在生命线所代表的系统中析构该实例
- 对于软件对象,析构一般指的是一种动作,它会释放分配给对象的内存
- 对于硬件对象,析构一般指的是从系统中移除一个对象,或者销毁一件真实的物理对象
析构事件的标识法是X形状的叉,位于被销毁的生命线底部
- X可能会显示在生命线的底部,不附加任何消息,这表示在交互的该时间点,生命线已经结束
- X还可能会与消息的箭头端连接,这表示析构事件是生命线接收特定类型消息的结果,这个特定类型消息叫做删除消息
- sysml没有说明删除消息所需要的线形以及箭头风格。语言只是规定删除消息必须在析构事件中结束
如下图所示:
- MANS Device Driver模块会在交互的那个时间点被销毁
- 析构事件是生命线上出现的最后一个事件,之后,mansdd生命线不再发送消息和接收消息
6 执行说明
在生命线上的最后两种事件类型是行为执行开始事件和行为执行终止事件
- 行为执行开始事件一般隐藏在生命线接收同步或异步消息的地方
- 行为执行终止事件一般隐藏在生命线发送回复消息的地方
执行说明:显式地表示行为在生命线的何处开始和结束,会消除不明确的情况
- 执行说明的标识法是一个狭窄、垂直的矩形——可能是空白的,也可能带有填充图案
- 矩形的顶部会显式地标记行为执行开始事件,矩形的底部会显式地标记行为执行终止事件
- 行为执行开始事件通常会和消息接收事件同时发生,行为执行终止事件一般会和发送回复消息同时发生
如下图所示:
- 显示了执行说明,从而显示地传达了三条生命线何时开始和结束行为的执行
- fc生命线 从接收initializeMANS消息开始,一直到发送相应的回复消息,其它同理
- 图中两个小矩形那里隐藏了回复消息
7 约束
约束介绍
序列图可以指定各种类型的约束。约束是一个布尔表达式,一般显示在大括号{}中,并且能够出现在各种类型的SysML图中。在交互情境的日常实践中可以使用三种约束:时间约束、期间约束和状态常量。
7.1 时间约束
时间约束会指定单个事件发生所需要的时间间隔。那个时间间隔可能是单独的时间值,也可能是持有一个时间值的属性。
如下图所示,这是一个时间间隔的例子
- 关键:当交互在系统操作过程中执行的时候,只有那个事件发生在时间约束指定的时间间隔中,才能够认为它能有效地执行
- 如currentCommand.executionTime,表明只有fc在executionTime属性持有的时间点发送第一个fireThrusters,这个交互执行才能认为有效
7.2 期间约束
持续期间约束会指定两个事件发生所需的时间间隔。这里的时间间隔可能是单独的时间值,也可能是持有吋间值的厲性。
- 关键:交互在系统操作中执行的时候,只有那一对事件发生相隔的时间恰好落在期间约束所指定的时间间隔中,才能够认为它们是有效的
如下图所示,只有ps执行fireThrusters行为持续时间在两分钟到五分钟之间,这个交互的执行才能够认为是有效的
7.3 状态常量
状态常量是一个条件,建模者可以在特定的事件发生之前(紧挨着的上面)指定给特定的生命线
- 在交互的有效执行中,那个条件在那个事件发生的时间点上必须为真
如下图所示,第二个fireThrusters消息发送事件之前,只有在cuurentOribitRadius==orderedOrbitRadius,才认为这个交互的执行有效
可以使用状态标识法(圆角矩形)来说明状态常量,该标识法一般会出现在状态机图中。和之前一样,这个标识法会在特定事件发生之前出现在特定的生命线上
- 如果使用这种形式,状态常量不会包含布尔表达式;它只会包含状态的名称,生命线在事件发生的那个时刻必须处于那种状态
- 只有模块(它的名称显示在生命线头部的冒号之后)真正拥有一个状态机行为,并且该行为拥有定义好的一系列状态,这种标识法才有意义
如下图所示,第二个fireThrusters消息发送时,必须处于At Transfer Orbit Apogee状态,这种歌交互才有效
8 组合片段
基本介绍
组合片段是一种机制,让建模者可以向交互添加控制逻辑(像决定、循环、并发行为)
- 组合片段的标识法是一个矩形,它会出现在序列图外框内的某处
- 矩形会放在一个或多个生命线之上,并封装在那些生命线之间传递的一条或多条消息之上(由那个组合片段定义的控制逻辑所决定的消息)。
- 每个组合片段都由一个或多个交互操作数(简称操作数组成)
交互操作符:在矩形左上角的分隔框中用来指定控制逻辑显现的字符串
- ysML定义了11种交互操作符,有四种可能会在日常建模工作中用到,分别是:opt、alt、loop和par
操作数在组合片段中以区域的形式显示:区域由虚线分隔,那条线会水平穿过矩形。
- 组合片段中的每个操作数(每个区域)包含一条或多条消息,它们的出现与否基于该组合片段定义的控制逻辑
8.1 opt操作符
opt组合片段只会拥有一个操作数(区域),所以看不到水平穿过矩形的虚线
带有opt交互操作符(在左上角)的组合片段代表一系列可选的事件
- 如果条件(称为守卫,guard)的估值为真,那么就会在交互的执行过程中发生,否则不发生
- 守卫是一个布尔表达式,放在一对方括号之间,显示在opt组合片段的顶部附近
- 必须把守卫放在组合片段中第一个事件发生的生命线上
- 所有出现在布尔表达式中的属性都必须是那个生命线的属性,或者是总体上拥有交互的模块的属性
如下图所示:
- 这个组合包含的事件有:消息发送事件、消息接收事件、行为执行开始事件、行为执行结束事件
- 交互执行过程中,如果守卫isCommandValid == True的估值为真,则这一系列被包含的事件就会成为执行的一部分
- 守卫的属性isCommandValid,或者是fc生命线的属性,或者是拥有该交互的模块的属性(序列图没显示)
8.2 alt操作符
带有alt交互操作符的组合片段代表两个或多个可替换的系列事件,它们会在交互的一次执行中发生
- alt组合片段必须拥有两个或多个操作数(区域),其中包含那些可替换的系列事件
- alt组合片段中的每个操作数都拥有自己的守卫。只有一个守卫的估值可以是真,在那个守卫下的操作数中的系列事件会成为执行的一部分,在所有其他操作数中的事件都会被完全跳过
- 建模者的职责是要确保alt组合片段中的系列守卫都是互斥的
- 以为(最多)一个操作数使用预定义的守卫else
如下图所示:
- 读取sensorStatus后,对alt组合片段的第一个操作数的守卫估值,若为真,则fc生命线发送initializeMANS回复消息;若为假,则else守卫的估值为真,第二个守卫中的事件会被执行
- 从这个图可以看到,操作数在组合片段中以区域的形式显示:区域由虚线分隔,那条线会水平穿过矩形
8.3 loop操作符
带有loop交互操作符的组合片段代表一系列事件,它们可以在交互的一次执行过程中发生多次
- 和opt组合片段一样,loop组合片段也只有一个操作数(区域)
建模者可以指定loop的min.和max.迭代次数,把它放在紧挨着loop交互操作符右侧的括号中。这个范围会以下面这样的格式指定:
“(<min.>,<max.>)”
- 如果min.和max.相等,可以只显示一个数字作为简写的格式
- 这个范围没有指定在交互的一次执行过程会发生多少次迭代。它只约朿能够发生多少次迭代
- 为了指定任意次迭代都是有效的,可以把范围设置为(0,*)
- 如果没有在loop交互操作符的右侧指定任何范围,那么(0,*)就是默认的情况
- 在loop至少循环迭代了括号中指定的min.次之后,才会对守卫进行估值。一旦它拥有了值,loop就会继续,直到守卫估值为假,或者循环迭代了括号中指定的max.次数。
如下图所示,当守卫sensorStatus == "Ready"为假,迭代才会停止
8.4 par操作符
带有par交互操作符的组合片段代表两个或多个系列的事件,它们会在交互的执行过程中并行进行
- 和alt组合片段一样,par组合片段有两个或多个操作数(区域),其中会包含那些并行的系列事件
- 一般生命线低的事件会在生命线高的事件之后发生,但如果两个事件发生出现在par组合片段的不同操作数上,那两个事件在交互的执行过程中能够以任意的顺序发生,而得到的执行都会是有效的
- 显示在par组合片段同一个操作数中的事件,还是会以一条生命线上从上到下的顺序发生
如下图所示,不同操作数的事件彼此并行发生
9 交互使用
交互使用(interaction use)的元素触发的行为:把高层次的交互分解为低层次的行为
- 交互的标识法是一个矩形,它会出现住序列图的外框之内
- 矩形左上角出现的分隔框包含字符串ref,表示这个交互使用是对建模者在模型层次关系中某处定义的另一个交互的引用,那个被引用的交互的名称显示在矩形之中
- 矩形必须放在参与那个被引用交互的生命线上
一般会为下面两种原因向交互添加交互使用:
- 为了重构出事件的子集,这个子集对于几个高层次的交互是通用的,并把那个子集放在单个低层次交互的某个位置
- 为了把一个复杂的时间系列(在高层次交互中)分解为更可读的低层次交互序列
上面的原因非常难懂,看下面例子就好
如图所示,有一个Bring MANS Hardware Online的交互
如下图所示,如果有消息进入或离开交互使用,则引用的交互有相匹配的消息从外框进入和输出到外框,总的来说,就是要消息匹配
这篇关于第七章:Sysml之序列图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!