使用 XML: UML、XMI 和代碼生成,第 3 部分

使用 XML專欄的前兩期文章中,我討論了建模,更具體地說是在 XML 應用程序開發中使用 UML 建模。建模是 XML 開發中一個重要的方面。不管怎麼說,XML 是一種結構化語言,因此構成和組織信息就是 XML 存在的目的。這幾篇文章重點討論如何把 XML專用的建模語言與軟件開發的行業標準 UML 結合起來。

建模的不同形式

談到建模,前兩篇文章中我已經用了很大的篇幅介紹了我的觀點:簡而言之,我相信最合理的策略是把建模看作是一種連續的活動,從白板前的公開討論(或者小型辦公室中的一沓紙)開始,直到生產出 W3C XML Schema 或者 WSDL 文件結束。

每一步中模型都進一步精化,更加形式化。要記住,模型是系統的簡化表示,創建它是爲了幫助理解系統,隨着對系統的理解不斷深入,模型變得越來越完整是合乎邏輯的。

因此,我相信使用工具支持您的建模活動是至關重要的 —— 那些能夠幫助您精化模型的工具。我曾經見證過幾個因爲建模失敗而陷入泥潭的項目,共同的一點就是缺乏建模和開發活動之間的集成。所幸的是,解決方法很簡單,只需要部署工具來集成這兩類活動。

理 想的情況是模型中的所有變動都立刻反映到實現中,但實現這種理想情況基本上是不可能的。比如,Java 代碼生成程序可以生成或者更新主幹實現,但是它們不可能改變算法。有了 XML,就可以實現這種理想化的情況了,因爲處理的總是數據模型。儘管使用不同的語言,提供的詳略程度一般也不相同,但是 UML 模型和 XML Schema 都是數據模型。

樣式表、 XMI 和 XML Schema

上一篇文章中介紹了兩個樣式表:第一個樣式表把保存在 XMI 文件中的 UML 模型轉化成 XML Schema;第二個樣式表執行相反的操作,從 XML Schema 生成 XMI 文件。

轉換依賴於 UML 元模型(保存 UML 模型的數據模型)到 XML Schema 的映射。每個 UML 概念(類、屬性、關聯,等等)都在 UML 元模型中表示,因此如果規定 UML 類表示成 XML 元素,樣式表只需要把 XMI 中的 UML:Class 轉化成 XML Schema 中的 xs:element

簡單的樣式表可以自動完成用 XML Schema 實現 UML 模型的繁雜過程,但是爲了適應本文的篇幅,我作了大量的簡化。

注意,雖然討論以從 UML 模型到 XML Schema 的轉換爲主,逆向轉換也很有用。比如,可能需要在項目中包含其他團隊或者公司開發的只提供 XML Schema 的元素。







更強大的樣式表

這裏重新回顧 上一篇文章中的樣式表,並嘗試解決當時提出的兩個問題中的一個:UML 模型中缺少實現信息。造成這個問題的原因有二:

  • UML 是一種通用語言,因此雖然支持很多建模概念,但是缺乏針對 XML 的一些概念。比方說,XML 有元素的順序序列,而 UML 沒有對概念排序。
  • XML 是一種層次化的數據模型,而 UML 使用更加靈活的圖。因此,UML 和 XML 間有可能存在多種合法的映射,您必須告訴樣式表要採用哪一種。

擴展 UML

從一開始,UML 的設計者就認識到 UML 可能會被用於沒有預料到的用途,因此實現了擴展機制,以允許用戶改進 UML。

這些擴展機制之一是 構造型(stereotype),目的是允許用戶在 UML 中定義新的概念,以精化已有的概念。使用構造型,用戶基本上可以對這種建模工具說“我有一個概念與類(或者對象、參與者、關聯,等等)相似,但是更加具體。”

從實踐的角度看,構造型是元模型中的一種繼承形式。這樣有助於把構造型看作是一個 UML 概念的後代。

事實上,如果讀過 UML 規範,您就會看到標準本身也大量地使用構造型。比如:

  • 註釋有需求(requirement)和職責(responsibility)的構造型。
  • 約束有不變式(invariant)、前件(precondition)、後件(postcondition)和 stateInvariant 等的構造型。

當然這些都不是用戶定義的構造型。

從圖形上看,構造型用包圍在尖括號中的關鍵字表示,比如圖 1 中的 <<requirement>> 。注意,UML 允許用戶重新定義構造型的圖標,但是很少有工具支持這一特性。


圖 1. UML 中的構造型
註釋上的需求構造型

與構造型密切相關的第二種擴展機制是 標記(tag)。構造型允許用戶定義新的 UML 概念,而標記則允許用戶存儲關於這些新概念的信息。構造型提供了元模型級的繼承,而標記在元模型級提供了向構造型增加類屬性信息的機制。

用於 XML 的構造型

我首先說明如何規定一個層次結構。您將定義一個構造型 root,用於標記 XML 層次中作爲根的元素。您將用這個構造型標記一個或多個類,樣式表把它們作爲全局元素實現。(在 XML Schema 中只有全局元素才能是根。)

