您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
业务架构设计
4月18-19日 在线直播
基于UML和EA进行系统分析设计
4月25-26日 北京+在线
AI 智能化软件测试方法与实践
5月23-24日 上海+在线
     
   
 
 订阅
使用 IBM Rational Systems Developer 和 Rational Software Architect
实现 UML 与 C++ 的转换
 
作者:Sandeep Kohli,Sreerupa Sen
   次浏览      
 2014-01-15
 
编辑推荐:
本文主要采用Rational Rose UML柔性开发模型Java开发环境的建立与软件设计是一种高效快捷的软件开发方法,希望可以让大家有个新的认识。
本文来自于IBM,由火龙果软件Alice 编辑、推荐。

本文内容包括:

学习如何使用 IBM® Rational® Software Architect 和 Rational® Systems Developer 工具将 UML 建模适于开发 C++ 应用程序。本文描述了7.0版本支持 C++ 领域建模的特性。在此,假设您正在不断更新模型和代码,并且想要实现 UML 与 C++ 之间的对应修改。那么您只需要拥有 UML 的基本知识,了解本文中介绍到的 Rational 软件产品,掌握如何运行转换以及如何应用概要文件和构造类型,就可以达到您的目的。

通过本文的姊妹篇 “使用 Rational Systems Developer 和 Rational Software Architect 进行 C++ 转换的技巧” 了解从 UML 模型生成 C++ 代码的方法与技巧。

条件及过程概述

本文解释了作为一名 C++ 开发人员,如何在使用统一建模语言 UML 建模的时候,继续使用 C++ 数据结构进行设计。您只需掌握 UML、IBM® Rational® Software Architect 和 IBM® Rational® Systems Developer 的相关基本知识即可。

  1. 在 IBM Rational Systems Developer 创建一个简单的 UML 模型。
  2. 将一个 C++ 概要文件应用在模型上,这样,就可以在建模的过程中使用 C++ 的数据结构。
  3. 将 C++ 类型库导入模型,这样,就可以使用 C++ 基本类型。
  4. 生成代码。
  5. 在类中添加方法体。
  6. 另外提供一些小技巧,以便在重复进行转换时保存代码和模型的修改。

创建一个简单的 UML 模型

UML 概要文件是扩展 UML 的一个标准机制,所以对某些特定领域的建模可以在不增加 UML 负担的情况下进行。UML 的创始人不可能涉足到所有的应用领域,因而,他们明智地提供了扩展机制。

应用 C++ 概要文件

例如,要对某个 C++ 具体的元素建模,比如 struct、union、typedef 等,您需要在 UML 模型上应用 C++ 概要文件。步骤如下:

  1. 确定您正处于Modeling透视图。
  2. 选中模型,然后单击Properties视图。
  3. 在Propertiesview 左侧,从列表中选择Profiles。
  4. 单击 Add Profile,在Select Profile对话框中Deployed Profile下方选择C++ Transformation(如图1和2所示)。

图1. 应用 C++(CPP)概要文件

Figure 1. Steps in applying the C++ (CPP) profile

图2. 选择 C++ 概要文件

Figure 2. Selecting the C++ profile

导入 C++ 类型库

UML 提供了一组预定义的类型,有 Boolean、Integer、String UnlimitedNatural。而大多数的编程语言,包括 C++,提供了更为丰富的基本类型。在 C++ 中建模的时候,您可能经常需要使用 C++ 预定义的基本类型(比如,将一个类型赋给某个属性、参数、操作返回类型,等)。下面讲述如何导入 C++ 模型库:

  1. 在Project Explorer中右键单击 UML 模型。
  2. 如图3所示,选择Import Model Library。

图3. 导入 C++ 类型库

Importing C++ Type Library

  1. 如图4所示,在Import Model Library的运行界面上,从下拉列表框中选择C++ Types。

图4. 选择要导入的 C++ 类型库

Selecting C++ Type Library

现在已经作好为 C++ 特定元素建模的准备了。请接着参看后面的示例。

创建一个简单的 UML 模型,car factory。

创建如图5所示的 UML 模型。创建的过程如下所示:

  • 这个示例模型中,Bus和Car的基类是Vehicle。
  • Bus、Car和Vehicle类被创建在一个名为 Vehicles的 UML 包中。
  • 同样的,在名为Parts的包中,建立Engine和Wheels类。
  • Car与Engine之间存在组合的关系。
  • 理论上,Car和Engine是不可分的,因为汽车需要引擎。
  • Car和Bus与Wheels都有聚合的关系。
  • 本例中,轮胎可以没有汽车而存在,汽车可以没有轮胎而存在 -- 至少在组装的时候。

图5.一个简单的汽车工厂 UML 模型的示例

