??xml version="1.0" encoding="utf-8" standalone="yes"?> 目录 ? 概述 步骤 1Q自定义开发环? 步骤 2Q打开代码目以实施逆向工程 步骤 3Q选择“逆向工程?Reverse Engineer) 按钮 步骤 4Q在 Visio UML 模型图表解决Ҏ中创建您?UML 图表 ? Microsoft Visio 2000 Enterprise Edition ?Professional Edition 都包含通过逆向工程代码{换ؓ UML 静态结构图表的解决Ҏ。该解决Ҏ支持三种语言QMicrosoft Visual C++ 6.0、Microsoft Visual Basic 6.0 ?Microsoft Visual J++ 6.0。Visio UML 模型图表解决Ҏ所采用?UML 标准?1.2 版? 每种语言使用的逆向工程技术各不相同。对?J++ ?Visual BasicQ该解决Ҏ使用开发环境的对象模型来收集静态结构信息。对?C++Q该解决Ҏ浏览信息文?(.BSC) 用作l构信息的来源。虽?Visual Basic ?J++ 逆向工程都用开发环境的对象模型Q但 J++ 对象模型提供了更完整的信息,因此可得到更完整的逆向工程 UML 模型。C++ 中的览信息文g包含最的信息;因此Q它所生成?UML 模型不如 J++ ?Visual Basic 逆向工程得到?UML 模型那么完整? 本文介l通过逆向工程转换?Visio UML 模型图表解决Ҏ所需的步骤? 注意QVisio UML 模型图表解决Ҏ只支?Microsoft Visual C++ 6.0、Microsoft Visual J++ 6.0 ?Microsoft Visual Basic 6.0 的逆向工程。要使用 Visio UML 外接E序Q必d?Service Pack 3.0 for Microsoft? Visual Studio?? 概述 要通过逆向工程您的代码{换到 Visio UML 模型图表解决ҎQ应执行以下主要步骤Q? 自定?Visual Studio 开发环? ?Visual Studio 中打开目以实施逆向工程 从“Visio UML 外接E序?Visio UML Add-In) 工具栏中选择“逆向工程?Reverse Engineer) 按钮 ?Visio UML 模型图表解决Ҏ中创?UML cd? 本文的其余部分提供了每个步骤的详l指|q包括特定于~程语言的信息。例如,在自定义开发环境部分,Visual C++、Visual Basic ?Visual J++ 都有其相应的章节? 步骤 1Q自定义开发环? Z实施逆向工程Q第一步应通过d“Visio UML 外接E序?Visio UML Add-In) 工具栏来自定义开发环境。以下指导显CZ如何该工具栏添加到 Visual C++、Visual Basic ?Visual J++ 的不同环境中? 自定?Microsoft Visual C++ 6.0 ?Visual C++ 中,选择 Tools 菜单上的 Customize? ?Customize 对话框中Q选择 Add-ins and Macro Files 选项卡? ?Add-ins and Macro Files 列表中,选择外接E序和宏文g列表中的 Visio UML Add-in。确保旁边的复选框被选中Q然后单?Close? 出现动?Visio UML Add-in 工具栏,其中包含五个按钮? 提示Q如果希望该工具栏在每次打开 Microsoft Visual Studio 旉可用Q可通过拖动该工具栏靠接到工具栏区? 自定?Microsoft Visual Basic 6.0 ?Visual Basic 中,从“外接程序”菜单中选择“外接程序管理器”? 在“外接程序管理器”对话框中,选择“可用的外接E序”列表中的“Visio UML Add-in”。对于“加载行为”,选择“加?卸蝲”和“在启动中加载”,然后单击“确定”? 出现带有四个按钮的“Visio UML 外接E序”工h? 提示QVisio UML 外接E序在创建工hӞq会向“工具”菜单中d命o。您可以通过从“Visio UML 解决Ҏ”中选择“工具”来扑ֈq些命o? 自定?Microsoft Visual J++ 6.0 ?Visual J++ 中,选择 Tools 菜单上的 Add-In Manager? ?Add-In Manager 对话框中Q选择 Available Add-Ins 列表中的 Visio UML Solution。对?Load BehaviorQ选中 Loaded/Unloaded ?Load On StartupQ然后单?OK? 出现带有四个按钮?Visio UML Add-in 工具栏? 提示QVisio UML Add-in 在创建工hӞq会?Tools 菜单中添加命令。您可以通过?Tools 菜单选择 Visio UML Solution 来找到这些命令? 步骤 2Q打开代码目以实施逆向工程 逆向工程q程从所有这三种语言的开发环境中开始。当通过d“Visio UML 外接E序?Visio UML Add-in) 自定义环境后Q下一步是打开要实施逆向工程的项目? Visual C++ 6.0 的附加步? 对于 Visual C++Q在开始逆向工程之前Q还必须执行几个附加步骤。第一步是生成目的浏览信息文?(.BSC)。以下提供了生成览文g的指对{第二步是确定逆向工程中要包含的代码库。设|这些选项的指导将在浏览文件指g后提供。最后,应在实施逆向工程之前构徏目? 生成 Visual C++ 6.0 的浏览信息文? ?Visual C++ 中,选择 Project 菜单上的 Settings? ?Project Settings 对话框中选择所需构徏配置的类型,单击 C/C++ 选项卡,然后选中 Generate browse info? 单击 Browse Info 选项卡,指定览信息文g的名U和位置Q选中 Build browse info fileQ然后单?OK? 选择 Visual C++ 6.0 逆向工程所包含的库 单击 UML Add-in 工具栏上?Visio UML Options 按钮Q设|?Visual C++ 逆向工程所包含的库? 此时昄 Visio UML Options 屏幕。如果希望在逆向工程中包?MFC Classes、ATL Classes ?Standard Include Files 的信息,只需选中所需选项旁边的复选框Q然后单?OK? 步骤 3Q从“Visio UML 外接E序?Visio UML Add-In) 工具栏选择“逆向工程?Reverse Engineer) 按钮 逆向工程的下一步是从“UML 外接E序?Visio UML Add-In) 工具栏选择“逆向工程?Reverse Engineer) 按钮? 对于 Visual Basic ?Visual J++Q此操作在 Visio 2000 中打开 UML 模型图表解决ҎQ其中会昄通过逆向工程转换为模型的信息。此?UML 模型图表解决Ҏ打开Qƈ在“UML D器”中昄一个空白的静态结构图表和一个树视图Q其中包含从目中收集的模型信息? 对于 Visual C++Q在 Visio 2000 打开q显C通过逆向工程转换?UML 模型图表解决Ҏ的项目信息之前,可能会显C另外两个屏q。如?Visual C++ 工作Z存在多个目Q可?Select Project 对话框中选择要实施逆向工程的项目,然后单击 OK? 如果目层次l构中显CZ多个览文gQ可在“选择览文g?Select Browse File) 对话框中选择一个浏览文Ӟ然后单击“确定?OK)? 步骤 4Q在 Visio UML 模型图表解决Ҏ中创建您?UML 图表 现在QVisio 2000 应该昄您的目信息。要创徏 UML cd表,请将模型元素从“UML D器?UML Navigator) 拖放到“静态结构?Static Structure) 图表上。类关系(泛化、实现、绑?会自动昄。利?Visio UML 模型图表解决ҎQ您可以生成其他 UML 工gQ以指定、构造Y仉目ƈ使Y仉目Ş象化和文档化? cM间的关系 l承关系 l承关系是最Ҏ理解的关pR画成图的话像下面q样。面向对象的说法是is-a关系。也是说Class2 is a Class1。在C++中我们说Class2是Class1的派生类Q或者说Class1是Class2的基cR?a href="http://m.shnenglu.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image002_2.jpg"> 聚集和组?/b> 从容易理解的关系说v.l常有一个类是另一格类的数据成员的情况。在UML中表CؓQ聚集(aggregation)和组成(compositionQ? 从图上来看,q两U关p都表现Z端是菱Ş的直Uѝ其中有菱Ş的一端是整体Q另外一端是部分。区别就是菱形是I心q是实心的。从C++曑ֺ来看的话Q如果图L实心菱Ş的话QClass1p负责Class2的创建和销毁。更准确的说Q就是如果Class1不存在了QClass2也一定不存在。例如象下面的程序? class Class2 { }; class Class1 { Class2 m_objClass2; } 当然也有下面的情? class Class2 { }; class Class1 { Class1Q)Q? ~Class1Q)Q? Class2* m_pClass2Obj; }; 光看cȝ声明׃行了。这是就需要看cȝ实现部分了? Class1Q:Class1Q) { m_pClass2Obj = new Class1; } Class1::~Class1Q) { delete m_pClass2Obj; m_pClass2 = NULLQ? } l成QCompositionQ关p,如果在Class1的对象销毁的时候,比如在析构函C没有数据成员销毁的代码Q那么这U关pd是聚集(aggregationQ关pR当Ӟ销毁数据成员的代码Q会有很多种? 依赖关系 依赖关系是在以个类中用了另一个类。例如下面的代码 Class1Q:DoSomethingQ) { Class3 obj; obj.DoClass3Work(); } 是q样的情c画成图的话像下面q样? 画UML图有好多U工?VISIO只是其中一U?VISIO的动作非常轻?很多人都在用.但是对众多的C++E序员来?存在着一个问?那就是VISIO中的用语都来自面向对?和C++E序员常用的说法有所不同.q一点o很多C++E序q很困惑.希望本文能ؓ您解册个问? 在我们将使用下面?a >例子QUMLSample.zipQ?/a>来进行说明? 然后选择[File]-[New]-[Software]-[UML Model Diagram]可以进入到UML作图状态了.q时画面臛_应该包含3个部?形状H口,模型资源理?和作囑?可以通过选择[View]-[Shapes Window]来表C和隐藏形状H口.模型资源理器比较麻?必须通过[UML]-[View]-[Model Explorer]来进? 在模型资源管理器中选择[Static Mdel]-[Top Package],炚w标右?从弹单中选择[New]-[Static Structure Diagram]卛_创徏用于制作cȝ构图的图面了,如果从弹单中选择[New]-[Sequence Diagram]卛_创徏用于制作时序囄的图? 讑֮对象的详l信息的大部分操作是通过属性对话框实现?可以通过在对象上双击鼠标或单击鼠标右键ƈ选择属性属性来表示属性对话框. 在绘囄q程中连U是最常见的操?象下N?U有直角q接U和直线q接U和曲线q接U三U? 可以通过,用鼠标右键点d望改变种cȝq接U?在弹单中选择适当的连接线U类. 我想说的不是当然我们可以通过菜单实现扩大和羃?而是通过按住Ctrl?在上?下滚鼠标的滚轮来实现扩大和羃? 除了用鼠标拖动滚动条的方法以?用鼠标滚轮也可以上下滚动屏幕.那么左右滚动?你可能已l猜C,先按下Shift键就可以? 首先按下Ctrl?用鼠标脱动对?最后释放Ctrl键就可以?需要注意的Ctrl键释攄时机一定要在鼠标释放之? 按下Shift?在拖动鼠标画U?可以很单的d水^U和垂直U?其实q可以画45度的斜线.
]]>
]]>启动Visio
创徏各种N
讑֮对象的属?/h3>
几种技?/h3>
改变q线的方?/h4>
扩大和羃?/h4>
上下/左右滚动屏幕
拯已经存在的对?/h4>
Lq线/垂直U?/h4>
]]>
因ؓcd很直?所以恐怕C++成员首先接触到的应该是cd?在这文章中我们要将下面一个在MFCE序中随处可以见到类用UML图表现出?
class CGraphicObject
{
CRect m_rectBound;
public:
BOOL SetRect(CRect rect);
CRect GetRect();
};
在模型资源管理器中选择[Static Model]-[Top Package],炚w标右?从弹单中选择[New]-[Static Structure Diagram]卛_创徏用于制作cȝ构图的图面了.
首先我们遇到的问题是,CRect和BOOL两种cd在Visio数据cd中找不到.所以我们先从追加数据类型开?Z便于理我们会先创徏MFC数据cd?
右键点击下图中模型资源管理器的根节点.在弹单中,选择[包]目.
下图是弹出的包属性对话框.点击[New]按钮,在[UML Package]列中输入[MFC Data Types],点击[OK]按钮l束.上图可以看到q加的MFC数据cd?
在[MFC Data Types]目上点d?选择[New]-[Data Type],在弹出的[UML Datatype Property]H口中的cdH口中选择[DataType]目,在名U项目中填写[BOOL],选择[OK]l束.用同LҎq加CRectcd.
注意:在MFC中CRect是一个类,但是׃我们q不兛_CRect的细?所以把CRect作ؓ单数据类型来处理.
q加一个类很简?然后从Ş状窗口中的[UML Static Sturcture]分类中拖动[Class]对象可以了.
讑֮cȝ详细信息的大部分工作都是同时属性对话框实现?对于C++E序员来?需要设定的内容包括cd,数据成员,成员函数.
以开头提到的cMؓ例?
首先在[Categories]H口中选择[Class]目,然后在右面的名称栏目中写入类名就可以?在这一中我们可以暂时不必在意其他的内?
如果只是讑֮cd的话,大可不必用属性对话框.只要在选中cd象后,再在最上面一栏中单击左键,然后在输入就可以?
在[Categories]H口中选择[Attributes]目,在右面的画面中增加属性。[Attribute]栏目中写入变量名Q[Type]是用来选择数据cd的。这里我们选择[MFC DataTypes::CRect]。[Visibility]栏目选择的是q个成员是公q(public)Q保护的(protected)q是U有?private)。这里我们选择[protected].[Multiplicity]一般翻译成多重性,是指Q在cMQ数据成员的个数。[1]代表在这个类中,有而且只有一个数据成员。[0..1]表示Q没有或者有一个。可以在[Init.Value]中输入数据成员的初倹{?
在[Category]H口中选择[Operations]目Q在右面的表gq加成员函数。在Q)isiblilityQ中选择函数是,共有Q保护还是私有的。EQͽlymorphic]表示函数是否为多态,也就是否是虚函数。EQIope]表示一个函数是属于实例Qinstance)q是属于c(classifierQ,静态函敎ͼ也被UCؓcȝ成员函数Q普通的成员函数也被UCؓ实例的成员函数。所以如q,在这里选中了EclassifierQ,p明这个函数是静态函数?
上面的操作,只是讑֮函数的一些基本信息,更详l的信息可以通过选中函数后,点击Qd性]按钮Q在出现的EQQ Qperation QͽopertiesQ窗口中讑֮。首先是讑֮函数的基本信息。和上面的窗口重复的内容Q我们不再说明。我们只说明QProfix]和EQIffixQ。如果我们想要返回的cd是指针类型或者是应用cd的话Q只要在Qsuffix]中填写EQ]或E&Q就可以了?
接下来是讑֮函数的参数。这个函数只有一个参敎ͽect,但是QParameterQ窗口中却出CQ两个参数。不q通过观察QOind]列的内容可以知道Q第一个参敎EQItRect]是函数的q回倹{第二个Qrect]才是我们惌的。这个参数的QOind]是EinQ表明这个参数是用来向函C递信息的。如果是用来取得信息的,选择QoutQ,如果是双方向传递信息的Q就选择QinoutQ?
完成上面的工作以后,点击QOQ]按钮两次Q回C囄面。来看看我们的成果吧?
实际?a >例子工程中的CGraphicObject的UML囑֏以参?a >Sample1Vsd.zip.