如何用rational 类图software architect导出类图

IBM RSA IBM rational software architect
V8 学习之六 C++类模板设计_博客园
当前位置: >
>IBM RSA IBM rational software architect
V8 学习之六 C++类模板设计
IBM RSA IBM rational software architect
V8 学习之六 C++类模板设计
& 作者:凌空11腿 & 来源: 博客园-lonelyxmas &
原文http://blog.csdn.net/ztz0223/article/details/7603041
前面已经讲述过了IBM RSA (IBM rational software architect ) V8(具体版本V8.04),建模使用的一些操作,具体可以参考如下链接:
整个的文章关于C++的类图建模的东西也差不多了,面向对象的三大特征:封装、继承和多态,都差不多了,类图自然就是描述封装了,继承前面一讲也说了,多态的话后续会做一个GOF的设计模式系之一的描述吧。
今天说说C++的一个很重要的特征--模板,同时附带着涉及一下命名空间(namespace)。
模板的建模,估计是最简单的了。
废话不多说了,开始吧:
1、还是在之前的项目上面进行,之前已经建立了一个类继承图了,如下:
在图上标柱出来了,黄色矩形区域就是RSA里面说的包了,在C++里面叫做名字空间。
2、新建一个包,名叫template_space,修改构造型为cpp_namespace类型,然此文来自: 马开东博客
转载请注明出处 网址:
后在“属性”的”高级“里面输入名字空间名字也为template_space:
再看修改名字空间的截图,如果不做这一步,你的命名空间代码将是没有名字的,也就是匿名的命名空间:
3、选择包(namespace),右键添加类图,命名为“temp_class_diag”
4、添加后在,资源管理器,在包下面就有了相应的命名空间和类图:
5、在类图里面添加一个类命名为class_temp:
6、把class修改为cpp_property类型,鼠标放在类class_temp上面,右键--&&添加UML&--&&模板参数&,如下:
7、选择类,修改名字为xx,同时在类里面添加变量,m_xx_temp,选择变量类型为模板xx:
8、保存工程,生成C++代码。相应的C++代码就OK了。代码如下:
#ifndef&CLASS_TEMP1_H&&
#define&CLASS_TEMP1_H&&
//Begin&section&for&file&class_temp1.h&&
//TODO:&Add&definitions&that&you&want&preserved&&
//End&section&for&file&class_temp1.h&&
namespace&template_space&&&
&&&&//@generated&&UML&to&C++&(com.ibm.xtools.transform.uml2.cpp.CPPTransformation)&&&
&&&&template&&class&xx&&&
&&&&class&class_temp&&
&&&&&&&&//Begin&section&for&::class_temp1&&
&&&&&&&&//TODO:&Add&attributes&that&you&want&preserved&&
&&&&&&&&//End&section&for&::class_temp1&&
&&&&&&&&private:&&
&&&&&&&&&&&&//@generated&&UML&to&C++&(com.ibm.xtools.transform.uml2.cpp.CPPTransformation)&&&
&&&&&&&&&&&&xx&m_xx_&&
&&&&};&&//end&class&class_temp&&
}//end&namespace&&&
周末了,哈哈,累死了。
其实我非常懒的,不是怕自己忘记,真不会写这些,很多都是我自己琢磨出来的,也琢磨了很久哦,IBM RSA的相关的书籍都是V7版本或者之前的,也很少提及C++相关的操作。
还有转载请提及出处!
最后还是一句:一切都是如此美好,哈哈。
相关阅读:
来源:(微信/QQ:,微信公众号:makaidong-com) &&&&&& 欢迎分享本文,转载请保留出处!
&&&&&& 【原文阅读】:
上一篇:没有了
【相关文章】
每日最新文章
C#制作高仿360安全卫士窗体
每日最热文章
本周最热文章
本月最热文章
C#制作高仿360安全卫士窗体
本年最热文章
Powered by
Copyright &
, All Rights Reservedrational software architect rsa9.0 逆向工程android源码生成序列图和类图
rational software architect rsa9.0 逆向工程android源码生成序列图和类图
发布时间: 17:35:02
编辑:www.fx114.net
本篇文章主要介绍了"rational software architect rsa9.0 逆向工程android源码生成序列图和类图",主要涉及到rational software architect rsa9.0 逆向工程android源码生成序列图和类图方面的内容,对于rational software architect rsa9.0 逆向工程android源码生成序列图和类图感兴趣的同学可以参考一下。
转自:,个别地方进行了修改
我见过相当多的用来说明在程序中如何使用从DLL中输出的class的代码,但这些方法都是通过隐式链接完成的。回忆一下DLL的概念,有两种方法可以使用DLL中输出的函数:一是在程序代码中简单地引用DLL中符号,这使得加载器在程序启动时隐式地加载(链接)所需的DLL,这就是众所周知的“隐式链接”。
第二种方法就是在程序运行过程中显式地加载所需的DLL(使用LoadLibrary())并且显式地链接到需要的输出符号。换句话说,如果程序要调用DLL中的一个函数,可以显式地加载一个DLL到她的进程地址空间,然后获得函数在DLL中的虚拟内存地址,并利用这个地址来调用函数。这种方法的优美之处就在于所有的工作都是在程序运行过程中完成的,并且程序可以从进程地址空间中卸载不再需要的DLL。这种方法就是“显式链接”。
前面窝已经介绍了函数的调用方法,但是怎么使用输出类呢?对于隐式链接的DLL,调用类和调用函数没有什么区别;而在一般情况下,想要显示加载DLL并使用其中的类是不可能的。但是我写这篇文章并不是为了告诉你为什么这不可能,而是要告诉你如何来实现它。对了!就是使用LoadLibrary()。
在继续下文之前我想告诉你,以下的代码很粗糙,如果你准备将其用于你的项目中,请先征得你老板的同意。但是这些代码不仅用于让你加深理解,在实在没有办法的情况下也不失为一种极端的解决方法。
在示例代码中,我创建了一个名为Calc.DLL计算器DLL,并在一个名为UserOfcalc的命令行程序中使用其提供的计算功能。
// Calc.DLL包含了一个名为CCalc的输出类
它包含3个方法,分别是 Add、Sub和GetLastFunc()
// CALC.H – CCalc类声明
class CALC_API CCalc
TCHAR m_szLastUsedFunc[SOME_INSTN_BUF];
&&& CCalc ();
&&& int Add (int i,
&&& int Sub (int i,
&&& TCHAR* GetLastUsedFunc ();
DLL的实现部分在文件Calc.cpp中:
BOOL APIENTRY DllMain (HANDLE, DWORD, LPVOID)
&&& return TRUE;
构造函数,初始化m_szLastFuncCalled数组
CCalc::CCalc ()
&&& memset (m_szLastUsedFunc,
0, sizeof (m_szLastUsedFunc));
&&& strcpy (m_szLastUsedFunc,
&No function used yet&);
int CCalc::Add (int i,
&&& strcpy (m_szLastUsedFunc,
&Add used&);
&&& return (i + j);
int CCalc::Sub (int i,
&&& strcpy (m_szLastUsedFunc,
&Sub used&);
&&& return (i - j);
现在,通过以下步骤可以显式地加载DLL并使用Calc类中提供的函数:
第一步是使用LoadLibrary将Calc.DLL加载到你的程序中。
HMODULE hMod = LoadLibrary (&Calc.dll&);
if (NULL == hMod)
&&& printf (&LoadLibrary failed/n&);
&&& return1;
因为你有Calc.DLL的头文件,所以下一步就是分配一个与类大小匹配的内存块,然后调用构造函数代码。
CCalc *pCCalc = (CCalc *) malloc (sizeof (CCalc));
if (NULL == pCCalc)
&&& printf (&memory allocation failed/n&);
&&& return1;
但是在C++中我们为什么要使用malloc而不用new呢?这是因为new操作符会调用CCalc's的默认构造函数,而我们根本访问不到它。记住,我们必须要动态地加载DLL,因此在build时没有定义CCalc类的构造函数。
因此,我们仅仅获得了一块与CCalc类大小相等的未初始化的内存。
如果你使用Dumpbin.exe(位于Microsoft Visual Studio/VC98/Bin文件夹下)来查看输出函数,你会看到DLL的一个输出函数列表(我已经使用一个DEF文件修复了函数名)。如下图所示:
列表包含了函数Add,
Sub, GetLastUsedFunc和构造函数的虚拟内存地址。
前面我们已经获得了一块内存,现在必须调用构造函数对其进行初始化,所以我们要获取构造函数在DLL中的相对虚拟地址(RVA)。
PCTOR pCtor = (PCTOR) GetProcAddress (hMod,
&CCalc&);注:这里也许需要.dll文件中CCalc函数的实际名称,具体查询方法可以参考:
if (NULL == pCtor)
&&& printf (&GetProcAddress failed/n&);
&&& return1;
PCTOR是一个在UserOfCalc.cpp中定义的函数指针,其定义代码如下:
typedefvoid (WINAPI * PCTOR) ();
现在有了构造函数的地址,接下来就应该要调用它来初始化前面用malloc分配的那块内存。但怎样才能使一个对象和这个构造函数关联起来呢?
如果你还记得,当任何成员函数(包括构造函数)被调用时,对象的地址会自动传递到被调用函数,而且这个地址存储在栈中。在基于Intel的机器上,这个对象地址通过ECX寄存器被压入栈顶,所以当你创建一个类并调用其成员函数时,ECX寄存器包含‘this’指针。下面的截图会使问题清晰一点。
你应该注意到汇编窗口中当前执行指令
LEAECX, [EBP-4]
完成时,ECX和‘&bmw’的值是相同的。在不同的处理器架构的机器上,使用的寄存器可能不是ECX,这里只是举例说明。
回到我们的Calc.dll,已经有了内存块(以后的对象)的地址,现在用内嵌汇编语句将这个地址拷贝到ECX寄存器:
MOVECX, pCCalc }
现在我们已经获得了构造函数的地址,只须要:
当你的函数指针pCtor()从DLL中返回时,它已经完成了该对象的初始化。
要调用Calc类的其它任何成员函数,只须再次拷贝pCalc到ECX并获取输出函数载进程中的地址,然后直接调用即可。你观察任何简单类的反汇编代码都会发现,在每次成员函数调用之前总有一个汇编指令将‘this’拷贝到ECX。这就是我们前面所做的事。
注:测试的时候也许会出现“获取函数地址失败!”,具体解决方法有2个
方法一:在文中已经说过,可以查看.dll文件中函数的实际地址
方法二:修改Calc.dll的CCalc函数,在函数前加上extern &C&,再编译Calc.dll文件所在的工程,复制新生成的Calc.dll覆盖工程目录下的Calc.dll,原来的代码获取函数地址时使用CCalc,结果运行就成功了。
本文标题:
本页链接:博客访问: 275109
博文数量: 245
注册时间:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM& Rational& Software Architect 从 Java™ 源代码来逆向工程生成 UML 类和序列图。 逆向工程经常被用来从已有的源代码中以一种抽象模型 UML 格式来获得丢失的设计文档,其可以用来研究一个系统的静态结构和动态行为,并用于扩展新的特性到产品。 作者详细说明了使用 IBM Rational Software Architect 进行逆向工程的限制,并阐述了克服这些限制的技术。 您将从使用这些技术技巧和窍门中受益,以识别组件,并从 Java 类中产生像 UML 类和序列图这样的高层抽象。
软件结构师、开发人员及测试人员都熟知统一建模语言(UML),该语言适用于文档化用例、类图、序列图和其他图表。也可以通过其他许多软件辅助工具来帮助软件工程师来完成这些工作,或者是 正向工程 或者是 逆向工程的。
正向工程是对一个系统物理结构实现的高层抽象性、逻辑性及独立性设计的传统处理过程。
逆向工程是对一个已存在系统的分析处理,以鉴别它的组成部分及它们的内在联系,从而以高层抽象性来构建一个系统的框架。在大多数情况下,逆向工程用于以抽象的模型 UML 格式从已存在的源代码中,提取已丢失的设计文件,从而同时可得知一个系统的静态结构及动态行为。
IBM& Rational& Software Architect 在很多工业中得以广泛采用,因为它提供了很多的特性以帮助逆向工程师。 问题是当您以 Java™ 代码逆向构建 UML 类及序列图时,Rational Software Architect 不能自动地产生有用的 UML 类及序列图。 但是已经存在改善 Rational Software Architect 输出产物的技术。本篇文章论证了怎样使用这里介绍的技术技巧,从 Java 代码中识别其组成部分及对 UML 种类和序列图进行高层的抽象。
使用逆向工程,您可以很容易就从正向工程中得到您想要的,本篇文章将介绍在逆向工程以下领域中存在的问题:
发现其抽象类及识别它们的等级结构
产生具有聚合及关联关系的高层抽象性的类图
构建序列图
接下来的部分为每个问题提供一个解决方案,并论证了怎样产生有意义的类及序列图。例子向您展示了怎样从一个已给 Java 项目的源代码中,识别一个系统的继承关系及组成部分,以对 UML 类图及序列图进行高层的抽象。
注意: 本篇文章中的例子产生于 Rational Software Architect 7.0 版本
继承关系是一种普遍的对象型的模式。它允许一组类共享共同的状态和行为,从而子类可以从父类那里继承共同的状态和行为。从一个已存在系统中发现整个的继承树结构是相当有用的,因为它能向您揭露在树中什么是顶级类以及什么是子类。而且,您可以识别一个继承树中有哪些共同状态及行为,以及这些共同行为怎样起作用。您可以在探索过程中以以下三种方式使用 Rational Software Architect。
从一个工作场所或工作集中发现其抽象结构
从抽象结构表中选择一个类从而显示其抽象类图
在一个浏览表中研究树状结构,您会发现显示在 Abstraction之下的一系列抽象类。
第一步是在一个已存在系统中自动得到其顶级类。这样您就能使用这些类作为切入点以研究继承树中的类。您可以按以下步骤来完成此项。
打开 Rational Software Architect 中 Diagram Navigation视图。
在 Object-oriented Pattern下,右键点击 Abstraction,然后点击 Discover Architecture(如图 1 所示)。
这可以揭示整个工作空间的架构。
图 2 显示了得到一个抽象类图的树状结构所需的剩余步骤:
通过右键点击位于 Abstraction之下的类 Car来打开内容菜单。
显示右边面板中 Car类图,通过选择菜单中的 Show Diagram选项。
通过选择并右键点击右边面板中类图 Car来打开内容菜单。
通过选择内容菜单中 Explore in Browse Diagram选项来产生抽象类图的树状结构。
做完第六步,您将在右边面板中见到 Car类图的树状结构。
结果有以下缺陷:
结构树中被发现类的同类及子类可能被丢失。
除去被发现的抽象类之外,其他类没有属性及操作。
要得到第六步产生的树状结构,还需其他的步骤。您需要增加分离度(如图 3 所示),这决定了从被发现类扩展的层。
默认度是 1,这就是为什么在继承树中一些子类会丢失的原因。在本例中,分离度被增加至 2。
第二个问题是除了在树状结构中被发现的类,其他类没有属性和操作。这不利于使用者出于再使用的目的来研究已存在的普遍模式。
接下来的例子将向您展示,怎样识别具有任意属性及操作的整个继承树。
向 Rational Software Architect 载入一个 Java 项目。
切换至 Diagram Navigation视图,按以上步骤所述,从工作场所中发现其抽象结构。
从您感兴趣的第二步中找出一个抽象类。
通过寻找模型搜索器中的类,找出等级树状结构类 ,双击打开编辑器中的类,按下 F4以打开等级树。确保 type hierarchy已被选择。
右键点击类,并将其转变为一个可视的类图,通过选择 Visualize > Add to New Diagram File > Class Diagram,如图4所示。
通过右键点击并选择 Visualize > Add to Current Diagram来向当前的图添加剩余的类。
图 5 展示了产生一个继承树类图的过程:
打开并按下 F4以显示类的等级。
选择每一个类并将其添加到类图中。
检查并完成右边的图。
类图以 Rational Software Architect 默认格式产生。有几个有用的修改可以帮助您将图表进行可视化。例如,您可以修改连接路径样式以使用树状样式路径 ,并且您可以通过在工作区右键点击来打开内容菜单然后点击 Arrange all。到此产生的类图要比自动产生的看上去更好。如图 6 所示。
图6中的类既显示了属性又显示了操作。属性及操作显示的好处在于,您可以研究它们共同的状态及行为,从而进一步了解一个已存在系统是如何被实现的,这将有助于系统的再使用。
Rational Software Architect 能让您通过从一个Java项目中,选择多个 Java 文件,来产生类图。
在模型搜索器中,使用 Visualize来将它们添加到一个新图或当前的类图中。
如果多个类已经被添加到当前的图中,那么它们之间的关系也将被显示。
图 7 是一个从 Java 代码中自动产生的类图的例子
如图 7 所示,您可以从模型搜索器中选择多个 Java 文件 来将它们在新的类图中可视化。如果您想添加更多的类,您可以选择更多的 Java 源代码来将它们在当前的类图中可视化。本图显示类包括在项目及它们的基本关系中。这有利于在项目中自动发现 UML 类,但是自动发现的关系在这里用处不大。
在图 7 中,几乎所有的关系是 use除去继承关系。使用关系太过平常以至于不能给出有用的设计信息,越来越多的特别的聚集及组成关系被隐藏了甚至当所有的关系在图中都出现过。聚集关系表现为一对多关系当一个类含有其他类的很多项目时,组成关系用于描述一多一关系当一个类仅含有其他类的一个例子时。这个高层的抽象意味着对类之间更精确的关系发现,并为本设计的执行提供了有用的信息。这个类图如果没有抽象关系的细节将不再像以前那样有用。
这里,我们尝试并探索了,以半自动方法产生UML类图的高层抽象方案。 UML 类以和以前同样的技术发现,并且类间的关系由人为指定。高层的抽象方案基于研究已有源代码所必须的知识。
图 8 的例子显示了,怎样应用这个方法来得到高层的 UML 类图。
为了得到一个高层的类图,您必须首先建立一个空白模型。
按图 8 所述步骤建立一个新的空白模型:
在文件种类下,选择 UML Modeling。
在模板下,选择 Blank Model。
在文件名区域,输入 Blank Model。
对于目的文件夹,输入 example。
默认的图检查框 "Create a default diagram in the new model" 应该被检查。
对于默认的图种类,选择 Freeform. Diagram。
点击 Finish。
接下来的一步是从自动生产类图中总结选择的类。 Rational Software Architect 中的总结,能让您从一个类中拷贝一个类并粘贴到另一个类图中,这必须在一个空白模型中完成。如果您将总结的类粘贴到同一个类图,或本空白模型以外另一个类图中时,那么该类的属性和功能将丢失。
通过图 9 所示的步骤,从自动生成的类图中总结已选择的 Java 类:
从 classdiagram2.dnx 中选择类 FuelTank,Engine,Passenger以及 Car
在一个已选类上右键点击以打开内容菜单
选择 Harvest菜单
将已总结的类粘贴至分离的创建于步 2 的类图中。
在类间创建聚集及组成关系。
下一步,在类间创建关联关系,这使您能够在聚集及组成关系中选择一个。图 10 显示了一个高层的类图。
通过将图 10 与图 9 进行比较,您可以发现半自动方法能精确显示类间关系。本图可用于独立设计执行文件,或已有系统远期改善。
着重点: 如果不经过总结,聚集及组成关系将不能应用于 Rational Software Architect 。
序列图是应用最为广泛的 UML 动态建模方法。它致力于识别一个系统的行为。一个序列图通常应用于建模用例,以显示一个系统的方法及功能。
Rational Software Architect 不能从 Java 代码中自动创建一个序列图。下面的步骤会告诉您怎样去创建一个:
创建一个空白模型。
创建一个序列图:
在 Blank Model上右键点击。
从 drop-down (context) 菜单中,选择 Add Diagram然后选择 Sequence Diagram(如图 11 所示)。
向序列图添加类。
在两个类间对方法标记进行排序。
保存序列图。
当您完成创建一个序列图,一个序列文件产生于 Collaboration: Interaction 标签下。 您可以从 Java 代码中向序列图添加类。二者均见于图 12 。
图 12 的主要工作区显示了一个序列图的例子。
一个方法调用意味着信息从召集者传向被召集者。被召集者是方法所有人,它从方法召集者那里收到信息。信息可以是单道的也可以是双道的。一个序列图由在处于一组方法所有者及一个初始发起者之间的,一系列方法标记组成。第一个标记必须从发起第一个方法标记的地方开始。
本篇文章论证了怎样通过应用 Rational Software Architect v7.0 ,从 Java 代码中使用逆向工程创建 UML 类及序列图。层级类图代表着一种方式,该方式能发现在一个项目或工作集中,发现整个类间的层次关系。这将有助于开发人员向一个已有系统扩展或添加新功能。高层的类图能直观显示类间的聚集及组成关系。这有助于开发人员扩展或修改一个已有设计。这对开发人员们开发大型应用系统意义非凡。序列图显示了在执行特定任务时类间的动态方法标记。这为系统中提供了清晰的运行原理图。
阅读(56116) | 评论(1) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
IBM官网上的,楼主辛苦了
谢谢楼主分享经验,正愁怎么画时序图之类的,有幸看到这篇文章,太赞了!
请登录后评论。}

我要回帖

更多关于 rational 类图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信