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

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

識別一個 UML 類圖的繼承樹

繼承關係是一種普遍的物件型的模式。它允許一組類共享共同的狀態和行為,從而子類可以從父類那裡繼承共同的狀態和行為。從一個已存在系統中發現整個的繼承樹結構是相當有用的,因為它能向您揭露在樹中什麼是頂級類以及什麼是子類。而且,您可以識別一個繼承樹中有哪些共同狀態及行為,以及這些共同行為怎樣起作用。您可以在探索過程中以以下三種方式使用 Rational Software Architect。

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

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

  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 中選擇類 FuelTankEnginePassenger以及 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 類及序列圖。層級類圖代表著一種方式,該方式能發現在一個專案或工作集中,發現整個類間的層次關係。這將有助於開發人員向一個已有系統擴充套件或新增新功能。高層的類圖能直觀顯示類間的聚集及組成關係。這有助於開發人員擴充套件或修改一個已有設計。這對開發人員們開發大型應用系統意義非凡。序列圖顯示了在執行特定任務時類間的動態方法標記。這為系統中提供了清晰的執行原理圖。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14780914/viewspace-588975/,如需轉載,請註明出處,否則將追究法律責任。

相關文章