内容


在 IBM Rational Systems Developer 中使用 C++ 可视化

介绍

Comments

C++ 可视化特性的介绍

IBM®Rational®Systems Developer C++ 可视化特性将建模技巧带到使用 Eclipse C/C++ Development Toolkit (CDT),一个开放开发环境的 C++ 项目中来。通过为 C++ 源代码创建 Unified Modeling Language 2.0 (UML 2) 代理组件使灵活建模在实况 C++ 项目上变为可能,这样允许您把它们当作 UML 组件来使用。这些代理组件仅仅存在于这个图中,它们在这里被创建,而且不需要优先的,实体 UML 模型组件。

当您创建这样一个组件时,可视化引擎只会查找那些已经被选中的代码组件和与它有直接关系的组件。因此,它不会反对完成源代码,除非您明确规定这个行为。这就是与逆向工程工具的不同之处。 图形表示(显示)的另一好处是它们总是与源代码同步,这意味着 UML 图,像 Class 或者 Topic 图一样,在变化发生时总能在代码中反映这些变化。

这篇文章描述了 C++ 可视化特性在编程和编制代码的日常活动中是怎样起到帮助的作用的。

开始阶段

  • 在您的系统上安装 Rational Systems Developer。请看参考资源,并获得试用下载的连接。
  • 在这篇文章中导入 Eclipse CDT 程序库项目下载的样例,导入到您的 Rational Systems Developer 工作区。

在类图上可视化 C++ 元素

Rational Systems Developer 支持这些元素:

  • C++ 类的可视化(图形化表示),数据类型结构,枚举以及 UML 分类符的类型定义。
  • Namespace 相当于一个 UML 包
  • 文件和文件夹相当于 UML 工件

您可以在一个 UML 图上可视化地表示这些元素,要么通过弹出式菜单,要么通过拖放地方式。

使用 C++ 元素弹出式菜单

C++ 可视化特性为 C++ 元素(参见图1)提供了一个显示上下文菜单选项,它可以让您通过以下几个步骤将C++ 元素显示在新的或者现有的类图上:

  1. 激活这个弹出式菜单
  2. 选择 Visualize > Add to New Diagram File > Class Diagram
图 1. 显示弹出式菜单
图 1. 显示弹出式菜单
图 1. 显示弹出式菜单

图 2 显示了来源于显象在一个图中的样本项目的分类 Book。图标中可视化 C++ 元素与 UML 类在使用 C++ 特殊标符和结构上有所区分,它们显示在表格 1中。

图2. 一个 C++ 类显示在 Class 图标中
图2. 一个 C++ 类显示在 Class 图标中
图2. 一个 C++ 类显示在 Class 图标中
表格 1. C++ 元素的图标和构造型
C/C++ 元素图标构造型
C++ 类图标<<class>>
结构结构图标<<Struct >>
联合体联合体图标<<Union >>
类型定义类型定义图标<<typedef>>
枚举枚举图标<<enum>>
命名空间命名空间图标<<namespace>>
源文件C (源)文件图标<<file>>
头文件头文件图标<<header file>>

使用 UML 图弹出式菜单

另一种显示现存的 C++ 元素的方法是,使用一个 UML 图的弹出式菜单。(请看 图 3)

图 3. 显示现存的弹出式菜单
图 3. 显示现存的弹出式菜单
图 3. 显示现存的弹出式菜单

例如,通过使用这个选项,可以显示来源于样本项目的分类 LibraryEntry,按照下面几个步骤:

  1. 从 UML 图的弹出式菜单选择Visualize Existing > C/C++ Type
  2. 一个输入选项对话框就会弹出 (图 4),在这里您可以键入这个类最初的几个字符来使它显示。对于这个例子,可以在选择一个类型域中输入 Li
  3. 对话框将列出相匹配的条目。从这个匹配单中选择LibraryEntry,然后点击 OK
图 4. 输入选择对话框
图 4. 输入选择对话框
图 4. 输入选择对话框

