《SysML精粹》学习记录

  • 第六章:活动图
    • 活动图简介
    • 活动图外框
    • 活动图的关键元素
      •   动作
      •   对象节点
      •   边
      •   动作详述
      •   控制节点
    • 活动分区
    • 小结

第六章:活动图

活动图简介

  活动图是能够用来传达系统动态行为信息的三种SysML图之一。活动图可以表示各种各样的活动,甚至可以描述复杂的行为。对象节点可以通过活动对事件、能力和数据的流建模,使用控制节点可以掌控活动的执行。活动分区可以为系统结构分配系统行为。
  活动图是一种行为图,它是系统的一种动态视图,说明随着时间的推移行为和事件的发生序列。这与结构图(BDD、IBD和参数图)相对,结构图都是静态视图,不会表达任何动态的时间,或者系统及其环境的变化。活动图、序列图和状态机图是SysML提供的指定系统行为的三种选择。所有三种图都可以表达连续和并发的行为,以及随着时间的推移发生的事件。然而,每种图都有其优点和缺点,建模者需要根据看图者的需求进行选择。活动图可以表达复杂的控制逻辑,这要比序列图和状态机图更强。另外,活动图是唯一能够说明连续系统行为的图。活动图存在缺点:它略显模糊。活动图说明执行动作的顺序,它们可以有选择地说明哪种结构执行了哪个动作。然而它们并没有提供任何机制来说明哪个结构触发哪个动作(相对而言,序列图可以说明所有三种信息)。创建活动图并不会与系统生命周期的特定阶段绑定。某些建模方法会要求建模者创建活动图作为图形化用例说明书,在此情况下建模者会在为系统模型添加新的用例时创建活动图。

活动图外框

  活动图的类型缩写是act。其中唯一允许使用的模型元素类型是活动。活动图的外框表示建模者在系统模型某处定义的单个活动。活动本身是一种模型元素,是一种行为,是一种命名空间,和模块以及包类似。活动可以包含一系列系统层级关系中已经命名的元素——节点和边缘(需要注意的是:活动和活动图不一样,模型的图永远都不是模型本身,模型的图只是模型的一种视图)。活动是建立在令牌流的概念之上的。
  令牌流是一种抽象的概念。令牌不是模型元素,建模者不会在系统模型中创建它们,也不会在活动图中显示它们。令牌和SysML关于活动、节点和边缘的定义紧密相关。建模者必须依赖于其想象来理解活动中的令牌流,而那个活动会给予各种类型节点和边缘的规则。令牌可以在活动图之间移动,跨越边缘,从一个节点到另一个节点。可以有多个令牌流动通过活动的一次执行。每个令牌都基于其本身的类型和状态,定义活动的动作和控制逻辑以及在活动执行过程中发生的事件,不依赖其他令牌进行移动。令牌的两种类型为:对象令牌和控制令牌。1)对象令牌代表的是在活动中流动的事件、能量或者数据的实例。一个对象令牌代表建模者在模型层级关系中某处创建的模块、值类型或者信号的实例(以定义事件、能量或者数据的类型)。2)控制令牌只表示活动的哪个动作在活动执行的特定时刻处于启用状态。

