---
title: "使用 Altova UModel 分析遗留应用程序——第一部分"
date: "2009-04-16"
tags: 
  - "c"
  - "java"
  - "software-modeling"
  - "uml"
  - "uml-tool"
  - "umodel"
  - "visual-basic"
description: 探索如何利用 Altova UModel 通过逆向工程来分析现有应用程序，从而更好地理解 Java、C# 和 Visual Basic 项目。
---
Status: #blog

Tags:  #c #java #software-modeling #uml #uml-tool #umodel #visual-basic

Categories: [Altova](/blog/zh/category/altova.md) 
# 使用 Altova UModel 分析遗留应用程序——第一部分

总有一天，几乎所有的专业开发人员都会被分配到一项任务：调试或为现有的应用程序添加新功能，而这个应用程序可能并非由他们自己参与开发。 在这些情况下，不准确或不完整的文档，以及无法接触到原始开发团队，都可能构成巨大的障碍。 幸运的是，[Altova UModel](https://www.altova.com/zh/products/umodel/uml_tool.html) 能够 [逆向工程](https://www.altova.com/zh/features_reverse_engineer.html) 现有软件，从而创建可视化的模型，这有助于加速分析并提高对旧应用程序的理解。 以下是系列文章的第一篇，我们将在此系列文章中应用Altova公司的UModel [用于软件建模的 UML 工具](https://www.altova.com/zh/products/umodel/uml_tool.html) 以及开发方面，旨在分析一个用Java编写的自动取款机（ATM）模拟程序。 该应用程序是基于一些流行的Java教程中的ATM（自动取款机）示例而开发的。 由于其结构简单，并且自动取款机的工作原理比较容易理解，因此我们将更侧重于介绍您可以应用于您自己的 Java、C# 和 Visual Basic 项目的技术，而不是示例代码。 以下是遗留应用程序在命令行窗口中运行的界面截图： 

[![使用 Altova UModel 分析遗留应用程序](https://lh5.ggpht.com/_REdrfeVqYdU/Sed_-l0DTLI/AAAAAAAAABU/6-raolJrxpk/image1_thumb1.gif?imgmax=800 "Analyzing a Legacy Application with Altova UModel")](http://lh6.ggpht.com/_REdrfeVqYdU/Sed_-BNWN-I/AAAAAAAAABM/UsJK-uUZDsQ/s1600-h/image13.gif) 

原始开发者很方便地提供了示例账户信息，因此我们可以登录。应用程序随后会显示一个熟悉的ATM交易菜单：

[![使用 Altova UModel 分析遗留应用程序](https://lh3.ggpht.com/_REdrfeVqYdU/Sed__4VIvHI/AAAAAAAAABc/eRfNTNU1BMc/image2_thumb1.gif?imgmax=800 "Analyzing a Legacy Application with Altova UModel")](http://lh5.ggpht.com/_REdrfeVqYdU/Sed__H7tHTI/AAAAAAAAABY/VDOrnnEzqxw/s1600-h/image23.gif) 

如果我们检查包含该应用程序的文件夹，我们会看到 Java 源代码文件和编译后的 .class 文件，但没有项目文件。 

[![使用 Altova UModel 分析遗留应用程序](https://lh5.ggpht.com/_REdrfeVqYdU/SeeABYGobaI/AAAAAAAAABk/y7Q_dj7x3D8/image3_thumb1.gif?imgmax=800 "Analyzing a Legacy Application with Altova UModel")](http://lh5.ggpht.com/_REdrfeVqYdU/SeeABA_BmhI/AAAAAAAAABg/d1XUgpJ6tCw/s1600-h/image33.gif) 

这没有问题。UModel 项目菜单允许我们导入一个项目、一个源代码目录，甚至可以直接导入编译后的应用程序的二进制文件。对于非常大型的项目，源代码很可能被组织成多个文件夹，因此，即使您已经有了项目文件，您可能仍然需要逐个文件夹进行检查。 

[![Altova UModel 项目菜单](https://lh3.ggpht.com/_REdrfeVqYdU/SeeACSlKy2I/AAAAAAAAABs/DMIjj76IUrg/image4_thumb1.gif?imgmax=800 "Altova UModel Project Menu")](http://lh4.ggpht.com/_REdrfeVqYdU/SeeABvDWNpI/AAAAAAAAABo/0HNmMYw5ozY/s1600-h/image43.gif) 

在开始之前，我们需要确保设置UModel的选项，使其能够自动绘制源代码中定义的任何类之间的关联关系 

[![Altova UModel 选项对话框](https://lh4.ggpht.com/_REdrfeVqYdU/SeeADbAPBmI/AAAAAAAAAB0/apw9S8S36qI/image5_thumb1.gif?imgmax=800 "Altova UModel Options dialog")](http://lh5.ggpht.com/_REdrfeVqYdU/SeeAC7sCJNI/AAAAAAAAABw/KJ5dD50EuvM/s1600-h/image53.gif)

在导入文件夹时，我们还希望将源代码中的所有 JavaDoc 注释作为文档包含到我们的 UModel 项目中 

[![Altova UModel 导入目录选项](https://lh3.ggpht.com/_REdrfeVqYdU/SeeAEb_SWQI/AAAAAAAAAB8/vyX0IzsXN1I/image6_thumb1.gif?imgmax=800 "Altova UModel Import Directory options")](http://lh3.ggpht.com/_REdrfeVqYdU/SeeAD4UkwmI/AAAAAAAAAB4/a09DTRdK1E8/s1600-h/image63.gif) 

在首次了解这个遗留系统时，我们需要一个总体的概览，因此我们不会打开所有可选的模块： 

[![Altova UModel 图表生成选项](https://lh5.ggpht.com/_REdrfeVqYdU/SeeAFCr9PXI/AAAAAAAAACE/hsT9EUQnh3k/image7_thumb1.gif?imgmax=800 "Altova UModel diagram generation options")](http://lh5.ggpht.com/_REdrfeVqYdU/SeeAErNf2wI/AAAAAAAAACA/c06PpbBlukA/s1600-h/image73.gif) 

UModel可以在几秒钟内导入项目，并且消息窗口显示没有错误。图表树包含两个图表： 

[![Altova UModel 反向工程项目](https://lh4.ggpht.com/_REdrfeVqYdU/SeeAGb4TU1I/AAAAAAAAACM/SNpifEp7W-E/image8_thumb1.gif?imgmax=800 "Altova UModel reverse engineering project")](http://lh3.ggpht.com/_REdrfeVqYdU/SeeAFm7VssI/AAAAAAAAACI/ARGlHfiFTYs/s1600-h/image83.gif) 

我们可以点击“模型树”选项卡，展开源文件夹，以查看代表所有导入的 Java 类的图标 

[![图片9](https://lh3.ggpht.com/_REdrfeVqYdU/SeeAHUrKyHI/AAAAAAAAACU/hsRmFA_xVKE/image9_thumb1.gif?imgmax=800 "image9")](http://lh4.ggpht.com/_REdrfeVqYdU/SeeAG7BR_9I/AAAAAAAAACQ/eT803iLh0Ds/s1600-h/image93.gif) 

我们可以返回到“图表树”来打开源文件[UML 类图](https://www.altova.com/zh/features_class_diagram.html)的内容。在将所有线条样式设置为正交，并重新调整一些线条和类的位置以避免重叠后，我们看到该图表清晰地展示了应用程序中的类以及它们之间的关系： 

[![Altova UModel UML 类图](https://lh3.ggpht.com/_REdrfeVqYdU/SeeAITR6w2I/AAAAAAAAACc/-Sq6tshlEaM/image10_thumb1.gif?imgmax=800 "Altova UModel UML class diagram")](http://lh3.ggpht.com/_REdrfeVqYdU/SeeAH5qIHRI/AAAAAAAAACY/S9YSO7cumAE/s1600-h/image103.gif)

请注意，交易类（Transaction）的名称以斜体显示，这表明它是一个抽象类（或父类），而余额查询（BalanceInquiry）、提款（Withdrawal）和存款（Deposit）等子类继承了它的特性。如果您点击“交易”类进行选择，UModel 的“层级结构”辅助窗口会展示继承关系，并且在类定义之前出现的任何 JavaDoc 注释都会在“文档”窗口中显示 

[![Altova UModel 的层级结构窗口](https://lh6.ggpht.com/_REdrfeVqYdU/SeeAJMlCtgI/AAAAAAAAACk/B8XZcGNgqpQ/image11_thumb1.gif?imgmax=800 "Altova UModel Hierarchy window")](http://lh4.ggpht.com/_REdrfeVqYdU/SeeAI67t_2I/AAAAAAAAACg/EqzSgKSnA_A/s1600-h/image113.gif)

如果仅仅使用文本编辑器来分析旧应用程序，我们就需要逐个检查每个源代码文件，才能理解上面展示的层级结构。这是因为“Transaction”类在其内部并没有识别其子类。当我们找到一个子类时，它也不会识别其兄弟类。而且，我们无法确定某个命名不合理的类是否是“Transaction”类的子类，除非我们检查了所有这些类。您还可以单独选择每个类，然后在“文档”窗口中查看其文档。或者，如果您更喜欢一个更清晰的图表，您可以只移除图表中的关联标签： 

[![Altova UModel 的右键菜单](https://lh4.ggpht.com/_REdrfeVqYdU/SeeAKdOPRqI/AAAAAAAAACs/SbZaC71r3hg/image12_thumb1.gif?imgmax=800 "Altova UModel right-click context menu")](http://lh3.ggpht.com/_REdrfeVqYdU/SeeAJn5hYqI/AAAAAAAAACo/H2HMeR0EK9E/s1600-h/image123.gif) 

现在，星号所代表的“零到多个”账户数量的概念在银行数据库中变得更加清晰易懂。 

[![Altova UModel UML 类图](https://lh4.ggpht.com/_REdrfeVqYdU/SeeALRzP2vI/AAAAAAAAAC0/Fdldw_Liu1g/image13_thumb1.gif?imgmax=800 "Altova UModel UML class diagram")](http://lh3.ggpht.com/_REdrfeVqYdU/SeeAK19kSnI/AAAAAAAAACw/YIEMn1DPyFY/s1600-h/image133.gif)

我们开发团队的另一位成员发现了一张部分类的图，声称是旧项目的示意图，并将它分享了。我们可以立即看到，这张图与UModel生成的图明显不同： 

[![用于传统应用程序的 UML 类图](https://lh6.ggpht.com/_REdrfeVqYdU/SeeAMbyxn_I/AAAAAAAAAC8/NBbye5jSIM4/image14_thumb1.gif?imgmax=800 "UML class diagram for legacy application")](http://lh6.ggpht.com/_REdrfeVqYdU/SeeAL5gvXsI/AAAAAAAAAC4/T1wD-oHmFCQ/s1600-h/image143.gif) 

我们旧应用程序的文档与代码不一致，这虽然不幸，但也是常见的情况。旧图表和我们生成的图表之间存在一些差异：

> · The associations between ATM and the physical components are shown as composition associations

> · The association between ATM and the BankDatabase is described by a text annotation

> · The association between ATM and Transaction also has a text annotation, and it does not even exist in the UModel diagram

> · Multiplicity is defined at each end of each association, but none were created by UModel

让我们逐一探讨这些要点：

> · The representation of composition in the Java language is identical to ordinary association, so UModel could not deduce the composition characteristic. Of course the ATM “is composed of” a keypad, screen, cash dispenser, and deposit slot, so we can update the diagram to show composition.

> · We can add a text annotation to any UModel association arrow. Simply click the arrow and start typing.

> · If UModel did not create an association arrow between the ATM class and the Transaction, one must not be defined in the source code. We will postpone further investigation of this anomaly for now. · Multiplicity as shown in the legacy diagram would also require specific definition in the source code. We’ll leave this for investigation later too. Maybe that old diagram was left in the back of the file cabinet for a reason!

我们将添加注释，然后更新 UModel 属性窗口中每个 ATM 关联的聚合特性。 此外，我们还可以使用 UModel 布局工具栏，将表示所有类的矩形调整为相同大小。 现在，我们的类图如下所示：


[![针对自动取款机 (ATM) 项目的修改后的 UML 类图](https://lh4.ggpht.com/_REdrfeVqYdU/SeeANZJrhlI/AAAAAAAAADM/C7K2WWMrqwQ/image15a_thumb1.gif?imgmax=800 "Modified UMLclass diagram for ATM project")](http://lh5.ggpht.com/_REdrfeVqYdU/SeeAM25eGkI/AAAAAAAAADI/1hEHobCyq7o/s1600-h/image15a3.gif) 

完成的类图只是我们分析的起点。在接下来的内容中，我们将更深入地研究应用程序代码，并自动生成更多 [UML 图表](https://www.altova.com/zh/uml/), 并且，随着我们对现有代码的理解不断加深，我们会绘制一些新的图表。 

如果您想立即开始，并对您现有的 Java、C# 或 Visual Basic 应用程序进行逆向工程，[请点击此处下载 Altova UModel 的免费、功能齐全的 30 天试用版](https://www.altova.com/zh/download/umodel/uml_tool_enterprise.html) [Altova UModel](https://www.altova.com/zh/products/umodel/uml_tool.html)。