图 5展现了添加到这个图中的最新可视化类。注意 BookLibraryEntry之间的继承性关系将会自动显象出来。

图 5. 最新的类图
图 5. 最新的类图
图 5. 最新的类图

拖放功能指令

Rational Systems Developer 通过将它们从 C/C++ 项目浏览器或者 Project Explorer 拖放到这个图的方式支持带有现有图的 C++ 元素。当显示一个文件时,默认的选项是显示这个文件中所有的元素。您可以通过以下这些步骤来更改这个行为:

  1. 在 C++ 建模Preferences 页面更改设置,您可以从 Windows > Preferences对它进行访问。
  2. 然后从 Preferences树 (请看 图 6)中选择 Modeling > C++ Modeling
图 6. 从一个 C/C++ 文件中抽取元素的参数设置
图 6. 从一个 C/C++ 文件中抽取元素的参数设置
图 6. 从一个 C/C++ 文件中抽取元素的参数设置

要将一个图中的元素导航到与它相关的源代码,您要么双击这个图的元素要么使用它的弹出式菜单。

  • 双击结构联合体类型定义,或者它们的成员字段,将会定位到这个元素声明的位置。
  • 双击类成员程序将会导航到指令确定的位置,如果可能的话,或者会导航到这个这个程序声明的位置。

C++ 可视化特性还提供了一个高级导航特性,称作 Auto-Navigation(自动导航)。通过选择这个图工具栏中的 C++ Auto-Navigation图标,可以选择或者取消它的功能 (请看 图 7a)。

图 7a. Diagram 工具栏中的 Auto-Navigation 图标
图 7a. Diagram 工具栏中的 Auto-Navigation 图标

一旦激活,这个选项将把这个编辑窗口拆分为两个部分,图在上半部分,C++ 编辑器在下半部分,重点突出了在这个图中所选元素的源代码的位置(图 7b)。

图 7b. Auto-Navigation 屏幕截图
图 7b. Auto-Navigation 屏幕截图
图 7b. Auto-Navigation 屏幕截图

显示或者隐藏类图中的相互关系

元素之间的关系可以通过使用 Class 图中的弹出式菜单来显示或者隐藏。例如,只想查看图上元素之间的联合关系:

  1. 右键点击这个图,并从弹出式菜单选择 Filters > Show/Hide Relationship选项。
  2. 然后选择隐藏除了关联关系以外的所有关系,如图 8所示。
图 8. 显示或隐藏关系对话框
图 8. 显示或隐藏关系对话框
图 8. 显示或隐藏关系对话框

显示一个关联或者属性

两个元素之间的关联要么显示为这个类中的一个属性,要么显示为这个相关元素的一个结合。例如,在这个图上显示这个类 Book。现在可以将 authorName域拖出这个类,如图 9 所示。这样将会作为一个联合显示它们之间的关系。还可以通过右键点击这个属性,然后从弹出式菜单中选择 Filter > Show as Association来实现。

图9. 通过拖放来显示关联
图9. 通过拖放来显示关联
图9. 通过拖放来显示关联

要想作为一个属性来显示一个关联,右键点击这个关联然后从弹出式菜单中选择 Filter > Show as Attribute,如图 10所示。

图 10. 显示一个属性操作
图 10. 显示一个属性操作
图 10. 显示一个属性操作

在 Class 图中显示相关的元素

Show Related Elements是 Rational Systems Developer 中一个十分有用的一个特性,它可以使您找到显示在类图上的 C++ 元素的相关 元素。运行这个操作:

  1. 右键点击这个可视化元素
  2. 然后从弹出式菜单中选择 Filters > Show Related Elements(图 11)。
图 11. Show Related Elements 菜单
图 11. Show Related Elements 菜单
图 11. Show Related Elements 菜单

这样产生了 Show Related Elements对话框(图 12),它预先规定了能够帮助继承性树可视化过程的查询系统,包括图等等。通过使用这个自定义查询系统,您可以控制类别,方向,以及您想要显示的相关元素的深度。