活动图的关键元素

  动作

  动作是一种可以存在于活动之中的节点,它是为活动基本的功能单元建模的节点。一个动作代表某种类型的处理或者转换,它会在系统操作过程中活动被执行的时候发生。其中基本动作的标识法是圆角矩形。建议把动作写成一个短语,由有力、无歧义的动词开始。同时应该避免把多个动词放在一个动作中,而应该把它分解成多个动作。例如,不要写“验证并保存命令”,而应该创建两个连续的动作:“验证命令”和“保存命令”。如果不使用自然语言,建模者还可以使用正式的编程语言(像C、Java、Verilog或者Modelica)来描述活动图中的动作。SysML把这样的声明叫做不透明表达式:不透明表达式有两个部分:语言和主体(使用花括号来指定语言,它位于主体之前)。系统建模者很少会把动作写成不透明表达式。一个有用且有意义的活动总是会包含一个以上动作,可以使用边缘来连接活动中的动作,边缘会定义排好序的(有时是并发的)序列。活动图表述的不仅仅是动作的序列;还可以表达对象流,即动作和活动的输入和输出。

  对象节点

  对象节点是另一种能够存在于活动之中的节点,它会对对象令牌通过活动的流建模(其中对象令牌代表的是事件、能量或者数据的实例)。对象节点常出现在两个动作之间,以表示第一个动作会产出对象令牌作为输出,第二个动作会将这些对象令牌作为输入。对象节点的标识法是一个矩形。显示在对象节点中的名称字符串会拥有下面的格入:“<object node name> : <type>[<multiplicity>]”。对象节点名称(object node name)是建模者定义的,类型(type)必须与建模者在模型层级关系中某处定义的模块,值类型或者信号的名称匹配,它会指定对象节点能够持有的对象令牌类型。多重性(multiplicity)会指定,在活动的执行过程中的特定时刻对象节点能够持有多少个对象令牌。如果在名称字符串中没有显示,那么对象节点默认多重性为1…1。对象节点另一个有用的特性是:它可以选择显示分隔框来表示它持有的对象令牌的内部属性(就像模块或者组成部分属性一样)。
  **栓(pin)**是一种特殊类型的对象节点。可以把栓附加到动作上,表示动作的输入或输出。栓的标识法是附着在动作外边界上的小方块(如下图所示),在方块内部显示一个箭头,以指定栓代表的是输入还是输出。栓的名称字符串格式和对象节点一样,但它会显示在栓的附近,而不是显示在栓中。栓的意义和对象节点一样,栓只是建模者可以根据具体情况选择的另一种标识法,以满足看图者的特殊需求。对象节点标识法可以显示分隔框,以表示它所持有的对象令牌的内部属性。它要比栓标识法占据活动图中更多空间。栓标识法无法显示分隔框,但这种标识法更节省空间。注意:SysML要求当栓的多重性下限是零的时候,(在名称前)使用<<optional>>元类型。

  活动参数是另一种特殊类型的对象节点。可以把它附加到活动图的外框上,从总体上表示活动的一种输入或者输出。活动参数的标识法是横跨在活动图外框上的矩形。活动参数的名称字符串的格式和对象节点(以及栓)相同。一种约定俗成的建模方法是把输入活动参数放在外框的顶部或者左边,输出活动参数放在底部或者右边。和栓一样,当活动参数的低多重性是零的时候,SysML要求建模者在其之前(在名称前)使用<<optional>>元类型。
  非流(nonstreaming)的行为:动作和活动只有在执行的时候才会消费它们的输入对象令牌,只有在完成执行的时候它们才会交付输出对象令牌。流(streaming)行为:动作和活动会在行为持续执行的时候接受输入和产生输出。可以在栓或者活动参数的名称字符串后面指定[stream],从而为流行为建模。到达流输入栓的对象令牌会马上为动作所用,即便它由于之前到达的对象令牌已经开始执行。流和非流在活动参数的情境下和在栓的情况下有着同样的意义,只是应用给活动的规则有所不同。流栓和活动参数让建模者可以对持续的系统行为建模。

  边

  活动可以包含两种一般类型的元素:节点和边。节点包括:动作和对象节点,边:对象流和控制流。
  对象流是一种边,它会传输对象令牌。使用对象流,可以表示事件、能量或者数据的实例通过活动,在系统操作过程中活动执行的时候,从一个节点向另一个节点流动。对象流的标识法是带有箭头的实线。对象流一般会把两个对象节点连接在一起。但是,除了对象节点之外,建模者还可以在对象流的一端拥有决定节点(decision node)、合并节点(merge node)、分支节点(fork node)和整合节点(join node),来指示对象令牌的流。必须确保对象流两端的对象节点拥有兼容的类型,在尾端作为输出产生的对象令牌必须可以作为箭头端的输入被接受。可以以下面两种方式之一来满足这种约束:(1)类型可以是相同的,(2)上游的类型可以是下游类型的子类型。
  控制流是一种传递控制令牌的边。控制令牌的到达可以启动等待它的动作。因此,当活动中的对象流自身无法传达序列的时候,建模者会使用控制流来表示一系列动作之间的序列约束。当一个动作完成时,它就会在输出的控制流中提供控制令牌,那会启动序列中的下一个动作。

  动作详述

  动作开始时机,讨论四种特别类型的动作:调用行为动作、发送信号动作、接受事件动作以及等待时间动作。
  动作启动需要满足三个条件:(1)拥有动作的活动正在执行,(2)在所有输入的控制流上都有控制令牌到达,(3)在所有输入的对象流上都有足够数量的对象令牌到达,以满足相应输入栓的最低多重性。如果需要对通向特定动作的可选路径建模,就必须在活动之前插入一个合并节点。动作可以不需要任何输入边:动作不会等待任何输入令牌;它会在活动启动的时候启动。如果在活动中有多个没有任何输入边的动作,那么就会同时启动。
  调用行为动作是一种特定的动作,它会在启用的时候触发另一种行为。调用行为动作可以把一个高层次的行为分解成一系列低层次的行为。调用行为动作所调用的行为可以是以下三种中的任意一种:交互、状态机或者其他活动。调用行为动作的标识法和动作的标识法相同(圆角矩形),只是其中的名称字符串有其特别的格式:“<action name> :<Behavior Name>”。动作名称(action name)由建模者定义。行为名称(Behavior Name)必须和建模者在模型层级关系中某处定义的交互、状态机或者活动的名称匹配。当调用行为动作触发另一个活动的时候,调用行为动作的栓必须与所调用活动的活动参数匹配。可以使用调用行为动作进行重构,把出现在多个地方的通用功能块抽取出来,在单独的行为中定义它,然后建模者只需要多次调用它。这种设计实践会让我们更易于重用那些通用的低层次行为。
  为了满足可伸缩性和性能的要求,系统工程师经常会设计分布式和并发的系统。这样的系统会使用并发机制来传递事件、能量和数据,并同步那些以并行的方式操作的各种动作。建模者可以使用发送信号动作和接受事件动作,在活动图上为这种类型的系统行为建模。发送信号活动是一种特定类型的动作,启用的时候会异步地生成信号实例,并把它发送到目的地。发送信号动作的标识法是形状类似于路标的五边形(如下图所示),在发送信号动作内部显示的字符串必须与建模者在模型层级关系某处定义的信号的名称相匹配。信号是一种模型元素,和模块一样,信号可以拥有属性。那些属性一般会代表信号实例从发送方到目标方传递的数据。

  接受事件动作在异步行为中是发送信号动作的好搭档;接受事件动作是在活动中使用的元素,它表示活动在继续执行之前,必须等待发生一个异步的事件。一般情况下,这个异步事件是接收信号实例。接受事件动作不仅限于(从发送信号动作)接收信号实例;它还可以接收异步的时间事件的发生。接受事件动作的标识法是一个五边形,看起来像是一个矩形的一边有一个三角形的槽(如下图所示)。显示在接受事件动作中的字符串(例如: Orbit Radius Updated)通常会与建模者在模型层级关系某处定义的信号名称相匹配,表示接受事件动作会等待那个信号的实例,而该实例会异步到达。它到达,接受事件动作就会完成,控制流会前进到活动中的下一个节点。接收信号实例的接受事件动作和生成该信号的发送信号动作,可能会出现在同一个活动中。或者,它可能会出现在单独的活动中;这样,建模者可以为两个不同的系统行为之间的异步通信建模。和其他类型的动作一样,接受事件动作并不需要任何输入边。对于没有输入边的动作来说,只要活动开始执行,它就会启动。在这方面接受事件动作也不例外,只要活动开始执行,没有输入边的接受事件动作就会启动,并开始监听信号实例。然而,这里有一点区别:即便在第一个信号实例到达之后,没有输入边的接受事件动作也会保持有效,它会继续监听其他信号实例。通过这种方式,建模者可以为持续响应异步事件的系统行为建模。

  等待时间事件发生的接受事件动作也叫做等待时间动作。等待时间动作的标识法是一个沙漏形状的符号,下面有时间表达式。在等待时间动作和其他接受事件动作的区别:仅在于标识法和事件的类型不同,对于发送信号动作、接受事件动作的其他一切都对等待时间动作适用。沙漏下面的时间表达式可以指定绝对时间事件,也可以指定相对时间事件。绝对时间事件表达式以关键字at开始,相对时间事件表达式以关键字after开始。如果等待时间动作拥有相对时间事件表达式那么一旦等待时间动作启动,时间事件的时钟就会开始计时。等待时间动作是一种特殊类型的接受事件动作,即便在所需要的事件第一次发生之后,也没有任何输入边的接受事件动作还会保持有效。

  控制节点

  活动中存在的第三种节点:控制节点。使用控制节点,可以引导活动沿着路径执行,而不只是简单的序列动作。控制节点既可以指引活动中控制令牌的流,也可以指引活动中对象令牌的流。控制节点有7种类型:初始节点、活动终节点、流终节点、决定节点、合并节点、分支节点和集合节点。当然,可以使用这些节点的组合,在活动中定义任意复杂的控制逻辑,以满足系统功能需求。
  1)初始节点标记活动的起点。初始节点标记了活动中的一个位置,控制令牌的流会从那里开始。初始节点的标识法是一个小的实心圆形,它一般只有一个输出控制流。活动不一定需要初始节点。控制令牌的流可以从没有输入边的动作开始。(也可能对象令牌流本身就足以在活动中定义正确的动作序列。对象令牌一般会从输入的活动参数(在活动图的外框上)开始。)
  2)流终节点活动终节点是标记控制令牌流结束的控制节点。二者之间有明显的区别:当控制令牌到达流终节点的时候,那个令牌会被销毁,以此标记单独一个控制流的结束。而当控制令牌到达活动终节点的时候,整个活动都会结束,以此标记所有控制流的结束(不管它们当前是否还在执行中)。流终节点的标识法是包含X的圆形。活动终节点的标识法是包含小的实心圆形的圆形。建模者可以为一个活动添加多个活动最终节点。然而,建模者应该避免在并发的控制流之间建立竞争条件的模型,第一个到达任何活动最终节点的控制令牌都会终止整个活动。建模者应该使用流最终节点而不是活动最终节点来避免建立竞争条件的模型。
  3)决定节点标记在活动中可替换序列的开始。其标识法是一个空心的菱形。决定节点必须拥有单一的输入边,一般拥有两个或多个输出边。每个输出边会带有布尔表达式的标签(以此作为监听),显示为方括号中间的字符串。当一个令牌(可能是对象令牌,也可能是控制令牌)到达决定节点的时候,输出边的监听会被估值。令牌会提供给那时监听估值为真的输出边。建模者必须确保输出边上的系列监听完整且独立,从而确保每次令牌到达的时候,只有一个监听的值会是真。SysML允许建模者使用else作为(最多)一个输出边的监听,以确保满足“完整”的标准。(如果所有其他监听的估值都是假,那么else的估值就是真。)
  4)合并节点标记活动中可选序列的结尾。其标识法和决定节点相同:空心菱形。建模者可以通过输入边和输出边的数量来区分它们:合并节点拥有两条或多条输入边,而只拥有一个输出边。当一个令牌(可能是对象令牌,也可能是控制令牌)通过任意一条输入边到达合并节点,令牌马上就会提供给输出边。常见的情况是,合并节点和决定节点组合使用,在活动中对循环建模。事实上,合并节点对于建立循环模型来说非常重要。如果这幅图中的合并节点被删除(它的两条输入边直接与接受事件动作连接),那么接受事件动作就永远都不会启动。为了开始,它需要在每条输入边上都有控制令牌,这在循环中是永远都不会发生的。可以使用合并节点来建立令牌交错情况的模型,这些令牌来自多个并发的来源,建模者需要把它们合并到单一的输出流中。
  5)分支节点标记活动中并发序列的起点。分支节点的标识法是一条线段(方向随意),它必须拥有一条输入边和两条或多条输出边。当一个令牌(可能是对象令牌,也可能是控制令牌)到达分支节点的时候,它会被复制到所有输出边上。原始令牌的每个副本都代表独立、并发、沿着各自路径前进的控制流。(关于并发很重要的一点是,并发动作完成的顺序是不确定的。
  6)集合节点标记活动中并发序列的结束。集合节点的标识法和分支节点一样:一条线段。建模者可以通过输入、输出边的数量来区分它们,集合节点一般拥有两条或多条输入边,而只有一条输出边。可以使用集合节点为活动中并发动作序列的同步点建模。当令牌到达每条输入边的时候,就会有单个令牌提供给输出边。并发序列结束,一条控制流会通过集合节点所标记的点,继续执行(类似与“与”门)。