Figure 5. Simple UML model of a car factory used here as an example
在模型中创建 C++ 元素

  1. 接下来,创建一个名为 Strategy 的 UML 包。
  2. 在 Strategy,定义公共汽车的路线和起点。
    1. 创建一个名为 Route 的类,用来表示路线;一个名为 Address 的类,用来表示地址,比如公共汽车路线的起点。
    2. Address 需要是 C++ struct 元素而不是普通的类。
  3. 为 UML 模型指定每个公共汽车的路线。如图6所示,您可以为 Vehicles 包中的 Bus 类和 Route 类之间设置聚合关系。
  4. 起始点是路线的一个属性。所以,为 Route 类增加一个类型为 Address,名称为 startingPoint 的属性。

图6. 名为 Strategy UML 包的内容

Figure 6. Contents of the new UML package called Strategy
在图6中,请注意

Address是 <<cpp_struct>>类。创建的步骤如下:

  1. 创建一个 UML 类,命名为 Address。
  2. 将 cpp_struct 原型应用给新建立的类。
    1. 将一个原型应用给 UML 元素,转到Properties视图。
    2. 如图7所示,从左侧的列表中选择Stereotypes,然后单击Apply Stereotypes。

图7. 应用一个原型

Figure 7. Applying          a stereotype

  1. 从该元素可用的原型列表中选择cpp_struct。同时,也可以留意一下其它的选择,以备日后参考。

您很快就能发现,将这个模型转换成代码的时候,带有<<cpp_struct>>原型的 Address 类将会生成一个 struct 元素,而不是一个类。

配置转换并生成代码

在由模型生成 C++ 代码之前,需要通过创建转换配置来设置相应的参数。

创建转换配置

步骤如下:

  1. 单击File > New > Others,然后选择Transformations文件夹中的transformation configuration。
  2. 在New Transform Configuration向导中,指定配置文件名,此处命名为 tc1。
  3. 选择transformation type和project。
    1. 展开IBM Rational Transformations列表,然后选择转换类型UML to C++。
    2. 本练习中,使用已有 UML 模型项目来保存转换配置文件。
  4. 单击Next,继续进行后面的步骤。
  5. 在Source and Target选项卡中:
    1. Source:选择 UML 模型。
    2. Target:创建一个新的 C++ 项目。
  6. 请确定source和target都是选中的,然后单击Finish。

注: 如果需要,您可以再对转换配置进行修改。

生成代码

之后的步骤就比较简单了。

  1. 进行到现在,您已经完成了大部分比较难的工作,接下来,只需右键单击tc1.tc,然后从弹出式菜单中选择Transform > UML to C++,就可以在选定的项目中生成代码。
  2. 看一下 Route 类生成的代码。如列表1所示,它包括 startingPoint 和 endingPoint 属性,以及 getFare() 方法。

列表1. Route 类生成的代码文件 Route.h
 

                

#ifndef ROUTE_H
#define ROUTE_H
//Begin section for file Route.h
//TODO: Add definitions that you want preserved
//End section for file Route.h

struct Address;

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

    private:
  //@uml.annotationsderived_abstraction="platform:/resource/UML-1/
DWArticle-1.emx#_Hk7qMACuEdy9t-_gdCbefQ"
        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        float runningCost;

	  //@uml.annotationsderived_abstraction="platform:/resource/UML-1/
DWArticle-1.emx#_hKd58ACuEdy9t-_gdCbefQ"
        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        float expectedProfit;

	  //@uml.annotationsderived_abstraction="platform:/resource/UML-1/
DWArticle-1.emx#_ieiw8ACuEdy9t-_gdCbefQ"
        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        Address * startingPoint;

	  //@uml.annotationsderived_abstraction="platform:/resource/UML-1/
DWArticle-1.emx#_jkEOkACuEdy9t-_gdCbefQ"
        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        Address * endingPoint;
    public:

	  //@uml.annotationsderived_abstraction="platform:/resource/UML-1/
DWArticle-1.emx#_kawmAACuEdy9t-_gdCbefQ"
        //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"

        float getFare()const ;

};  //end Class Route

#endif    
      

如列表2所示, getFare 方法的默认内容已经生成。

列表2. Route.cpp
 

                
#include "Route.h"
//Begin section for file Route.cpp
//TODO: Add definitions that you want preserved
//End section for file Route.cpp


float Route::getFare() const 
{
    //TODO Auto-generated method stub
    return 0;
}    
      

修改代码

请注意,默认生成的内容一般不能够直接使用,因为 fare 总是0(zero),而这并不是一个有利的业务!所以需要将 getFare 方法的内容用列表3来代替。

列表3. Route.cpp
 

                
float Route::getFare() const 
{
    // Calcualte the fare
    return runningCost * expectedProfit;
}

