UML

到CORBA IDL的映射

 

1.0 beta 1版

1997年1月13日

 

 

 

 

 

2800 San Tomas Expressway

Santa Clara, CA 95051-0951

http://www.Rational.com

 

 

 

版权所有 1997瑞理软件(Rational Software)公司、MCI systemhouse公司以及Unisys公司。

本文档允许被影印、电子发行或被翻译为外语,如果完全复制本文档,请全文引用本提示,并包含下列声明:

通过环球网(WWW)地址 http://www.rational.com 可以得到统一建模语言(UML)的最近更新版本。

 

目录

1. 简介

2. UML及代码生成映射

3. 模型特征值

3.1 IDLfilename 标记

3.2 IDL源代码布局

4. IDL的生成

4.1 模块

4.2 界面

4.3 类型定义

4.4 枚举

4.5 异常

4.6 结构

4.7 常量

4.8 联合

4.9 属性

4.10 操作

5. 直接映射及标记小结

6. 附加映射及问题

 

1. 简介

本文档是瑞理(Rational)et al 对于OMG的OADTF RFP-1提议的一部分。完整的提议在 http://www.omg.org/member/doclist-97.html 下的文档ad/97-01-01到 ad/97-01-14中,OMG的成员可以从那里得到它。对UML的修改可在http://www.Rational.com/uml下找到。请把对本文档的反馈用电子邮件发送到 [email protected]

本文档描述怎样把基于统一建模语言 (UML) v1.0的模型映射到与它相关联的 CORBA 1.2 (或更迟版本) 接口声明语言(IDL)构件上。此处不包括IDL特定厂商的扩展。因此,这个UML-IDL映射适用于任何依从CORBA 1.2(或更迟版本)的ORB。

本文档是向对象管理组的UML提议的一部分。我们假定读者对UML语义1.0版(UML v1.0 Semantics)(此文档包含在提议文档集中)中的概念有基本的理解。

本文档内容与Rational RoseÔ 4.0中所实现的UML/IDL映射不同,后者是在UML1.0标准完成之前开发的。但是,两者的基本原理是一致的。预期在1997年4月中旬之前更新此文档。

2. UML及代码生成映射

UML的原理包括两点:1) 一个精确定义的核心元素的集合,它们对所有语言都统一适用;2) 一个扩展机制的集合,用于添加向具体语言的映射细节。

代码生成的主要的扩展机制是特征值。 在UML中,特征值能附加到任何模型元素, 在UML向IDL的映射中,有些就是用特征值来叙述的。在本文档中,特征值的名字或标记是以粗斜体的形式出现的。

3. 模型特征值

3.1 IDLfilename 标记

在默认情况下,UML/IDL对每一个IDL元素生成一个名为IDLfilename.idl的源代码单元。这里IDLfilename是一个特征值,指定要生成的源文件的名字。

作为任选项,我们可以通过在UML模型中把IDL元素指定到一个构件来使这些元素的代码生成到目标源文件中。这样可定义一个IDL模块接口的集合,并且把类(和其它类型)映射到这些接口。

3.2 IDL源代码布局

每一个IDL源代码单元具有如下格式:

// user defined header

// ...

#ifndef name_idl

#define name_idl

...

#endif name_idl


这里 name 是构件(模块)或类名字。

4. IDL的生成

UML/IDL完全支持CORBA 1.2 IDL的构件:模块、接口、结构、联合、类型定义、常量和异常。以下的各小节描述了怎样用UML/IDL生成这些构件。

4.1 模块

要生成一个IDL模块, 选择一个UML构件并产生其相应的IDL描述即可。这将生成如下格式的IDL模块:

module modulename

{

//...

}


在UML模型中,映射到某一模块上的项,如果其类标记IDL Element被置为’TRUE’,它就将在该模块定义中生成IDL元素。

4.2 接口

