一、引言
SysML中的模块定义图,英文为 “Block Definition Diagram”,简称BDD,是系统建模过程中最为常见的图之一,BDD是一种结构图,它主要对系统的结构组成以及组成元素间的关系进行描述。SysML中的图类似于UML中的类图,在学习的过程中可以以类比的方式进行学习。
二、模块定义图介绍
如下图所示,BDD中可以包含 包、模型、模型库、视图、模块和约束模块。其中最为重要和常见的是模块和约束模块。包、模型、模型库、视图在后续系列文章中论述,我们仅关注BDD中常用的模块和约束模块,本文重点介绍模块。
约束模块是SysML中的一种定义元素,常见情况下在约束模块中定义约束表达式。约束模块一般用于搭配参数图构建系统的数学模型。
1. 模块的表达方式
模块时SysML中的基本单元,其对应于系统中的任意实体,我们可以使用模块对系统中的实体进行建模。通过带有<<block>>标识的矩形框表示,其后带有模块的名称(用户自定义),另外,还可以通过可选的其他分隔框,用来标识模块的其他组成。例如下图所示,该模块定义为 包含 值属性 和 操作属性分隔框。
BDD属性包含行为属性和结构属性。顾名思义,结构属性表达了实体的结构组成该部分,而行为属性则表达了实体所具有的行为特征。
1.1 结构特性
如下图所示,结构特性包含值属性、组成属性、引用属性、约束属性、端口共 5 种类型,其在模块中分隔框的头部表示参考下图中的英文表示。已值属性为例,其分隔框头部标识为 values,其他的属性类似。
值属性:SysML规定的命名规则为 <value name>:<type>[<multiplicity>] = <default value>。值属性的类型(type)是在SysML图中某处定义的“value type”(值类型也是一种SysML元素,用户可以灵活定义值类型).
约束属性:SysML规定的命名规则为 <constraint name>:<type> 。约束名称为用户自定义,约束类型是用户在SysML图的某库定义的 约束模块 的名称。一般情况下,约束模块用于定义一种数学关系约束,约束属性是对约束模块的引用。
引用属性:SysML规定的命名规则为 <reference name>:<type>[<multipicity>]。type是用户在SysML的某库定义的模块或者执行者,大部分情况下是模块,类似于UML 中类与类间的引用。SysML中引用表示的是一种 “需要” 语义,引用属性标示了引用模块与被引用模块之间存在关联,可能是为了数据交换、实践传递等,总之,二者之间存在联系。
组成部分属性: SysML规定的命名规则为 <part name> : <type> [<multiplicity>]。type是用户在SysML的某库定义的模块名称。multiplicity表示了实例的数量。组成属性标示的是一种 “所属” 关系,模块是由组成部分属性所映射的模块组成。这种 “所属”关系所表述的意义不仅仅局限于物理层面的“所属”,如发动机是汽车的组成部分。同样可以表述逻辑的所属,例如逻辑上的软件元素间的所属关系。另外,所属还有一层含义,SysML明确声明,组成部分属性一次只能属于一个复杂结构,但可以移除。
端口: 端口表示了一种结构对外提供的交互点,外部可以通过该交互点与模块进行交互-数据或事件等等。端口与软件的接口概念不同,其含义更加广泛。端口可以代表任意类型的交互点,例如物理的连接点,软件层面的消息队列,公司间的交互点如网站、邮箱等等。对端口的理解不要局限于软件接口,要从更加抽象的层次去理解和定义。大家只要记住其本质:端口是某一结构对外部结构提供的交互点,是结构间进行数据或事件、功能交换点的一种方式和抽象。另外,从端口的本质我们可以看出,它代表了一种“封装”的思想,这是面向对象的最常见并且最为关键的特性之一。封装有助于隐藏实现的细节,降低系统认知的复杂性以及系统间的耦合度。SysML V1.2和 V1.3的端口类型略有不同,在后续系列文章中再进行详细说明。
1.2 行为特性
行为属性是对系统或结构的行为的表达,在SysML中包括 操作(operations )和 接收(receptions)。操作表示一种调用后执行的行为,也就说operations是基于调用事件触发的。一般情况下,operations代表一种同步行为,但SysML并没有对其做严格限制,设计者可以把任何行为定义为操作。
操作: 通过“operations”进行标识,其格式为:<operation name> (<parameter list>) : <return type>[<multiplicity>]。操作是一种调用事件触发的行为,可以具有返回值和输入及输出参数。SysML中对此不做同步和异步行为的区分,都可以通过 “操作” 进行表述。
接收: 通过“receptions”进行标识,其格式为:<<signal>> <reception name> (<parameter list>) 。操作是一种信号事件触发的行为,且,其总是代表异步行为,无返回值,参数只有输入,没有输出。注意标识中的<<signal>>,这是必须的标识。另外,接收名称需要与模型某处定义的<<signal>>模型元素的名称一致。
三、模块间的关系
类似于UML的类图间的关系,SysML模块间也存在关联、泛化和依赖关系,其中关联又可以分为 引用关联和组合关联。
1. 引用关联
引用关联表示双方存在一种连接,双方可以相互访问。
SysML中模块间的引用关联通过实线标识,若实线无箭头,则代表双向访问,若有箭头,则表示单向的访问。举例如下图所示,模块A和B存在关联关系,链接名称为“Link”,A中有B的引用属性bList,多样性为 1 - 5个。模块B中有模块A的引用属性a,多样性为 1 个。
2. 组合关联
组合关联表达的是一种构成关系,组合段的模块实例由组成部分端的实例组合而成。
SysML中组合关联的标识法是带有实心菱形的实线。没有箭头表示双向访问,有箭头表示单向访问。菱形端是组合端,另一端是组成部分端。举例如下图所示,模块A是模块的结构组成部分。A和B是双向引用。在B中有模块A的引用属性a,多样性为 1 个。在模块A中有关于模块B的引用b,多样性为 0 - 1 个。由于B是组成端,A是组成部分端,因此,在A中最多只能有 1 个B引用实例。
3. 泛化
泛化表达的是一种继承关系,子类型继承超类型的特性,并对超类型特性进行扩展或重定义。泛化是可传递的。从广义上讲,泛化对应于面向对象思想中的继承,泛化有利于设计者面向抽象进行设计。设计者可以基于继承方式扩展出新的子类型,利用依赖倒置的原则实现便捷的扩展,因此这种设计方式有利于提高系统的可扩展性。
SysML中泛化关系的标识法为一条带有空心三角箭头的实线。超类型位于箭头段,子类型位于非箭头段。举例如下图所示,模块A继承自模块B.
4. 依赖
依赖表述的是两个模块间一方依赖于另一方,当另一方改变时,则依赖房可能也需要改变。这也是模型间跟踪性的体现。
SysML中依赖关系通过带有箭头的虚线标识。箭头端是被依赖着,非箭头端是依赖者。同时,SysML中对依赖关系进行了泛化,定义了几种特定类型的依赖关系,例如需求图中经常出现的跟踪、满足、验证等多种关系都是依赖的特定类型。如下图所示,模块A依赖于模块B。
四、总结
模块定义图描述了系统的结构化信息,包括系统的结构类型及关系、结构提供以及需要的服务、结构所遵循的约束、系统中的值类型。
模块间的泛化关系提现了面向抽象设计的思想,方便系统的扩展。
模块的结构特性“端口”体现了封装的思想,降低系统间的耦合。
约束模块及约束属性描述了模块结构的约束关系,一般和参数图搭配使用,用于构建系统的数学模型。
BDD描述了结构及结构件的关系,但未给出结构间联系的内部结构,这些有内部模块图IBD补充。
BDD涉及了约束属性和约束模块,但精确的系统数学模型搭建还需要参数图的配合。
微信公众号 “SystemEngineeringLab”