從 Java 代碼逆向工程生成 UML 類圖和序列圖

本文面向於那些 軟件架構師,設計師和開發人員,他們想使用 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 版本 spa

識別一個 UML 類圖的繼承樹 .net

繼承關係是一種廣泛的對象型的模式。它容許一組類共享共同的狀態和行爲,從而子類能夠從父類那裏繼承共同的狀態和行爲。從一個已存在系統中發現整個的繼承樹結構是至關有用的,由於它能向您揭露在樹中什麼是頂級類以及什麼是子類。並且,您能夠識別一個繼承樹中有哪些共同狀態及行爲,以及這些共同行爲怎樣起做用。您能夠在探索過程當中以如下三種方式使用 Rational Software Architect。 設計

  • 從一個工做場所或工做集中發現其抽象結構
  • 從抽象結構表中選擇一個類從而顯示其抽象類圖
  • 在一個瀏覽表中研究樹狀結構,您會發現顯示在Abstraction之下的一系列抽象類。

第一步是在一個已存在系統中自動獲得其頂級類。這樣您就能使用這些類做爲切入點以研究繼承樹中的類。您能夠按如下步驟來完成此項。 orm

  1. 打開 Rational Software Architect 中Diagram Navigation視圖。
  2. Object-oriented Pattern下,右鍵點擊Abstraction,而後點擊Discover Architecture(如圖 1 所示)。

這能夠揭示整個工做空間的架構。 對象


圖 1.發現整個工做空間的架構
發現整個工做空間的架構

圖 2 顯示了獲得一個抽象類圖的樹狀結構所需的剩餘步驟:

  1. 經過右鍵點擊位於Abstraction之下的類Car來打開內容菜單。
  2. 顯示右邊面板中Car類圖,經過選擇菜單中的Show Diagram選項。
  3. 經過選擇並右鍵點擊右邊面板中類圖Car來打開內容菜單。
  4. 經過選擇內容菜單中Explore in Browse Diagram選項來產生抽象類圖的樹狀結構。

作完第六步,您將在右邊面板中見到Car類圖的樹狀結構。


圖 2. 從整個工做場所中發現其抽象結構
從整個工做場所中發現其抽象結構

結果有如下缺陷:

  • 結構樹中被發現類的同類及子類可能被丟失。
  • 除去被發現的抽象類以外,其餘類沒有屬性及操做。

要獲得第六步產生的樹狀結構,還需其餘的步驟。您須要增長分離度(如圖 3 所示),這決定了從被發現類擴展的層。


圖 3. 改變分離度
改變分離度

默認度是 1,這就是爲何在繼承樹中一些子類會丟失的緣由。在本例中,分離度被增長至 2。

第二個問題是除了在樹狀結構中被發現的類,其餘類沒有屬性和操做。這不利於使用者出於再使用的目的來研究已存在的廣泛模式。

接下來的例子將向您展現,怎樣識別具備任意屬性及操做的整個繼承樹。

  1. 向 Rational Software Architect 載入一個 Java 項目。
  2. 切換至Diagram Navigation視圖,按以上步驟所述,從工做場所中發現其抽象結構。
  3. 從您感興趣的第二步中找出一個抽象類。
  4. 經過尋找模型搜索器中的類,找出等級樹狀結構類 ,雙擊打開編輯器中的類,按下F4以打開等級樹。確保type hierarchy已被選擇。
  5. 右鍵點擊類,並將其轉變爲一個可視的類圖,經過選擇Visualize > Add to New Diagram File > Class Diagram,如圖4所示。
  6. 經過右鍵點擊並選擇Visualize > Add to Current Diagram來向當前的圖添加剩餘的類。


圖 4 . 將類可視化爲新的類圖
將類可視化爲新的類圖

圖 5 展現了產生一個繼承樹類圖的過程:

  1. 打開並按下F4以顯示類的等級。
  2. 選擇每個類並將其添加到類圖中。
  3. 檢查並完成右邊的圖。


圖 5. 產生一個繼承樹類圖的機理
產生一個繼承樹類圖的機理

類圖以 Rational Software Architect 默認格式產生。有幾個有用的修改能夠幫助您將圖表進行可視化。例如,您能夠修改鏈接路徑樣式以使用樹狀樣式路徑 ,而且您能夠經過在工做區右鍵點擊來打開內容菜單而後點擊 Arrange all。到此產生的類圖要比自動產生的看上去更好。如圖 6 所示。


圖 6. 帶有屬性的繼承樹狀圖及樹狀路徑鏈接
帶有屬性的繼承樹狀圖及樹狀路徑鏈接

圖6中的類既顯示了屬性又顯示了操做。屬性及操做顯示的好處在於,您能夠研究它們共同的狀態及行爲,從而進一步瞭解一個已存在系統是如何被實現的,這將有助於系統的再使用。

產生一個高層的 UML 類圖

Rational Software Architect 能讓您經過從一個Java項目中,選擇多個 Java 文件,來產生類圖。

  1. 在模型搜索器中,使用Visualize來將它們添加到一個新圖或當前的類圖中。

若是多個類已經被添加到當前的圖中,那麼它們之間的關係也將被顯示。

圖 7 是一個從 Java 代碼中自動產生的類圖的例子


圖 7. 一個自動產生的類圖
一個自動產生的類圖