要生成一个基于类(或其它类型)的接口定义,需把类标记IDL Element的值置为‘TRUE’,把类标志值 ‘IDL Specification Type’置为 ‘Interface’。产生的IDL为如下形式:

interface classname {...}


该类的属性和操作将在界面定义中生成IDL的属性和操作,就象下面在‘属性’和 ‘操作’中定义的一样。

4.2.1 继承

如果一个IDL接口所基于的类是从UML模型中的某个基类导出的,这种继承将在生成的IDL代码中以如下形式反映出来:

interface derivedclassname : baseclassname {...}


多重继承的结果是产生一个以逗号分隔的基类名字的列表。

4.3 类型定义

要生成一个基于类的类型定义,置类标志值 ‘IDL Element’为‘TRUE’并置类标志值‘IDL Specification Type’为‘Typedef’。生成的IDL将有如下格式:

typedef type classname {...}


其中,‘type’的值由类标志‘Implementation Type’的值确定。

4.4 枚举

要生成一个基于类的枚举值的定义,置类的标志值 ‘IDL Element’为‘TRUE’并把类标志值‘IDL Specification Type’置为‘Enumeration’。生成的IDL将有如下形式:

enum classname {att1, att2, ...}


括号里的值是从类中定义的属性的名字生成的文本文字。

4.5 异常

要生成一个基于类的异常的定义,置类的标志值 ‘IDL Element’为‘TRUE’并把类标志值‘IDL Specification Type’置为‘Exception’。生成的IDL将有如下形式:

exception classname {...}

 

该类的属性将在异常定义中生成IDL的属性,就象后面在‘属性’中定义的一样。

4.6 结构

要生成一个基于类的结构定义,置类的标志值 ‘IDL Element’为‘TRUE’并把 类标志值‘IDL Specification Type’置为‘Struct’。生成的IDL将有如下形式:

structure classname {...}

 

该类的属性将在结构定义中生成相应的IDL属性,就象后面在‘属性’中定义的一样。

4.7 常量

要在一个接口定义的外部生成一个常量定义,就必须基于一个类(或其它类型)。把类标志值‘IDL Element ’和‘Is Const’都置为‘TRUE’。置类标志值‘Const Value’为常量表达式的值。这将生成如下形式的IDL:

const type classname = value;


type’被类标志值‘Implementation Type’的内容代替而‘value’被类标志值‘Const Value ’的内容代替。

4.8 联合

联合构件的映射目前还没有定义。

4.9 属性

生成接口、异常或结构的任何类(或其它类型)的每一个属性都将生成一个IDL 属性定义,只有一个例外(参见后面的 ‘Constant’)。缺省定义如下:

<readonly> attribute type attributename;


另外,生成接口、异常或结构的相关的UML角色也会生成IDL属性定义。

4.9.1 只读

只读参数的生成是由布尔属性标志值‘ReadOnly’控制的。对需要只读参数的属性,把它置为‘TRUE’。

4.9.2 类型

在模型中定义的属性的类型将被作为IDL的属性类型,但‘序列’属性定义的除外。

4.9.3 带有多于一个多重记号的属性

对于带有多于一个角色多重记号的UML关联,它们被映射到数组、序列或者潜在的集合容器。

4.9.3.1 数组

要把一个属性定义为数组,为它指定一个有限的多重记号并把它的‘BoundedHasRelType’ 特征值置为 ‘Array’。 这将生成如下的IDL:

