内容


使用 Rational Software Architect 进行 C++ 转换的提示和技巧,第 4 部分

Rational Software Architect 标准版用户指南

适用于 Rational Software Architect Standard Edition(标准版)用户

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 使用 Rational Software Architect 进行 C++ 转换的提示和技巧,第 4 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:使用 Rational Software Architect 进行 C++ 转换的提示和技巧,第 4 部分

敬请期待该系列的后续内容。

下载试用版:Rational® Software Architect for WebSphere | Rational® Software Architect 标准版
获取免费的 Rational 软件工具包系列,下载更多的 Rational 软件试用版

处理 C++ 转换中的 STL 类

在 IBM® Rational® Software Architect Standard Edition 中,您可以在设计您的模型时使用包含的 Standard Template Libraries。出于这一点考虑,您应该拥有和 Rational Software Architect Standard Edition 相集成的一些库。在本文中的例子中,您可以将 Cygwin当做集成的环境。

为了将 Standard Template Library(STL)类加入您的模型中,您可以按照下面的步骤来进行操作:

  1. 确定您已经安装过了 Cygwin。
  2. 创建一个 C++ 项目,您可以在 Includes 目录中看到它,如图 1 所示。
图 1. 含有目录的 C++ 项目
含有 C++ 项目之下目录的 Cygwin
含有 C++ 项目之下目录的 Cygwin
  1. 创建一个模型项目。
  2. 在 C++ 项目中打开包含的目录,并找到 stl_list.h 文件,如图 2 所示。范例的位置:
    <cygwin>/lib/cc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_list.h.
图 2. 扩展的 stl_list.h 文件
展开 stl_list.h 文件与列表声明
展开 stl_list.h 文件与列表声明
  1. list 声明拖拉到模型图表中,以创建一个可见的元素(对实际 list 声明的一个快捷访问路径)。
  2. 创建一个 Binding 类(BindingClass),它与带有其他类(ParamClass)的 STL::list 模板相联系
    注意:
    您刚刚创建的 BindingClass 是一个以模板实现的类,在所有您需要使用 STL 类(STL::list)的地方,您都会使用到该类。对于模型中需要包含的每一个 STL 类,您都需要创建一个 Binding 类,并与其他的模型元素一起使用,而不是直接地使用 STL 类。
  3. 为了指定绑定的参数,您可以在主图表中选择绑定的箭头,然后选择 Properties > General 项。
  4. 选择 _Tp 参数,然后点击 Browse 按钮以选择 ParamClass 作为绑定的参数(见于图 3 和图 4)。
图 3. 指定绑定的参数
显示 bound _Tp 参数的 Properties 视图
显示 bound _Tp 参数的 Properties 视图
  1. 创建另外一个类(MyClass),并创建一个从 MyClassBindingClass直接联系
图 4. 含有 Binding 类及 STL 类的模型图
BindingClass 绑定类声明
BindingClass 绑定类声明
  1. 现在创建一个从 UML 到 C++ 的转换,并将该模型配置成源,C++ 项目配置成目标。
  2. 运行该转换。

BindingClass 被转换为一个 typedef 元素,然后您会得到一个 MyClass 中带有 ParamClass 的 list ,您可以拥有任意类型的 list

处理通用的变量和方法

尽管面向对象的建模仅仅只会处理类及对象,但是 C++ 域内的建模能够支持非面向对象的元素,例如通用的变量及宏。它并不仅仅支持合法的代码,而且还适用于一些无法避免的环境,并且在一些特定的环境下简化这些结构。

Rational Software Architect 对建模通用变量和通用函数提供了有限的支持。

对通用方法建模

让我们看一下怎样对一个通用函数建模的范例,使用 parse_line()作为例子。

  1. 创建一个模型项目,并添加该项目内的一个模型。
  2. 再添加一个类和该类中的一个属性和方法。
  3. 添加另外一种方法,并将其命名为 parse_line,其两个输入参数为 — lineargv — 以及一个 int 的返回参数(见于图 5)。
图 5. 使用通用方法建模的项目
一个类 MyClass 包含了一个操作 parse_line()
  1. parse_line() 方法应用 cpp_operation 构造型,如图 6 所示。
  2. Stereotypes 项内,将 isGlobal构造型属性设置成为 True
图 6. 对通用方法应用一个构造型
将 isGlobal 属性设置成 True 的构造型
将 isGlobal 属性设置成 True 的构造型

至此,您已经成功地对一个通用方法建模。

将一个通用方法转换为一个 C++ 项目

按照下面的指南,来将一个通用方法转换为一个 C++ 项目:

  1. 创建一个转换,并将您刚刚创建的项目设置成源以及一个新的 C++ 项目,如图 7 所示。
图 7. 前面转换配置
 Transformation 配置的源与目标
Transformation 配置的源与目标

注意:
在处理转换时最好激活追踪关系。出于这点考虑,在转换配置中,如果您使用的是 Rational Software Architect Standard Edition 7.5.4 版本的话,切换至 Main 项(如果您使用的是 Rational Software Architect Standard Edition 7.5.4 早期的版本或者 Rational Software Architect Standard Edition RealTime Edition 7.5.4 版本的话,就切换至 Common tab 项),并确保 Create trace relationships 已经被选中了。

  1. 运行转换配置以将模型转换为 C++ 项目。

代码清单 1 显示了该模型生成的代码。

清单 1. 转换的代码
#ifndef MYCLASS_H
#define MYCLASS_H
//Begin section for file MyClass.h
//TODO: Add definitions that you want preserved
//End section for file MyClass.h

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
intparse_line(); 