开发模型并再次运行转换

现在,在UML模型中为 Route 类添加另一个名为 print_disclaimer() 的方法。

  1. 设置返回类型为String。
  2. 请注意,我们已为 getFare 方法添加内容,修改了Route.cpp文件。
  3. 使用相同的配置 (tc1.tc > Transformation > UML to C++)运行转换。
  4. 选择目标文件自动更新(默认选项)。

现在,一起来看看更新的代码(列表4)。

列表4. 更新的 Route.cpp


 
                
#include "Route.h"
//Begin section for file Route.cpp
//TODO: Add definitions that you want preserved
//End section for file Route.cpp


float Route::getFare() const 
{
    // Calcualte the fare
    return runningCost * expectedProfit;
}

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
const char * Route::print_disclaimer() 
{
    //TODO Auto-generated method stub
    return 0;
}
      

请注意,修改的 getFare() 方法体已被保存。同时,模型中新添加的 print_disclaimer 方法已在 Route.h 和 Route.cpp 文件中生成新的代码。这样,您可以继续在代码中执行方法,同样地,可以对模型作增量修改。这在模型驱动迭代开发中相当有用的。

将 include 声明添加到保存节中。

print_disclaimer 方法体的代码如图5所示。请注意,我们使用了 cout 操作符,但 C++ 不能够识别。然而,代码是否能够正确解析,这是相当重要的,所以当转换再次执行的时候,应当将代码结构和方法体保存下来。如果想使这段代码可编译,您需要在 cpp 文件中添加 #include <iostream> 和 using namespace std;。当重复执行 UML 与 C++ 转换的时候,这些声明将会被保存下来。把这些声明插入到以下两条注释之间:

//Begin section for file Route.cpp
//End section for file Route.cpp
 

您添加到这个节中的内容将一字不漏地保存下来, 并且不需要 C++ 转换解析。

列表5. Route.cpp


                
#include "Route.h"
//Begin section for file Route.cpp
#include <iostream>
using namespace std;
//End section for file Route.cpp


float Route::getFare() const 
{
    // Calcualte the fare
    return runningCost * expectedProfit;
}

//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
const char * Route::print_disclaimer() 
{
    const char *s = "No Refund once the ticket is purchased\n";
    cout << s;
    return s;
}
      
 

下载:

  • UML 模型和 C++ 项目示例:选择File > Import,然后按照Import Existing Projects into Workspace向导的提示操作,就可以将项目导入到 Eclipse 工作空间。

小结

本文讲述了使用 Rational Systems Developer 创建 UML model,然后生成 C++ 代码的基本步骤,以及保持代码与模型同步的方法。想要了解更多的信息,请参阅相关的链接资源。

参考资料

学习

获得产品和技术

讨论

 

   
次浏览       
 
相关文章

UML概览
UML图解:用例图(Use case diagram )
UML图解:活动图(activity diagram )
UML图解:类图(class diagram )
UML图解:对象图(object diagram)
UML图解:顺序图( sequence diagram )
 
相关文档

UML统一建模语言参考手册
网上商城UML图
UML建模示例:JPetStor
UML序列图编写规范
EA中支持的各种图表
EA中的界面原型建模
 
相关课程

UML与面向对象分析设计
UML + 嵌入式系统分析设计
业务建模与业务分析
基于UML和EA进行系统分析设计
基于模型的需求管理
业务建模 & 领域驱动设计

最新活动计划
业务架构设计与建模 4-18[北京]
DeepSeek大模型开发实践 4-19[在线]
基于 UML 和EA进行分析设计 4-26[北京]
产品经理与产品管理 5-8[上海]
AI智能化软件测试方法与实践 5-23[上海]
图数据库与知识图谱 5-22[北京]
 
 
最新文章
在EA中内嵌文档- Artifact
EA中模型视图
EA中的实体关系图
使用EA进行风险建模
EA中的项目词汇表
EA的模型导出或导入csv文件
自定义表格(Custom Table)EA中使用
Gap Analysis Matrix(差距分析矩阵)
更多...   
MBSE工具
MBSE平台
建模工具 EA
模型库-Model Center
需求管理-ReqManager
自动建模-Modeler
多级仿真-Sys Simulator
代码工程-Code Engineer
文档生成器-DocGenerator
更多...   
成功案例
广汽研究院 SysML+EA+软件分析设计
高合汽车研发部门 建模工具EA、WebEA、
国汽智联 建模工具EA、模型库、WebEA
亿咖通 MBSE工程体系与工具链咨询
中航无人机 MBSE工具链
吉利汽车 购买EA工具
华科汽车零部件 购买EA工具
东风岚图汽车 购买EA工具 以及EA定制开发
更多...