如圖 7 所示,您能夠從模型搜索器中選擇多個 Java 文件 來將它們在新的類圖中可視化。若是您想添加更多的類,您能夠選擇更多的 Java 源代碼來將它們在當前的類圖中可視化。本圖顯示類包括在項目及它們的基本關係中。這有利於在項目中自動發現 UML 類,可是自動發現的關係在這裏用處不大。

在圖 7 中,幾乎全部的關係是use除去繼承關係。使用關係太過日常以致於不能給出有用的設計信息,愈來愈多的特別的彙集及組成關係被隱藏了甚至當全部的關係在圖中都出現過。彙集關係表現爲一對多關係當一個類含有其餘類的不少項目時,組成關係用於描述一多一關係當一個類僅含有其餘類的一個例子時。這個高層的抽象意味着對類之間更精確的關係發現,併爲本設計的執行提供了有用的信息。這個類圖若是沒有抽象關係的細節將再也不像之前那樣有用。

這裏,咱們嘗試並探索了,以半自動方法產生UML類圖的高層抽象方案。 UML 類以和之前一樣的技術發現,而且類間的關係由人爲指定。高層的抽象方案基於研究已有源代碼所必須的知識。

圖 8 的例子顯示了,怎樣應用這個方法來獲得高層的 UML 類圖。


圖 8. 使用 UML 模型嚮導創建一個空白模型
使用 UML 模型嚮導創建一個空白模型

爲了獲得一個高層的類圖,您必須首先創建一個空白模型。

  1. 按圖 8 所述步驟創建一個新的空白模型:
    1. 在文件種類下,選擇UML Modeling
    2. 在模板下,選擇Blank Model
    3. 在文件名區域,輸入Blank Model
    4. 對於目的文件夾,輸入example
    5. 默認的圖檢查框 "Create a default diagram in the new model" 應該被檢查。
    6. 對於默認的圖種類,選擇Freeform. Diagram
    7. 點擊Finish

接下來的一步是從自動生產類圖中總結選擇的類。 Rational Software Architect 中的總結,能讓您從一個類中拷貝一個類並粘貼到另外一個類圖中,這必須在一個空白模型中完成。若是您將總結的類粘貼到同一個類圖,或本空白模型之外另外一個類圖中時,那麼該類的屬性和功能將丟失。

  1. 經過圖 9 所示的步驟,從自動生成的類圖中總結已選擇的 Java 類:
    1. 從 classdiagram2.dnx 中選擇類FuelTank,Engine,Passenger以及Car
    2. 在一個已選類上右鍵點擊以打開內容菜單
    3. 選擇Harvest菜單
  2. 將已總結的類粘貼至分離的建立於步 2 的類圖中。
  3. 在類間建立彙集及組成關係。


圖 9. 一個類圖中的總結類
一個類圖中的總結類

下一步,在類間建立關聯關係,這使您可以在彙集及組成關係中選擇一個。圖 10 顯示了一個高層的類圖。


圖 10. 半自動方法產生的 UML 類圖的高層抽象
半自動方法產生的 UML 類圖的高層抽象

經過將圖 10 與圖 9 進行比較,您能夠發現半自動方法能精確顯示類間關係。本圖可用於獨立設計執行文件,或已有系統遠期改善。

着重點:
若是不通過總結,彙集及組成關係將不能應用於 Rational Software Architect 。

建立一個序列圖

序列圖是應用最爲普遍的 UML 動態建模方法。它致力於識別一個系統的行爲。一個序列圖一般應用於建模用例,以顯示一個系統的方法及功能。

Rational Software Architect 不能從 Java 代碼中自動建立一個序列圖。下面的步驟會告訴您怎樣去建立一個:

  1. 建立一個空白模型。
  2. 建立一個序列圖:
    1. Blank Model上右鍵點擊。
    2. 從 drop-down (context) 菜單中,選擇Add Diagram而後選擇Sequence Diagram(如圖 11 所示)。
  3. 向序列圖添加類。
  4. 在兩個類間對方法標記進行排序。
  5. 保存序列圖。


圖 11. 建立一個序列圖
建立一個序列圖

當您完成建立一個序列圖,一個序列文件產生於Collaboration: Interaction標籤下。 您能夠從 Java 代碼中向序列圖添加類。兩者均見於圖 12 。

圖 12 的主要工做區顯示了一個序列圖的例子。


圖 12. 產生於 Java 源文件的序列圖
產生於 Java 源文件的序列圖

一個方法調用意味着信息從召集者傳向被召集者。被召集者是方法全部人,它從方法召集者那裏收到信息。信息能夠是單道的也能夠是雙道的。一個序列圖由在處於一組方法全部者及一個初始發起者之間的,一系列方法標記組成。第一個標記必須從發起第一個方法標記的地方開始。

總結

本篇文章論證了怎樣經過應用 Rational Software Architect v7.0 ,從 Java 代碼中使用逆向工程建立 UML 類及序列圖。層級類圖表明着一種方式,該方式能發如今一個項目或工做集中,發現整個類間的層次關係。這將有助於開發人員向一個已有系統擴展或添加新功能。高層的類圖能直觀顯示類間的彙集及組成關係。這有助於開發人員擴展或修改一個已有設計。這對開發人員們開發大型應用系統意義非凡。序列圖顯示了在執行特定任務時類間的動態方法標記。這爲系統中提供了清晰的運行原理圖。

相關文章
相關標籤/搜索