统一建模语言语义的异构方法
立即解锁
发布时间: 2025-08-20 02:28:38 阅读量: 2 订阅数: 17 

### 统一建模语言语义的异构方法
#### 1. OCL 机构
OCL 签名声明类名、查询名(对应于属性和查询方法)和方法名。类名配备了表示继承层次结构的偏序关系。默认(或内置)类型扩展了这些声明。例如,类名集合在应用类型构造函数 Set 和 Sequence(相当于列表构造)时是封闭的。这个扩展的类型系统用于为每个查询名和每个方法名定义一个(唯一的)类型。继承层次结构与内置的子类型关系一起诱导出 OCL 子类型关系,其中包括类名以及查询和方法名。
OCL 签名定义的句子是不变式和前置/后置条件,如下例所示:
```
context EOffice::accept(student : Student, topic : Topic)
pre: topic.student->empty() and student.topic->empty()
post: topic.student = student and student.topic = topic
```
对应的签名可能声明了类名 EOffice、Student 和 Topic,EOffice 的查询名 topic 和 student,Topic 的查询名 student,Student 的查询名 topic,以及 EOffice 的方法名 register。OCL 表示由 OCL 签名和该签名上的一组 OCL 句子组成。
OCL 解释将类名映射到已创建对象的集合,并提供一种机制来检索实现查询名和方法名的函数。前者函数不会修改对象的状态,而后者可能会修改状态。OCL 理论的模型是状态转换系统,其状态是已创建对象的集合,其转换由方法调用和相应的返回值标记,因此转换的目标状态是在源状态上应用该方法的结果。此外,这些模型的每个状态都遵守理论的不变式,并且任何两个相邻状态都满足标记连接这两个状态的转换的方法所需的前置/后置条件。
签名态射、翻译和归约的构建方式与静态结构机构中的相应概念类似。
#### 2. 链接 UML 机构
研究如何将用不同语言表示的给定软件系统的特定视图相互链接起来。特别是,研究上述 UML 机构之间的自然链接。
有两种可能的方式来链接机构:
- 通过共态射从一个机构直接翻译到另一个机构。
- 定义一个新的中介机构,将两个机构都嵌入其中。
类图机构可以很容易地嵌入到 OCL 机构中。具体映射如下:
| 类图元素 | 映射到 OCL 元素 |
| ---- | ---- |
| 类名 | 类名 |
| 类型化属性 | 查询 |
| 类型化方法 | 方法名 |
| 角色名 | 集值查询 |
类图给出的理论表示的句子被翻译成 OCL 不变式。例如,对于二元关联 \( a \subseteq r1 : c1 \times r2 : c2 \) ,具有声明的多重性 \( association(a, r1 : c1 : m1, r2 : c2 : m2) \) ,多重性的翻译包括导航性约束和最多两个基数约束:
- 如果 \( m1 \) 的形式为 \( n1..n2 \) :
```
context c1 inv: r2->forall(x | x.r1->contains(self))
context c2 inv: r1->count() >= n1 and r1->count() <= n2 ;
```
- 如果 \( m1 \) 的形式为 \( n..\star \) :
```
context c1 inv: r2->forall(x | x.r1->contains(self))
context c2 inv: r1->count() >= n1 ;
```
对于 \( m2 \) 也是类似的。
对于非二元关联和各种类型的多重性,翻译会更复杂,但仍然是直接的,即处理反向导航性和多重性所施加的范围内的基数。
给定一个签名的 OCL 模型,可以通过取 OCL 模型的状态集来提取嵌入的类图签名的模型。
类图机构不能轻易地嵌入到交互机构中。虽然类名可以映射到类名,类型化方法可以映射到消息集,但如何嵌入类型化属性和关联名,以及如何翻译关联的多重性声明并不容易。不过,如果 OCL 机构和交互机构可以链接,这个问题就不是那么关键了。
为此,可以设计一个辅助机构 OCL+I,它包含 OCL 机构的所有元素以及交互机构的所有元素。签名声明类名(与 OCL 签名和交互签名一样)、查询名和方法名(与 OCL 机构一样);查询和方法名与声明类名上的变量一起诱导出消息(对应于交互机构中的消息)。句子要么是关于类名、查询名和方法名的 OCL 句子,要么是关于类名和诱导消息的交互句子。模型是一组所谓的运行。运行是成对的序列,每对由一组已创建对象和一组事件组成。事件可以是发送或接收事件,或者是表示唯一标识的方法调用已结束的标记。
下面是 OCL+I 机构中运行满足不同类型句子的条件:
- **满足 OCL 前置/后置条件**:对于运行中的任意两对 \( (\omega_k, H_k) \) 和 \( (\omega
0
0
复制全文
相关推荐