<readonly> attribute type attributename[#];

4.9.3.2 序列

要把一个属性定义为有界序列,为它指定一个有限的多重记号并把它的‘BoundedHasRelType’特征值置为‘Bounded Sequence’。 这将生成如下形式的IDL:

<readonly> attribute sequence<type,#> attributename;n


要把一个属性定义为无界序列,为它指定一个无限的(’N’)多重记号。这将生成如下形式的IDL:

<readonly> attribute sequence<type> attributename;

4.9.4 常量

要在一个接口定义的内部生成一个常量必须基于一个属性。把该属性的特征值 ‘Is Const’置为‘TRUE’并且把属性的性质‘Const Value’置为常量表达式的值。这将生成如下形式的IDL:

const type attributename = value;


value’ 被属性特征值‘Const Value’的内容代替。

4.10 操作

生成接口的任何类的每一个操作都将生成一个IDL操作定义,其形式如下:

<oneway> type operationname (parameters) <raises (...)> <context (...)>;

4.10.1 单向

‘单向’(’Oneway’)参数的生成是由布尔型操作标志值‘OperationIsOneWay’控制的。其缺省值是’FALSE’,对需要单向参数的操作,把它置为‘TRUE’。

注: 单向操作的类型必须是‘void’并且没有访问控制为‘out’或者‘inout’的参数。

4.10.2 类型

在操作规格说明中定义的返回类型将作为IDL的操作类型。

4.10.3 参数

操作规格说明中定义的每个参数产生一个操作的参数定义。如下:

access type parametername

4.10.3.1 访问控制

每个参数的访问控制必须是‘in’,‘out’,或者 ‘inout’。 参数的访问控制类型由操作特征值 ‘InOutParams’指定。此标志的值应当是用逗号(不允许有空格)隔开的文本文字的一个列表。其缺省值是‘in’。列表中的每一个文字都应当是上述三个访问控制值之一。列表中的第一个文字对应于操作的第一个参数,第二个文字对应于第二个参数,等等。有几个参数,就有几个文字。

4.10.3.2 类型

在参数规格说明中定义的类型将被用来作为IDL的参数类型。

4.10.4 引发异常

如果一个操作需要‘raises’子句,它的‘RaisesExc’ 特征值应当非空。生成的‘raises (...)’子句的括号之间将用‘RaisesExc’ 特征值的内容填入。

4.10.5 操作上下文

如果一个操作需要一个‘context’子句,则它的 ‘Context’ 特征值应当非空。生成的‘context (...)’子句的括号之间将用‘Context’ 特征值的内容填入。

5. 直接映射及标记小结

下表总结了从UML元素到IDL构件的映射。中间的一列给出相关的UML性质(即在UML元模型中的一个属性或关系)或标志。

 

UML 模型 元素 UML 性质 标记 IDL构件
模型 IDLFilename IDL文件名
类(或其它 类型) 名字实现类型,如果非空的话 接口、类型定义、枚举、异常或结构的名字
  IDL Specification Type 接口 如果 = ‘Interface’

类型定义 如果 = ‘Typedef’

枚举 如果 = ‘Enumeration’

异常 如果 = ‘Exception’

结构 如果 = ‘Struct’

联合 如果 = ‘Union’

     
  一般化类的名字 基类名字
  IDLElement 只有当 = ‘TRUE’时才生成IDL
  Is Const 常量 如果 = ‘TRUE’
  Const Value 常量的值
构件 IDL Element  
  IDLFilename IDL文件名
属性 类型的名字 属性类型
  ReadOnly 只读 如果 = ‘TRUE’
  Is Const 常量 如果 = ‘const’
  Const Value 常量值
角色 角色的名字 属性名
  isReadOnly 只读 如果 = ‘TRUE’
  BoundedRoleType 数组 如果 = ‘Array’

序列 如果 = ‘Bounded Sequence’

操作 操作的名字 操作名
  OperationIsOneWay 单向 如果 = ‘TRUE’
  返回类型的名字 返回类型
  RaisesExc 引发
  Context 上下文
操作参数 参数的名字 参数名
  InOutParams 访问控制类型
  类型的名字 类型

 

6. 附加映射及问题

除了直接映射,还可以声明附加的导出映射,包括以下内容:

get and set访问子(accessor)操作

基于关系的收集和重复子(iterators)

一个类关联的导航操作


除了上面介绍的(导出映射),尚未解决的问题还有:

必须消除IDL模块间的循环依赖关系

由一个特定的构造型隐式的指定特征值的方法应当被说明