图 12. Show Related Elements 对话框
图 12. Show Related Elements 对话框
图 12. Show Related Elements 对话框

使用 Modeling Assistant

Show Related Elements 查询系统还可以从建模助手来运行。例如,要查询引入的相关元素,将鼠标放在元素上,双击这个弹出的引入箭头的方框。这样将显示一个带有可以运行的查询列表的弹出式菜单(图 13)。在引出箭头上执行相同的操作将为引出的关系提供查询。值得注意的是这些查询都仅仅局限在一个水平,这意味着您不能选择查询的深度。

图 13. 通过使用 Modeling Assistant 显示 Related Elements(入向的)
图 13. 通过使用 Modeling Assistant 显示 Related Elements(入向的)
图 13. 通过使用 Modeling Assistant 显示 Related Elements(入向的)

研究 Browse 图的代码

Browse 图都是非编辑的图,这样有助于从单个的焦点元素来探索它们之间的关系。要创建一个浏览图:

  1. 从一个元素的弹出式菜单中选择 Visualize > Explorer in Browse Diagram。从 Project ExplorerDiagrams视图都可以做到。 图 14 展示了 Book类的 Browse 图。
图 14. Book 类的 Browse 图
图 14.  Book 类的 Browse  图
图 14. Book 类的 Browse 图

要显示关系的类型和深度可以通过浏览图工具条来控制(参见图15)。浏览图的焦点元素可以通过双击来更改,双击浏览图中的元素可以使它变成新的焦点,或者通过使用弹出式菜单,如先前所述,来选择这个新的焦点元素。例如,尝试双击 LibraryEntry

图 15. 浏览图工具条
图 15. 浏览图工具条
图 15. 浏览图工具条

浏览图可以保持它所显示视图的历史记录,因此您可以从任何一个视图向前或者向后导航。然而,您不能保存这个浏览图,但是您可以通过使用图弹出式菜单中的 File菜单把图的副本作为新的图文档或者图片来保存。

动态图例子:Topic 图

ATopic 图是一个基于查询的非编辑性的图,它能够帮助查看元素之间的关系。要创建一个 Topic 图:

  1. 从图元素中选择 Visualize > In Topic Diagram或者从 C/C++ 项目浏览器或者从 Project Explorer中选择 Visualize > Add to New Diagram File > Topic Diagram。例如,要为元素创建一个与 Book LibraryEntry相关的 Topic 图。
  2. 从浏览器中选择这两者,右键点击并出现弹出式菜单,然后选择 Visualize > Add to New Diagram File > Topic Diagram,如图 16 所示。这个操作将会导致弹出一个对话框,询问创建这个 Topic 图的名称和位置。
  3. 对于这个练习,您可以接受默认值。这样会出现一个 Topic 图向导。在第一个屏幕中,选择这个查询程序来运行。例如,选择Related Elements查询程序(图 17),然后点击 Next
  4. 下一个向导页面将会使您自定义要显示关系的深度和类别。对于这个例子,通过点击 Finish接受默认设置。这样就会创建显示在图 18 中的 Topic 图。
图 16. 创建新的 Topic 图
图 16. 创建新的 Topic 图
图 16. 创建新的 Topic 图
图 17. Topic 图对话框
图 17. Topic 图对话框
图 17. Topic 图对话框
图 18. Topic 图
图 18. Topic 图
图 18. Topic 图

Topic 图仅仅会在适当的环境中进行保存:这个元素最初被选定并且查询开始运行。这个查询系统包括相互之间的关系,加上您所选择的查询方向和深度。不像其它的图,每次当一个主题图被打开时,它就会自动运行查询程序,并且更新这个图来反映最新的源代码。如果当图打开后,一种关系已经更改,那么您需要从弹出式菜单中选择 Refresh,或者关闭再打开这个主题 图来使其更新。当您创建一个主题图后,可以通过使用图弹出式菜单的 Customize Query选项对它进行自定义制定,这样可以显示 Topic Diagram 向导图 17的第二 页面, 先前所显示的)。

可视化编辑源代码

