【SysML】模块定义图(BDD, Block Definition Diagram)
一、引言
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”
【SysML】模块定义图(BDD, Block Definition Diagram)的更多相关文章
- 公共模块定义/草案(Common Module Definition / draft - CMD草案)
This specification addresses how modules should be written in order to be interoperable in browser-b ...
- CMD规范(通用模块定义规范)(翻译)
最近在使用sea.js.大家知道sea.js遵循CMD规范.该规范的英文说明很简洁,我试着翻译了一下,旨在交流. Common Module Definition 通用模块定义规范 This spec ...
- Sea.js学习3——Sea.js的CMD 模块定义规范
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- CMD 模块定义规范
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- CMD模块定义规范
CMD 模块定义规范 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规 ...
- CMD (sea.js)模块定义规范
转自http://www.cnblogs.com/hongchenok/p/3685677.html CMD 模块定义规范 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(C ...
- CMD 模块定义规范【转】
在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...
- AMD模块定义规范
AMD 即Asynchronous Module Definition,中文名是“异步模块定义”的意思.它是一个在浏览器端模块化开发的规范,服务器端的规范是CommonJS. 模块将被异步加载,模 ...
- 详解模块定义(.def)文件
一个完整的Windows应用程序(C++程序)通常由五种类型的文件组成:源程序文件,头文件,资源描述文件,项目文件,模块定义文件.本文主要讲解模块定义文件. 模块定义 (.def)文件为链接器提供有关 ...
随机推荐
- Delphi拷贝目录(含子目录)的方法
要实现目录级的拷贝,可以利用Windows API函数ShFileOperation( ),其函数声明如下: WINSHELLAPI int WINAPI SHFileOperation( LPSHF ...
- Spring学习笔记IOC与AOP实例
Spring框架核心由两部分组成: 第一部分是反向控制(IOC),也叫依赖注入(DI); 控制反转(依赖注入)的主要内容是指:只描述程序中对象的被创建方式但不显示的创建对象.在以XML语言描述的配置文 ...
- session的一些方法
session的一些方法: package com.stono.servlet.listenerorder; import java.io.IOException; import java.io.Pr ...
- Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
Oracle 12cR1 RAC 在VMware Workstation上安装(上)-OS环境配置 1.1 整体规划部分 1.1.1 所需软件介绍 Oracle RAC不支持异构平台.在同一个集群 ...
- Spark计算模型
[TOC] Spark计算模型 Spark程序模型 一个经典的示例模型 SparkContext中的textFile函数从HDFS读取日志文件,输出变量file var file = sc.textF ...
- Oracle检查锁及其等待的行ROWID
SELECT l.session_id sid , substr(o.owner, 1, 8) owner, o.o ...
- 《JAVASCRIPT高级程序设计》根植于原型链的继承
继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...
- GIS制图课程目录(持续整理)
GIS制图课程目录 by 李远祥 由于过去一年都没有进行更新,近期终于抽出时间来进行相关知识的整理,因此,对专项技术进行了不同技术线条的梳理.为了方便阅读,特意整理一下全书的目录结构,希望对读者有帮助 ...
- Java语言开发环境搭建
在使用任何计算机语言开发之前,都要搭建其开发环境. 一.明确什么是JDK.JRE. 二.下载JDK 三.安装JDK 四.配置环境变量 五.验证是否成功 一.什么是JRE.JDK. JRE(Java R ...
- HTTP学习目录
前面的话 除了HTML.CSS.javascript这三门前端基础知识之外,HTTP恐怕是前端工程师最需要掌握的知识了,它是前端和后端沟通的桥梁,前端工程师需要能够调试HTTP.修复网络传输中可能遇到 ...