//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class MyClass
{

    //Begin section for MyClass
    //TODO: Add attributes that you want preserved
    //End section for MyClass

   public:

};  //end class MyClass

#endif

通用的 parse_line() 方法作为 MyClass类外部的一个通用函数生成。

通用方法及变量的逆向转换

下面让我们来看一下怎样来将通用方法进行逆向转换。

代码清单 2 和 3 显示了 C ++ 项目中的头文件及源文件(Parser.h 及 Parser.cpp)。

清单 2. 通用函数的代码 Parser.h
	#ifndef PARSER_H
	#define PARSER_H

	int parse_line(char * line, char * argv[]);

	#endif
清单 3. 通用函数的代码Parser.cpp
	#include "Parser.h"

	int parse_line(char * line, char * argv[])
	{
		return 0;
	}

按照下面的步骤来进行逆向转换:

  1. 创建一个转换,其中将源配置为含有 Parser.h 及 Parser.cpp 文件的 C++ 项目,并将目标配置为一个新的 UML 模型,如图 8 所示。
图 8. 逆向转换配置
 Transformation Configuration 的源与目标
Transformation Configuration 的源与目标
  1. 运行从 C++ 到 UML 的转换。在该转换的结尾,选择互动性的 Merge 窗口(见于图 9)。
图 9. Merge 模型对话框
 Merge Dialog 中的 Temporary 及 Target 模型
Merge Dialog 中的 Temporary 及 Target 模型
  1. 该窗口显示了转换推荐形式的到目标模型的变更。
  2. 通过点击 OK 来接受变更。

图 10 显示了对模型所做的变更。

图 10. 使用通用方法更新后的模型
带有通用方法的 Target 模型

在 UML 到 C++ 转换中处理映射的模型

源 UML 模型中的逻辑结构在有些场景中可能并不是合适的源。同样,在给定的平台上元素的名字可能并不是合适的。

这就是映射模型面临的情况。在一个映射模型中,您可以具体地指定一个 UML 元素应该映射到目标项目中的什么地方,以及它的名字。

图 11 显示了达到这个目标所需要进行的操作步骤:

  1. 创建一个新的模型及 C++ 项目
  2. 添加两个包( Package1Package2 )到模型中。
  3. 添加一个带有属性( name )及操作( getName())的 Class1 类到 Package1 中。
  4. 与之类似,添加一个带有属性( id )和操作(getId())的 Class2 类到 Package2 中。
图 11. 新的 UML 及 C++ 项目
含有两个包及包中元素的模型
  1. 创建一个配置为您刚刚创建的模型及 C++ 目标项目的转换,如图 12 所示。
图 12. 新的 UML 到 C++ 转换配置
转换配置的源与目标
转换配置的源与目标
  1. 切换至您新创建转换配置的 Mapping 项..
  2. 选中 Enable the mapping functionality for this configuration
  3. 点击映射模型文件名字旁边的 New ,或者点击浏览按钮(…)来选择一个已存在的映射模型,来创建一个新的映射模型,如图 13 所示。
图 13. 创建一个新的映射模型
转换配置的 Mapping 项
转换配置的 Mapping 项
  1. 现在,您已经创建了一个映射模型,该模型呈现了 UML 元素是怎样映射为 C++ 项目的。现在,您可以点击 Edit Mapping 以打开“编辑映射的名字”窗口,来指定任意元素的映射路径及名字。
  2. 展开 UML 元素,并点击一个元素,以指定您想要的映射路径或者名字(查看接下来的屏幕截图)。您可以为路径或者映射的名字选择其中任意的一个:
    1. 一个绝对路径(与 UML 模型根元素相关)
    2. 一个元素的相对路径(与元素相关)
    3. 一个映射的名字,如图 14 所示

如果您指定了含有多个文件夹的路径(可能会也可能不会与 UML 元素对应),那么转换会创建更加复杂的层级结构。有些无效的路径(例如,含有无效字符目标项目之外的路径)可能会被删除,与之相反考虑的是默认的路径。

图 14. 编辑映射的模型
Model 元素及其映射的名字
Model 元素及其映射的名字
  1. 点击 OK 以保存更新后的映射模型。

在您保存转换配置以后,您就可以开始转换模型了。

  1. 运行转换配置,以生成含有映射路径的 C++ 代码,如图 15 所示。
图 15. 转换之后的 C++ 项目
C++ Project 包含了生成的代码

浏览包中文件夹创建的过程

默认条件下,所有的包都被转换成了文件夹。

  1. 为了防止转换生成与特定包相对应的文件夹,您可以将包的映射路径设置成:(时期,如图 16 所示)
图 16. 将路径映射为包的文件夹生成过程
UML Packages 映射的名字为 (.)
UML Packages 映射的名字为 (.)
  1. 运行含有该映射模型的从 UML 到 C++ 的转换。

转换并不会生成与 UML 包(Package1 和 Package2)相对应的文件夹,如图 17 所示。

图 17. 不含包中文件夹的 C++ 项目
C++ Project 包含了生成的代码

您学到的内容

在本文中,您学到了以下的一些步骤:

  • 处理 STL 类
  • 处理通用变量和方法
  • 处理映射的模型

相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=492224
ArticleTitle=使用 Rational Software Architect 进行 C++ 转换的提示和技巧,第 4 部分: Rational Software Architect 标准版用户指南
publish-date=03312010