通过使用选项板,Modeling Assistant,或者弹出式菜单,Rational Systems Developer 工具支持来自 Class 图的 C++ 元素的创建和编辑。

创建新的 C++ 元素

可以通过使用 C/C++(图 19)或者一个类图的弹出式操作栏(图 20)来创建一个新的 C++ 类或者枚举。

图 19. C/C++ 选项板
图 19. C/C++ 选项板
图 19. C/C++ 选项板
图 20. 弹出式操作栏
图 20.  弹出式操作栏

例如,要创建一个新的源自于 LibraryEntry的名称为 ElectronicMediaC++ 的类:

  1. 从选项板中选择 C++ Class,然后点击一个类图。
  2. 这样将会弹出 CDT New Class wizard(参见图 21)。
  3. 键入这个类的名称 ElectronicMedia
  4. 现在,可以选择这个基类,点击Add按钮,然后从对话框中选择 LibraryEntry
  5. 点击 Finish

您还可以在 New Class向导中更改创建的默认文档,确定这个类所属的字段名。

图 21. CDT New Class 向导
图 21. CDT New Class 向导
图 21. CDT New Class 向导

接下来,创建一个代表 ElectronicMedia类型的新枚举,您将为它命名为 EMediaType

  1. 将鼠标指针移到 Class 图的空白处。
  2. 当这个操作栏出现时,选择这个棕色的E字母。(参见图 20,如先前所显示。)
  3. 这将启动 New Enum 向导(图 22)。键入名称 EMediaType
  4. 点击 Finish

提示:
您还可以在向导中更改创建的默认文档,确定这个类所属的字段名

图 22. The New Enum 向导
图 22. The New Enum  向导
图 22. The New Enum 向导

添加元素

您可以通过使用这个弹出式菜单(图 23)或者弹出式操作栏(图 24),为可视化 C++ 类添加新的域和操作。

图 23. C/C++ 为 C++ 类添加弹出式菜单
图 23. C/C++ 为 C++  类添加弹出式菜单
图 23. C/C++ 为 C++ 类添加弹出式菜单
图 24. C++ 类的弹出式操作栏
图 24. C++ 类的弹出式操作栏

例如,添加一个类型 Publisher protected 域到 ElectronicMedia类:

  1. 点击类 ElectronicMedia的弹出式操作栏中的 Add Field图标(请再次查看图 24)。
  2. New C/C++ Field 向导中键入 publisher作为名称,显示在 (图 25)中。
  3. 要选择 Publisher类型,点击 Type Browse
  4. Type Selection对话框中,键入字母 P来列出所有以 P开头的元素。
  5. 从列表中选择 Publisher,然后点击 OK
  6. Access Visibility下拉框中,选择 Protected
  7. 点击 Finish
图 25. 添加 Field 向导
图 25. 添加 Field 向导
图 25. 添加 Field 向导

类似地,添加一个叫做 Publisher getPublisher()的新方法到 ElectronicMedia类:

  1. 右键点击这个类 ElectronicMedia,如图中所显示。
  2. 从弹出式菜单中选择 Add C/C++ > Method,如先前图 23所显示的那样。
  3. 在弹出的(紧接着是 图 26)New C/C++ Method 向导中,键入 getPublisher作为这个程序的名称。
  4. 选择 Publisher作为返回类型,点击 Return TypeBrowse按钮。
  5. 在弹出的 Type Selection对话框中,键入P列出所有以 P开头的元素。
  6. 从列表中选择 Publisher并点击 OK按钮。
  7. 点击 Finish
图 26. Add Operation 向导
图 26. Add Operation 向导
图 26. Add Operation 向导

这些操作将分别在 Add Field 向导中显示,或者在 Add Operation 向导中显示,如图 25图 26所示。

添加枚举文字

您还可以添加枚举文字到显示在类图中的 enum元素,可以通过弹出式操作栏(图27)或者弹出式菜单(图 28)来实现。例如,添加一个新的文字 CDEMediaType

  1. 将鼠标悬浮在可视化 EMediaType之上。
  2. 从弹出式操作栏中选择 添加枚举文字图 27
  3. 在弹出的 Enumeration Literal向导(图 29)中,键入文字名称 CD
  4. 点击 Finish
