MBSE建模学习之一:有26种分区,先说说模块(Block)建模
MBSE建模技术中最重要的方法就是面向对象(Object Oriented, OO)的方法。几种不同技术方法中(OOSEM、Harmony-SE、RUP、OPM),主要的也都是把整个系统当作对象来建模。“模块”(Block)是面向对象模型中最重要的概念。下面说说模块是啥、怎么来的、怎么建模。先从面向对象技术的三大特征说起。
面向对象技术三大特征
面向对象技术有三大特征,如下:
(1)抽象
抽象是将具有一致结构和行为的对象抽象成类。一个类就是一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。从某种意义上讲,人类的知识体系就是不断“抽象”世界中的各种物体(Object,对象)、进行分类、形成的各种概念。
(2)继承
继承是在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类(称为“基类”或“父类”)所定义的内容作为自己的内容,并加入若干新的内容。继承得到的新类称为“子类”。继承的过程是一个从一般到特殊的过程。
(3)多态
多态是指相同的操作或过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态是在子类继承父类的基础上,通过重定义方法过程从而实现不同的操作结果。
模块(Block)
MBSE主要的建模语言UML/SysML是面向对象的语言。SysML(Systems Modeling Language,系统同建模语言)是对UML(Unified Modeling Language,统一建模语言)的扩展。在UML中最重要的概念是“类”(Class)。SysML中,对“类”进行了扩展,称为“模块”(Block)。MBSE的建模工作,可以说就是把要设计的系统及其各部分抽象为“模块”的过程。模块的主要用途是说明系统的架构。这个“模块”可以代表任何级别的产品。模块与模块之间可以有继承关系(或称泛化关系,父类泛化子类,子类继承父类)、组合或引用关联关系等等。
下面用一个简单的例子说明一下用“模块”实现面向对象技术的三大特征。
在MBSES软件中,建立一个模块定义图(如何建立解决方案、项目、包、模块定义图的软件操作过程,可以参考用户手册“快速操作指引”)。图中增加一个作为父类的模块“计算机”。当定义一个具体的计算机型号的时候,可以从这个父类继承,继承类自动具有父类的所有属性(在MBSES软件中通过属性框设置模块节点“显示继承特征”可以在继承类中显示所有继承父类的属性,这些继承属性前面有一个特殊标志“^”)。还可以添加子类特有的一些属性;或者通过“重定义”父类属性,把父类通用的属性转成子类特有属性。例如这个图中,通过重定义父类的“mo:显示器”属性,确定子类的显示器类型是更具体“24寸显示器”。
模块的各种属性、操作、关系可以显示在模块节点中的一个方框内,这些方框称为模块节点的一个“分区”(Compartment)。在MBSES软件中,模块的视图总共有超过26种分区。通过“模块”节点的右键菜单添加各类属性、操作,模块就会显示这些分区(没有这类属性,模块节点是一定不显示这个分区的;有的话,还可以通过节点对属性框中的节点显示属性设置是否显示)
模块的标准分区
模块的26种标准分区(不包括自定义分区)都有啥?列表如下:
序号 | 种类 | 分区名称 | |
---|---|---|---|
1. | 结构特征 | 部件(parts) | 类型是“模块”且聚合关系是“组合”的属性 |
2. | 结构特征 | 引用(references) | 类型是“模块”且聚合关系不是“组合”的属性 |
3. | 结构特征 | 值(values) | 类型是值类型(ValueType)的属性 |
4. | 结构特征 | 约束(constraints) | 类型是“约束属性”的属性 |
5. | 结构特征 | 连接器(connector properties) | 类型是关联的属性 |
6. | 结构特征 | 参与属性 (participant properties) | 关联模块中,和两端被关联的模块对应的属性 |
7. | 结构特征 | 属性(properties) | 任何类型的属性 |
8. | 行为特征 | 操作(operations) | 类型为操作的行为特征 |
9. | 行为特征 | 接收(receptions) | 类型为接收的行为特征 |
10. | 行为 | 类目行为(classifier behavior) | 表示模块开始工作,一直到结束的整个过程的行为。一个模块只有一个类目行为,一般是一个状态机。 |
11. | 行为 | 拥有行为(owned behaviors) | 模块能够提供的各种服务。拥有行为包括类目行为,但是在MBSES中拥有行为分区中不重复显示类目行为。 |
12. | 结构特征 | 绑定引用(bound references) | 类型是绑定引用的属性 |
13. | 构造型 | stereotypes) | 当构造型在分区中显示的时候,显示应用的构造型的属性 |
14. | 端口 | 端口(ports) | 类型是端口的属性 |
15. | 端口 | 完整端口(full ports) | 类型是完整端口的属性 |
16. | 端口 | 代理端口(proxy ports) | 类型是代理端口的属性 |
17. | 属性 | 流属性(flow properies) | 类型是流属性的属性 |
18. | 分配关系 | 分配从(allocatedFrom) | 分配关系的源端元素 |
19. | 分配关系 | 分配到(allocatedTo) | 分配关系的目标端元素 |
20. | 需求关系 | 改善(refines) | 改善的需求 |
21. | 需求关系 | 满足(satisfies) | 满足的需求 |
22. | 需求关系 | 跟踪从(tracedFrom) | 跟踪的需求 |
23. | 需求关系 | 验证(verifies) | 验证的需求 |
24. | 结构 | 结构(structure)分区 | 结构分区显示一个局部的内部模块图,显示模块的结构 |
25. | 命名空间 | 命名(namespace)空间分区 | 命名空间分区显示一个局部的包图,命名空间分区中的模块是当前模块嵌套类而已 |
26. | 图形 | 图形(image)分区 | 显示一个代表模块图形 |
这26种分区,简单的说明和用途如下:
(1)部件(parts):
部件分区中属性的类型也都是模块,它表示父级模块的组成部分。每个部件的工作过程在父级模块开始之后才能开始。而在父级模块工作结束后,所有部件属性都不可能再工作。一个部件只能属于某一个模块,它表示模块的内部结构。
(2)引用(references)
引用属性的类型也是一个模块,不过这个子模块不是当前这个模块内部的模块。它可能位于另一个模块内部,但是当前这个模块的工作需要这个外部部件提供功能,或者向这个外部模块提供数据或信息。
(3)值(vallues)
值属性的类型是一个值类型(ValueTtype)。SysML的值类型在继承UML数据类型的基础上,增加了“单位”和“数量类型”属性,更适合工程上的实际应用。
(4)约束(constraints)
约束分区中的约束一般是一个数学表达式,它表示模块各属性参数之间的数学关系。SysML扩展了约束的应用,约束分区中的“约束”也可以是一个“约束属性”。约束属性的类型是一个约束模块,约束模块中包含了可以重复使用的约束关系。也就是通过“约束属性”,把通用的数学关系放到约束模块中。进一步描述约束模块中数学关系和模块的参数之间的关系,可以用一个参数图表示。
(5)连接器属性(connectorProperties)
连接器(Connector)是对应各部件之间关联关系的属性。连接器的类型是一个关联(Associattion)或关联模块(AssociationBlock)。连接器可能只是表示内部模块之间数据或信息的传送,也可以是具体的有实物的连接器产品,如电连接器、机械连接器等。
(6)参与属性(participantProperties)
当连接器的类型是一个关联模块的时候,连接器两端连接的部件,对于连接器的类型:关联模块来说是“参与属性”。下图说明了一个关联模块中“参数属性”的例子。
(7)属性(properties)
这个普通属性的分区可以显示任何类型的属性,也就是属性的类型可以是任何类型,甚至可以为空。
(8)操作(operations)
操作表示模块可提供的一个服务。对于软件模块,对应这个类提供的方法、过程或一个函数。对于硬件模块,它表示模块可提供的方法接口,可接收参数并完成一个功能。但是UML\SysML中操作只是一个方法接口,它的实现需要通过对应方法的行为图来描述。
(9)接收(receptions)
接收表示模块接收信号并进行处理的一个方法。接收一定对应在模型中某个地方定义的信号(Signal),它的参数和信号的属性对应。接收的调用一定是异步的,也就是一个模块向另一个模块发送信号,是不等待返回消息就继续其它工作或发送下一个信号。(同步的概念是调用另外一个模块的操作的时候,会等待返回的消息,收到返回消息才继续下面的工作)
(10)类目行为(classifier behavior)
一方面,行为表示模块可提供的一种服务,输入什么、输出什么。另外,行为有对应的行为图(活动图、序列图、状态机图)。在行为图中详细说明了模块是怎么处理输入信息(输入参数)并加工、转化为输出信息(输出参数)的。这里的“信息”表示任何物质,不止是数据。也可以没有输入、输出信息,只是表示模块的活动过程。
模块的类目行为就是表示模块从开始到结束的活动过程。一个模块只能有一个类目行为。例如用一个状态机表示设备的活动过程。这个状态机有启动、开机、待机、关机、停机等各种状态。
(11)拥有行为(owned behaviors)
一个模块拥有的所有行为。一个模块可能提供多种服务或功能,每个可以对应一个行为。
(12)绑定引用(bound references)
绑定引用是一个引用属性,同时这个引用属性通过绑定连接器绑定到内部的一个部件。“绑定”的概念是两个值始终相等,或者是同一个对象的意思。通过绑定关系,同一个对象在两个地方使用。例如计算机中映射了另外一个计算机的一个存储空间作为本地盘符。
(13)构造型(stereotypes)
构造型是一种扩展标准元素功能的机制。例如定义一个表示元素作者、版本的构造型。模块构造型的属性可以显示在分区中,也可以显示在头部。通过模块属性框中节点显示属性设置。构造型属性是在设计模型时输入的,而模块的属性是在模块实例化的时候才赋值的,这个也是区分构造型属性和模块自己属性的一个方法。
(14)端口(ports)
端口是一个特殊的部件,它是专门用来和外界交换信息的。例如一个计算机的USB端口、提供显示信号的HDMI端口。
端口一般表示为模块边框上的小方块。也可以显示在分区中。可以通过属性框中模块节点的显示属性设置。
(15)完整端口(full ports)
完整端口是我们把它当作一个独立的部件来看待的,这个部件也是一个可能具有各种属性、功能行为的一个模块。可以说完整端口是自己直接处理输入的信息、输出处理后的信息(当然处理过程也是可以调用其它内部模块的功能的)。
(16)代理端口(proxyPorts)
代理端口的类型一定是一个接口模块。代理端口通过一个绑定连接器绑定到一个内部的模块。可以说代理端口自己并没有处理信息的功能,处理信息的其实是另外一个内部模块。
(17)流属性(flowProperties)
流属性是具有方向的属性。流属性的方向有“进”“出”或“进出”(in, out, inout)。流属性的类型可以是值类型、模块或信号。
(18)分配从(allocatedFrom)
“分配”是SysML中定义的一个表示两个元素之间特殊关系的元素。例如可以为结构分配行为、为物理结构分配逻辑结构,为结构分配资源。
“分配从”表示一个元素被分配到了这个模块。例如一个一个活动被分配到这个模块。
(19)分配到(allocatedTo)
“分配到”表示这个模块分配到了另外一个元素。例如一个逻辑模块分配到一个物理模块。
(20)改善(refines)
“改善”是表示模块和需求之间的关系,意思是这个模块的说明更详细的说明了需求。
(21)满足(satisfies)
“满足”表示模块满足了某个需求。
(22)跟踪从(tracedFrom)
“跟踪从”表示这个模块跟踪回某个需求。通过跟踪关系可以知道模块设计和需求之间关系。
(23)验证(verifies)
“验证”表示模块验证了某个需求。作为验证关系的模块,一般是一个“测试案例”元素。
(24)结构(structure)分区
结构分区显示了一个模块的内部结构。在模块节点中要显示结构分区,可以把图形工具切换到内部模块图,然后拖拽一个属性节点到模块节点上,这时候模块节点会显示结构分区。
结构分区提供了一个把内部结构和模块定义同时显示的机制。
(25)命名(namespace)空间分区
命名空间是一个有名称属性的元素的命名空间。可以把命名空间和磁盘中的“目录”作用类似看待,不同命名空间下面的元素名称可以重复。一个元素完整的名称包括“完整的命名空间”+“::”+“名称”,这个完整的名称称为元素的“完全限定名称”。作为命名空间的元素一般是包,但是模块也可以作为命名空间元素。但是在模块命名空间下面定义的模块元素只是表示是上层模块的“嵌套类”元素,它并不表示“组成”关系。
如果把一个模块拖拽到另外一个模块上面,上层的模块会显示命名空间分区。
(26)图形(image)分区
模块节点也可以显示一个代表模块的图片。通过节点的右键菜单“选择图片”,可以选择一个图片文件,显示在节点下方。
结构分区、命名空间分区、图形分区的示例如下(涂个颜色):
模块的自定义分区
模块节点除了显示上述标准的26种分区,用户还可以添加多个自定的分区。每个自定义分区的名称和分区中显示的属性都可以自定义。而且自定义分区开可以通过泛化关系继承。通过这个功能,用户可以定义一个“基类”作为模板,然后需要的模块从这个模板类继承,可以立即为这些继承类增加标准化的属性。如下定义了一个“六性”基类模块,在另外一个模块继承它、应用的例子。