活动分区

  活动图不仅可以传达活动中动作的顺序,而且还可以传达执行每个动作的结构。建模者可以使用活动分区来表示。活动分区的标识法是一个大矩形(包含一个或多个节点),在一端有头部内容:头部内容会指定活动分区代表什么。活动分区的方向可能是水平的,也可能是垂直的,但是某些建模工具可能只支持其中一种方向。活动分区最常见的情况下会代表存在于系统模型某处的一个模块或者一个组成部分属性。在活动分区中放置一个动作表示该动作被分配给一个名称由头部决定的结构。如果只是简单地放置,那么当活动在系统操作过程中执行的时候,结构就会负责执行那个动作。当活动分区代表一个模块的时候,它表示那个模块的所有实例都能够执行其中包含的动作。当活动分区代表组成部分属性的时候,那么只是那个组成部分屈性会负责执行所包含的动作。

小结

  活动图是一种强大的信息沟通媒介,可以显示持续的系统行为,并且需要关注事件、能量和数据的流在一系列动作之间的流动(可能是串行或者并行)。活动图的重大优势在于它的可读性,即便所显示的行为拥有复杂的控制逻辑。可以在活动中创建调用行为动作来为行为分解建模。发送信号动作和接受事件动作让建模者可以为分布式系统中结构之间的异步通信建模。建模者可以使用等待时间动作为周期性发生的行为或者在特定时间点发生的行为建模。活动分区让建模者可以为活动中的动作分配职责,以指定系统中的结构。