图 27. 添加 Enumeration Literal 弹出式操作栏
图 27. 添加 Enumeration Literal  弹出式操作栏
图 28. 添加 Enumeration Literal 弹出式菜单
图 28. 添加 Enumeration Literal 弹出式菜单
图 28. 添加 Enumeration Literal 弹出式菜单
图 29. 添加 Enumeration Literal 向导
图 29. 添加 Enumeration Literal 向导
图 29. 添加 Enumeration Literal 向导

创建 C++ 元素之间的相互关系

您可以通过使用点击-和-拖放的方法很容易地创建 C++ 元素之间地相互关系。这种关系地类型可以从 C/C++ Palette(参见图 19,先前所示)中选择。例如,要创建一个从 ElectronicMediaTypeAuthor的关联关系:

  1. 从 C/C++ 选项板中选择 Create Association图 19,如先前所示)。
  2. 点击 ElectronicMediaType,并将这个元素拖放到 Author
  3. 在弹出的向导中确定名称,可见度,以及其它具体的细节 (图 30)。
  4. 点击 Finish
图 30. 创建 Association 向导
图 30. 创建 Association 向导
图 30. 创建 Association 向导

如果您愿意,您可以通过使用 Modeling Assistant来代替创建它们之间的相互关系。利用这个工具,您可以创建已经存在在图中元素或者新元素之间的关系,并且现有的元素不在这个图上 。例如,要创建一个由 ElectronicMedia类继承而来,叫做 EBook的新类:

  1. 将光标悬在 ElectronicMedia之上。
  2. 点击引入的箭头,从元素拖拽到一个空图位置。这将产生一个弹出式菜单(图 31)。
  3. 选择 Create Inherits (Generalization) from > New Element: C++ Class。这将启动 New Class 向导早期在图 21中有所显示。
  4. 键入 EBook作为名称,然后点击 Finish
  5. 接下来,您将看到 Inheritance 向导,这时您可以确定可见度为 Public
  6. 点击 Finish
图 31. 利用 Modeling Assistant 创建一个与新类相关的继承
图 31. 利用 Modeling Assistant  创建一个与新类相关的继承
图 31. 利用 Modeling Assistant 创建一个与新类相关的继承
图 32. 创建 Inheritance 向导
图 32. 创建 Inheritance 向导
图 32. 创建 Inheritance 向导

要在图上创建元素之间的关系,可以利用 Modeling Assistant:

  1. 在两个元素之间要么拖拽引入的要么拖拽引出的箭头。
  2. 然后选择关系的类型,比如 Author 或者 Publisher,如图 23所示。
图 33. 利用 Modeling Assistant 创建关联
图 33. 利用 Modeling Assistant 创建关联
图 33. 利用 Modeling Assistant 创建关联

更改成员的可视性

通过使用元素的弹出式菜单,很容易就可以从这个图更改 C++ 类成员的可见度。例如,在 ElectronicMedia下,将 publisher域的可视性更改为 private,右键点击这个域并从弹出式菜单中选择 Visibility > Private,如图 34 所示。

图 34. 更改成员的可视性
图 34. 更改成员的可视性
图 34. 更改成员的可视性

更名重构

您可以利用元素的弹出式菜单,对显示在图中的一个元素进行重命名:Refactor > Rename。例如,将 ElectronicMedia的域类型 重新命名为 mediaType

  1. 右键点击这个域类型并选择 Refactor > Rename,如图 35所示。
  2. 键入新的名称,mediaType,它将显示在 Rename Refactor 向导中 (图 36)。
  3. 选择Preview 来预览您的更改,然后点击 OK
图 35. Rename 弹出式菜单
图 35. Rename 弹出式菜单
图 35. Rename 弹出式菜单
图 36. Rename Refactor 向导
图 36. Rename Refactor 向导
图 36. Rename Refactor 向导