注 意,可以有多個元素標記爲根,這與 XML Schema 語言是一致的。還請注意,我決定把這個構造型稱爲“root”而不是"global“(全局元素)。UML 和 XML 之間可能存在不同的映射:比如,您可以在 Schema 中把所有的元素標記爲全局性的以便使其能夠在其他 Schema 中重用,也可以把儘量多的元素聲明爲本地的。(事實上使用全局元素和本地元素背後有一套非常複雜的理論,請參閱 參考資料。)

我 認爲這些實現決策不應該在 UML 模型中公開。一個理由是,這樣做在修改實現規則時不需要重新訪問 UML 模型。事實上,如果把元素標記爲“全局的”而又決定改變實現規則,比方說把所有的元素公開爲全局的,就需要重新查看整個模型並修改多數構造型。我不願意在 UML 模型中公開過多的實現細節。我準備在下一篇文章中更詳細地討論這個問題。

所處理的詞彙表也會影響到把哪些公開爲構造型。比如,如果指定用於出版或者文檔應用程序的詞彙表,您可能希望定義一個屬性構造型。在處理數據存儲的詞彙表時,對映射成屬性還是元素,採用固定的規則可能更合理一些(比如本文中的樣式表把一切都映射成 XML 元素)。

用於 XML 的標記

類似的,我還定義了 position 標記,用於指定元素在 XML 序列中出現的順序。這裏的問題是模式中的元素順序在轉換成另一個模式時不一定改變。這在處理關聯時尤其明顯:UML 工具不對關聯排序,因此不能依靠這些工具按照一定的順序輸出關聯。

一種方法是按照名稱排序關聯,另一種方法是使用標記明確控制位置。我發現後一種解決方案通常更好一些。







樣式表實現

圖 2 是一個 UML 模型,它定義了三個類( personaddressjob )以及彼此之間的關聯。該模型是上一篇文章所介紹的模型的擴展。


圖 2. UML 模型
包含關聯的模型

清單 1是 導出爲 XMI 的相同模型。與上一篇文章類似,這個清單是基於 XMI 標準的,而不是特定工具生成的 XMI 文檔,但是很容易調整爲適應特定的工具。這個列表中新增的內容包括 stereotype、tag、association 和 multiplicity。上一篇文章中已經說明,解釋這些內容需要回顧前面的 UML 元模型。這些內容是按照前面所述的邏輯生成的,這裏就不再添加註釋了。

清單 2是樣式表的更新版本,它把這個 XMI 模型轉化成 XML Schema。多數新代碼都與上一篇文章中介紹的代碼類似,以下幾個模板除外:

  • 構造型和標記在 XMI 文件的一開始定義然後被引用,因此聲明兩個變量用於保存它們的 ID 非常方便。
  • 模型模板選擇帶有 root 構造型的類聲明爲全局元素,其他的類聲明爲本地元素。如果願意,可以改變這一規則,把所有的元素聲明爲全局的。
  • 類模板遍歷關聯並使用 position 標記對其排序。
  • 關聯模板使用特殊的模式遍歷關聯右端連接的類。這種模式定義了兩個模板:第一個用於帶有 root 構造型的類,插入對類的引用;第二個用於一般類,作爲本地元素插入類定義。

這裏不再給出從 XML Schema 轉化成 XMI 的樣式表,留給讀者作爲練習。







結束語

通過到目前爲止所介紹的內容,您應該已經能夠自己編寫樣式表把任何 UML 模型轉化成 XML Schemas 了。我相信,一旦掌握了這門技術,您就會發現 UML 建模是設計 XML Schema 最簡單的方法之一。

雖然這裏介紹的樣式表僅限於 UML 元模型的一個子集,但是爲設計更加強大的模型提供了一個很好的起點。

下一篇文章將介紹如何解決最後一個遺留問題:存在 UML 到 XML 的多種映射時如何設計樣式表。



參考資料

  • 您可以參閱本文在 developerWorks 全球站點上的 英文原文.

  • 閱讀 Roger Costello 的論文“ Global versus Local”,文中討論了不同的設計技術,使用了富有外國風味的名稱,如威尼斯窗簾和俄羅斯玩偶。

  • 關於完整的 UML 元模型,請參閱 UML 規範,可以在 Object Management Group 站點上找到。

  • 研究 IBM Rational Rose,這是一種領先的 UML 建模產品。 在 developerWorks Rational欄目可以找到大量關於 Rational 和 UML 的資源。

  • 回顧 Benoit Marchal 本系列的前兩期文章:
    • 第 1 部分討論了 UML 和 XML 模式的關係( developerWorks,2004 年 3 月)。
    • 第 2 部分介紹了 UML 元模型和 XMI,後者是一種基於 XML 的模型交換規範。作者然後說明了如何從元模型映射到 XML Schema。( developerWorks,2004 年 5 月)。

  • developerWorksXML 專區 可以找到數百篇 XML 資源,包括 Benoit Marchal 使用 XML 專欄的以前各期文章。

  • developerWorks Developer Bookstore可以找到 各種關於 XML 的書籍,包括 Benoit Marchal 所著的 XML by Example

  • 瞭解如何才能成爲一名 IBM 認證的 XML 及相關技術的開發人員
  原文http://www.ibm.com/developerworks/cn/xml/x-wxxm25/index.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章