《SysML精粹》学习记录--第六章相关推荐

  1. C语言深度剖析书籍学习记录 第六章 函数

    函数的好处 1.降低复杂性:使用函数的最首要原因是为了降低程序的复杂性,可以使用函数来隐含信息,从而使你不必再考虑这些信息. 2.避免重复代码段:如果在两个不同函数中的代码很相似,这往往意味着分解工作 ...

  2. 《SysML精粹》学习记录--第七章

    <SysML精粹>学习记录 第七章:序列图 序列图简介 序列图元素 消息 约束 组合片段 交互使用 小结 第七章:序列图 序列图简介   序列图是另一种可以用来说明系统动态行为信息的Sys ...

  3. 《SysML精粹》学习记录--第十一章

    <SysML精粹>学习记录 第十一章:需求图 需求图简介 需求图元素 需求关系 需求关系标识法 小结 第十一章:需求图 需求图简介   需求图是SysML中的主要媒介,可用于向利益相关者传 ...

  4. 《SysML精粹》学习记录--第四章

    <SysML精粹>学习记录 第四章:内部模块图(Internal Block Diagram,IBD) IBD介绍 组成部分属性 引用属性 连接器 项目流 内嵌组成部分和引用 小结 第四章 ...

  5. 《SysML精粹》学习记录--第五章

    <SysML精粹>学习记录 第五章:用例图(Use Case Diagram) 用例图简介 用例图外框 小结 第五章:用例图(Use Case Diagram) 用例图简介   用例图可以 ...

  6. 《Go语言圣经》学习笔记 第六章 方法

    <Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...

  7. 《疯狂Java讲义》学习笔记 第六章 面向对象(下)

    <疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...

  8. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  9. Unix原理与应用学习笔记----第六章 文件的基本属性2

    Unix原理与应用学习笔记----第六章 文件的基本属性2 改变文件权限命令:chmod 提示:文件或目录创建后,就被赋予一组默认的权限.所有的用户都有读,只有文件的所有者才有写. 相对权限设置 Ch ...