从一个图中直接编辑

另一种对元素重命名的方法是直接从图中进行编辑。您还可以利用这种方法来更改域类型和操作。例如,在 Library类下,更改 entries: int域的名称和类型为 totalEntries:long,按照以下这些步骤:

  1. 选择 Entries域。
  2. 点击这个图使图文本为可编辑类型 (图 37)。
  3. 键入新名称和输入格式为 totalEntries: long,然后按下 Enter键。

重点:
这是确定名称和类型的 UML 方法。不要使用确定这个信息的 C++ 类型。

  1. 当您看到 Edit Preview对话框(图 38)时,在那个对话框屏幕中点击 OK
图 37. 操作中的图内嵌编辑
图 37. 操作中的图内嵌编辑
图 37. 操作中的图内嵌编辑
图 38. 编辑 Preview 对话框
图 38. 编辑 Preview 对话框
图 38. 编辑 Preview 对话框

在图中直接重命名可以是一个简单的重命名或者重构。您需要在 C++ 建模 Preferences页面上设置这个选项。

  1. 选择 Window > Preferences
  2. 从这个树中(图 39)选择 Modeling > C++ Modeling
    • 当您选择Simple rename 时,只有表示位置在这个图中的名称才可以更改。
    • 当您选择 Refactor rename时,所有这个名称的参考都会更改。
图 39. C++ Modeling Preference 页面
图 39. C++ Modeling Preference 页面
图 39. C++ Modeling Preference 页面

提示:
最好是利用 Preview选项来检查这些更改。这是因为实际的源代码和变量绑定可以更改,这是建立在环境或者构建宏预处理程序指令的时间定义的基础上的。

收获 UML 元素

Harvest 特性提供了一个从可视化 C++ 元素创建 UML 元素的方法。从图中收获的 C++ 元素可以作为新的 UML 元件粘贴到一个 UML 模型中。收获的时候这些 UML 元素是 C++ 元素的副本,当源代码更改时它们不会更改。例如,收获 BookElectronicMedia元素并将它们添加到 UML LibraryModel 模型:

  1. 选择图中您想要收获的元素,右键点击,并从弹出式菜单(图 40)中选择 Harvest
  2. 一个对话框方框将会确认这个收获操作,创建的这个 UML 元素将会放置在剪贴板上。
  3. 右键点击 UML 叫做 LibraryModel的模型,然后选择 Pas 图Figure 41)。
  4. 这样将会显示 Paste Objects 对话框。选择 Automatic Paste或者,如果您想要看到您正在粘贴的内容,相反就应该选择 Visual Paste
  5. 这个元素将会粘贴到这个模型,如图 42所示。
图 40. Harvest 菜单
图 40. Harvest 菜单
图 40. Harvest 菜单
图 41. Harvest Paste 菜单
图 41. Harvest Paste 菜单
图 41. Harvest Paste 菜单
图 42. 从 C++ 元素收获的 UML 元素
图 42. 从 C++ 元素收获的 UML 元素
图 42. 从 C++ 元素收获的 UML 元素

注意这个元素的所有域和程序都已经拷贝到新的 UML 元素中。参考那些没有被收获的其它元素仍然涉及到实际的 C++ 元素。例如, 如果您在图上将 Author 域拖出收获元素 之外,它将在源代码中显示与 C++ 元素的关联, 如图 43所示。

图 43. Harvest 关系
图 43. Harvest 关系
图 43. Harvest 关系

过程与收益总结

Rational Systems Developer 让您通过使用 C/C++ Development Toolkit (CDT) 获得了 C++ 项目的 UML 建模经验。它让您能够在 UML 图中使用 C++ 元素,比如 Class、Topic,以及 Browse 图,因此提供了一个非常有用的特性能够可视化地发现和研究这个项目中 C++ 元素之间地关系,与此同时,反映了此过程中任何源代码地变更。


下载资源


相关主题


评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=269139
ArticleTitle=在 IBM Rational Systems Developer 中使用 C++ 可视化
publish-date=11052007