最新文章

  1. 错误:”未能加载文件或程序集“System.Web.Mvc, Version=2.0.0.0” 解决方法
  2. 直播 | ACL 2021论文解读:表征与结构兼备,结构化语言模型R2D2
  3. 三国演义告诉我们的60个道理
  4. 用c/c++实现linux下检测网络接口状态【ZT】
  5. 污水处理中php是什么药剂,污水处理中需要用到哪些药剂?
  6. 39-java 输入输出总结
  7. 非线性系统的神经网络控制(常用介绍)--理论
  8. 五类IP地址范围及作用
  9. librosa的短时傅里叶实现librosa.stft()
  10. 2345浏览器兼容模式怎么设置
  11. 7-39 龟兔赛跑 (20 分) 乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。T分钟后乌龟和兔子谁跑得快?PTA:中M2021春C、Java入门练习第I段—变量、表达式、分支、循环
  12. 6096. 咒语和药水的成功对数
  13. html 伸缩盒子布局,详解CSS3伸缩布局盒模型Flex布局
  14. 高通Sensor校准
  15. (深度学习)构造属于你自己的Pytorch数据集
  16. Project-1-Buffer-Pool-Manager
  17. 微信小程序数据 \n 换行符失效解决办法
  18. 微信小程序实战--开发一个简单的快递单号查询
  19. 冰封王座人工只能_OpenAI狂虐Dota大神Dendi,AI称霸游戏界这事你咋看
  20. [Java]Spring6(动力节点老杜)

热门文章

  1. 【计算机网络】 课程大作业:利用Wireshark抓包并进行分析
  2. freeRTOS — 软件定时器的使用
  3. Gson解析json字符串,并封装成ListT
  4. 什么是双亲委派模型?双亲委派模型有何作用?
  5. 计算机网络的企业分析,计算机网络系统在企业中的应用分析
  6. jpg转换成word(如何把jpg转换成word文档)
  7. 单点要信双点遥信区别
  8. docker使用教程
  9. 研发工程师面试题整理
  10. 联想拯救者Y7000P更新BIOS