羅異
(重慶郵電大學軟件工程學院,重慶400065)
2001年對象管理組織(Object Management Group,OMG)基于面向對象的思想提出了MDA(Model Driven Architecture)標準[1]。MDA標準強調了模型在軟件開發過程中的重要性并將模型轉換作為軟件開發過程的核心。要使用模型對客觀世界進行抽象,必須將模型表示出來。
模型的表示過程實質上完成建模工具的創建和使用建模工具建模兩個過程。其中的建模過程基于元建模思想。元對象機制(Meta Object Facility,MOF)是MDA中描述元建模過程的標準。元建模擁有四層經典框架[2],MOF框架套用了經典的元建模四層框架,它將建模語言分為四個層次,分別為M0(信息層)、M1(模型層)、M2(元模型層)和 M3(元-元模型層)[3]。
統一建模語言(Unified Modeling Language,UML)是一種通用的可視化面向對象建模標準。它的目標是為系統架構師、軟件工程師和軟件開發人員提供分析設計和實現軟件系統、建模業務和流程的工具[4]。它包含用于描述系統靜態特性的結構模型和描述系統動態特性的行為模型[5]。在基于面向對象思想的建模過程中,UML建模人員使用結構模型中的類圖對客觀世界進行抽象并實現對象的重用。
面向對象思想將客觀世界中的事物看作一個個單獨的對象,它的根本目的是實現對象重用??陀^世界中的對象數量龐大且復雜,如果對每一個對象進行標識和理解將十分困難。為了解決這個問題,人們往往采用分類和抽象兩種基本的思維方式對客觀世界中的對象進行認識和實現對象的重用。分類的結果體現了面向對象中繼承的思想,抽象的逆過程體現了實例化的思想,因此分類和實例化方式都可以實現對象的重用。
既然繼承和實例化兩種方式都能實現對象的重用,那么什么情況下使用繼承方式實現對象重用和什么情況下使用實例化方式實現對象重用是需要解決問題。
本文針對上述問題,分析了人們通過分類和抽象兩種方式認識客觀世界的過程以及兩種方式與繼承和實例化的對應關系。使用集合和映射表示出繼承和實例化的數學模型,通過兩種方式的數學模型語義相同,給出產生本文主要解決的問題的本質原因。結合類圖和類圖元模型,分析建模工具設計人員通過繼承擴展類圖元模型的場景和建模人員通過實例化類圖元模型創建類圖的場景。以程序自主學習系統中一個實例場景驗證方法的可行性。
本節圍繞因客觀世界中對象數量龐大且復雜導致人們難以標識和理解對象的問題,首先介紹了人們認識客觀世界的兩種思維方式以及他們分別與繼承和實例化的對應關系。然后使用集合和映射表示出繼承和實例化的數學模型,最后比較兩種方式的數學模型語義并給出在模型表示過程中存在的問題。
分類的方式將客觀世界中當前關心的范圍(即,論域)中具有相同特性的對象分為一類。每一類形成一個集合,集合中的元素就是客觀世界中屬于當前分類結果的對象。如果分類后形成的集合中的對象仍然難以理解,人們繼續將當前集合中的對象按照上述分類方式,將具有相同特性的對象分為一類并形成新的集合,此時新集合是原集合的子集。理論上來說,根據上述分類過程可以完成任意多次的子集劃分,但最終劃分的粒度根據實際應用場景決定。
將客觀世界中的對象進行分類后形成集合和子集的過程可以解釋為面向對象思想中對象之間的繼承關系。即當前集合的子集中的對象同時也是當前集合中的對象,但當前集合的子集中的對象除了擁有當前集合的特性外還擁有子集的特性。因此繼承的方式使得當前集合的子集中的對象重用了當前集合中對象的特性。
客觀世界中普遍存在這種通過分類認識對象的方式。例如,人們將“人”論域中的對象根據性別分為“男人”和“女人”兩個集合,“男人”集合中的對象和“女人”集合中的對象都與“人”集合中的對象存在繼承關系。再比如,人們將“教職員工”論域中的對象根據教職工類別分類為“任課老師”和“教學管理員”兩個集合,“任課老師”集合中的對象和“教學管理員”集合中的對象都與“教職員工”集合中的對象存在繼承關系。
使用FacullyStaff表示“教職員工”集合,用fs表示“教職員工”集合中的元素,用Teacher表示“任課老師”集合,用t表示“任課老師”集合中的元素,用Teaching-Manager表示“教學管理員”集合,用tm表示“教學管理員”集合中的元素。則使用集合論表示上述繼承關系的語義如下。

如果用 FS表示集合 FacullyStaff,用 fsn(n=0,1,2,3…)表示FacullyStaff集合中的元素,用T表示集合Teacher,用 tn(n=0,1,2,3…)表示 Teacher集合中的元素,用TM表示集合TeachingManager,用tmn(n=0,1,2,3…)表示TeachingManager集合中的元素??梢詫⑸鲜隼^承關系的語義通過集合間的包含關系進行表示,得到數學模型如圖1所示。

圖1 繼承的數學模型
其中,t1、t2、t3是集合 T中的元素,tm1和 tm2是集合TM中的元素,fs1、fs2是集合TS中的元素。集合T和集合TM是集合FS的子集,集合TM和集合T中的元素也是集合FS中的元素。集合T中的元素不僅僅具有集合FS的特性,還具有集合T的特性,集合TM中的元素不僅僅具有集合FS的特性,還具有集合TM的特性。
分類的方式對客觀世界中具有相同特性的對象分類并形成集合。而抽象的方式將分類形成的一個個集合分別看作一個整體,并將這些整體分別抽象為一個抽象層次更高一級的新對象。如果形成的各個新對象之間具有共同的特征,則可以繼續根據上述抽象過程,將這些新對象形成的集合看作一個整體并抽象為抽象層次更高的新對象。理論上來說,可以完成任意多次的抽象過程,但最終抽象的粒度根據實際應用場景決定。
將對象分類后形成的集合看作一個整體并抽象為一個新對象的逆過程可以解釋為實例化過程。即一個集合經過抽象形成了一個對象,一個對象經過實例化得到了一個集合且集合中的元素為該對象的實例。因此通過實例化方法使得一個對象可以創建多個新對象,從而實現了對象的重用。
客觀世界中普遍存在這種通過抽象認識對象的方式。例如,人們將“人”集合看作一個整體并抽象為一個對象并用字符“人”標識,將其中“男人”子集和“女人”子集兩個集合分別看作一個整體后抽象為“男人”對象和“女人”對象。再比如,人們將“教職員工”集合看作一個整體并抽象為一個對象并用字符“教職員工”標識,將其中“任課老師”和“教學管理員”兩個子集合分別看作一個整體后抽象為“任課老師”對象和“教學管理員”對象。
用FacullyStaff表示“教職員工”集合,用fs表示“教職員工”集合中的元素,用fsnew表示“教職員工”集合抽象后形成的對象。用Teacher表示“任課老師”集合,用t表示“任課老師”集合中的元素,用tnew表示“任課老師”集合抽象后形成的對象。用TeachingManager表示“教學管理員”集合,用tm表示“教學管理員”集合中的元素,用tmnew表示“教學管理員”抽象后形成的對象。用FS2fsNew表示“教職員工”集合到“教職員工”對象的映射關系,用T2tNew表示“任課老師”集合到“任課老師”對象的映射關系,用TM2tmNew表示“教學管理員”集合到“教學管理員”對象的映射關系。用NewSET表示“教職員工”對象、“任課老師”對象和“教學管理員”對象組成的集合。則使用集合論表示上述實例化關系的語義如下。


用 FS表示集合 FacullyStaff,用 fsn(n=0,1,2,3…)表示FacullyStaff集合中的元素,用T表示集合Teacher,用 tn(n=0,1,2,3…)表示 Teacher集合中的元素,用TM 表示集合 TeachingManager,用 tmn(n=0,1,2,3…)表示TeachingManager集合中的元素。用NS表示集合NewSET,用 nsn(n=0,1,2,3…)表示 NewSET 集合中的元素??梢詫⑸鲜龀橄蠛蛯嵗恼Z義可以通過集合和集合間的映射關系進行表示,得到數學模型如圖2所示。

圖2 實例化的數學模型
其中,ns1、ns2、ns3是集合 NS中的對象,t1、t2、t3是集合T中的對象,tm1、tm2是集合TM中的對象。ns1對象實例化得到集合T,T中的元素是ns1對象的實例;ns3對象實例化得到集合TM,TM中的元素是ns3對象的實例;ns2對象實例化得到集合FS,FS中的元素是ns2對象的實例。
上兩節通過數學工具分析了繼承和實例化的語義,通過將公式(4)、(5)與公式(9)-(14)比較發現,繼承和實例化兩種方式都可以表示為集合之間的包含關系,且兩種方式的數學語義相同。既然兩種方式語義相同并且都可以實現對象的重用,那么什么情況下使用繼承方式實現對象重用,什么情況下使用實例化方式實現對象重用是基于MDA思想的軟件開發過程中模型的表示環節需要解決的關鍵問題。
下文首先討論建模人員建模和建模工具設計人員設計建模工具的方法,分析了建模工具設計人員創建建模工具過程和建模人員使用建模工具建模過程中繼承和實例化兩種方式實現重用的內容,從而解決了上述問題。
本節圍繞模型表示過程中如何在適當的場景選用適當的方法的問題。首先介紹建模人員通過實例化類圖元模型創建類圖的場景,然后介紹建模工具設計人員通過繼承或實例化方式擴展類圖的表達能力的場景,最后根據建模人員和建模工具設計人員在模型的表示過程中的分工場景給出結論。
UML建模人員使用類圖進行建模實際上完成了在M1模型層對M0信息層的抽象和在M1模型層實例化M2層的元模型兩個過程。建模人員首先根據認識客觀世界的思維方式對客觀世界中的對象進行分類形成M0信息層的一個個集合并將每個集合抽象為M1層類圖中一個概念,接著實例化M2層類圖元模型中的元元素得到M1層類圖中表示上述概念的一個個類、關聯和屬性等元素。圖3展現了該思想。
建模人員將M0層“任課老師”集合抽象為類圖中的一個概念并使用符號“任課老師”命名,然后實例化M2層的Class元元素得到M1層類圖中代表“任課老師”概念的類;將M0層“教學管理員”集合抽象為類圖中的一個類元素并使用符號“教學管理員”命名,然后實例化M2層的Class元元素得到M1層類圖中代表“教學管理員”概念的類;將M0層“教職員工”集合抽象為類圖中的一個概念并使用符號“教職員工”命名,然后實例化M2層的Class元元素得到M1層類圖中代表“教職員工”概念的類;將M0層“學生”集合抽象為類圖中的一個概念并使用符號“學生”命名,然后實例化M2層的Class元元素得到M1層類圖中代表“學生”概念的類;將M0層“用戶”集合抽象為類圖中的一個概念并使用符號“用戶”命名,然后實例化M2層的Class元元素得到M1層類圖中代表“用戶”概念的類。
UML是一種通用的可視化面向對象建模標準,它包含用于描述系統靜態特性的結構模型和描述系統動態特性的行為模型[5]。為使得UML建模人員能夠使用結構模型中的類圖對基于面向對象的系統進行描述。必須解決如何對類圖進行表示的問題。
元模型是一種建模工具,對于建模人員來說,也可以理解它是一種建模方法。建模人員根據建模方法完成模型的創建。UML建模工具設計人員通過實例化M3層元元模型中的八種元元元素,構建了屬于M2層的UML中類圖、用例圖、時序圖和狀態圖等建模工具。對于大多數場景來說,UML建模人員使用類圖、狀態圖等UML建模工具就可以完成自己的建模工作。但對于特定領域建模,UML建模能力還不夠,需要對其進行相應的擴展[5]。

圖3 抽象和實例化過程
為使得用類圖表示的領域模型中包含單表和主從表模式的語義,對類圖的表達能力進行擴展。建模工具人員通過繼承的方將對M2層類圖的元模型中“Association”元元素進行擴展,增加“masterDetail”擴展屬性,使得“Association”元元素的實例具有主從表模式的語義。圖4給出擴展結果。

圖4 擴展的Association元元素
擴展后的“Association”元元素擁有了“masterDetail”屬性,該屬性的數據類型為Boolean型,如果該屬性值為“True”,表示當前領域模型中的關聯實例具有主從表模式的語義;如果如果該屬性值為“False”,表示當前領域模型中的關聯實例具有單表模式的語義。
實際軟件建模工具設計過程中,往往將繼承和實例化兩種方式結合起來使用。圖5表現了實例化和繼承兩種方式擴展元模型的方式。

圖5 實例化和繼承的組合使用
M2層元模型通過M3層元元模型描述,如果當前存在的M3層元元模型存在描述能力不足,建模工具設計人員通過繼承的方式擴展元元模型的語義。完成元元模型擴展后,建模工具設計人員實例化M3層擴展的元元素,在M2層元模型中得到擴展的元元素的實例。實例化M3層擴展的元元模型得到M2層元模型的過程,實際上實例化了M3層擴展前的元元模型。同理,如果M2層元模型不足描述M1層模型的語義,建模工具設計人員直接通過繼承方式在其中的元元素中增加一個屬性或增加一個新的元元素,這種方式不改變擴展前的元模型結構。實例化擴展M2層擴展的元模型得到M1層模型的過程,實際上實例化了M2層擴展前的元模型。
根據上述建模人員和建模工具設計人員在模型的表示過程中的分工場景可知,采用繼承的方式時,重用者扮演軟件建模工具設計人員的角色。他們在M2層通過繼承的方式將具有新語義的元元素繼承原有的元元素,實現對元模型語義的擴展以及被擴展元元素語義的重用;采用實例化的方式時,重用者扮演軟件建模人員的角色。他們通過實例化M2層元模型建立M1層的模型,實現使用模型描述客觀世界中的對象、對象的特性和對象與對象之間的關系等。因為實例化過程可以使用相同的建模工具描述不同的應用場景,所以實例化實現了建模工具的重用。建模工具設計人員有時也在M3層采用繼承的方式擴展元元模型,然后實例化元元模型得到M2層的元模型,進而建立建模工具。這種方式中建模工具被看作一個模型,建模工具設計人員扮演了建模人員的角色。創建建模工具的過程實際上完成了建模人員通過實例化建立模型的過程。
綜上所述,當在基于MDA的軟件開發過程中完成實現模型的表示時,如果要對建模工具進行設計,則扮演建模工具設計人員角色,使用繼承或繼承結合實例化的方式實現重用;如果要對某個特定場景進行建模,則扮演建模人員的角色,使用實例化的方式實現重用。
本節通過程序設計自主學習系統中一個使用繼承和實例化對模型進行表示的實例來具體說明如何在適當的情況選用適合的方式完成模型的表示。該實例主要分為兩個部分,首先介紹在PD實現平臺下建模工具設計人員通過UML Profile機制擴展類圖元模型得到類圖建模工具;然后介紹建模人員使用擴展后的類圖建模工具建模。
《C++程序設計教程》是我校大部分理工科學生的公共基礎課程,其教學目的是培養學生的計算思維能力和讀程序基本能力。但通過任課老師課堂授課方式難以滿足學生學習的要求并且當前存在的自主學習軟件也不能完全體現我校教學的特色和重點。因此,根據我校學生的實際情況需設計一個程序設計自主學習系統,為對學習程序設計感興趣的學生服務。
建模人員在PD中通過其支持的UML Profile機制,使用資源文件編輯器對類圖元模型中Association元元素進行擴展,選擇“Association”元元素并添加“masterDetail”擴展屬性,設置其“Data type”值為“Boolean”。圖6展示了擴展屬性的創建結果。

圖6 創建擴展屬性
其次,再在“Association”元元素下添加一個Form,其“Type”值為屬性選項卡,并將“masterDetail”擴展屬性通過復選框的形式在Tab中進行表示,如果復選框被勾選,表示masterDetail”擴展屬性值為True,反之為False,默認值為False。圖7展示了添加“masterDetail”擴展屬性到屬性選項卡后的結果。

圖7 在屬性選項卡中添加擴展屬性
通過上訴兩個步驟,建模工具設計人員在PD實現工具中完成了對類圖元模型中“Association”元元素的擴展,接下來建模人員就可以使用擴展后的建模工具進行建模。
建模人員在PD中通過實例化類圖元模型中的元元素創建描述學生練習和任課教師出題的領域模型,得到的類圖表示的領域模型如圖8所示。

圖8 學生練習和任課教師出題的領域模型
如圖9所示,查看領域模型中關聯元素的屬性,領域模型中的關聯元素擁有了主從表模式的語義。建模人員在建模時可以自主選擇當前關聯元素擁有的語義是主從表模式還是單表模式。

圖9 擴展屬性的結果展示
在基于MDA的軟件開發過程中,分析繼承和實例化兩種方式的應用場景,進而指導模型的表示過程是本文工作的主要目的。目前國內外研究者在研究基于MDA的軟件開發過程中模型的表示時使用到了繼承和實例化兩種方式。
文獻[6]為解決如何在MDA框架下以設計模式為單元進行建模和轉換兩個問題,擴展CMOF元元模型后得到自己定義的模式單元元模型。通過RolePlay綁定機制,解決了業務模型與模式模型的組合問題和模式單元建模問題。另外,它們在該模式元模型的基礎上定義了向EJB平臺的轉換規則,解決了以模式為單元的轉換問題。
文獻[7]為解決設計模式建模中存在模式消失和模式組合復雜化等問題,根據MDA和“角色”的建模思想,對設計模式中通用元素的元模型進行了擴展,提出了基于Ecore的設計模式建模以及模型轉換的途徑,為在MDA框架中圍繞設計模式構建模型和實現模型轉換提供了一種有效的指導。
文獻[8]為解決安全苛求系統通常采用冗余配置來增強系統的可靠性,但是冗余結構增加了安全苛求系統的復雜度。為了解決這個問題,他們通過構造型擴展UML對系統冗余結構的描述并提供一個語義對照表,用來確定模型中的元素、關聯和構造型語義以及相對應的故障樹實現方法,提出一種與故障樹生成相關的系統UML模型擴展方法。
文獻[9]為解決統一建模語言的活動圖是描述系統功能的強有力的語言,但它缺乏用于區別地捕獲上下文感知系統的上下文感知需求的符號等問題,提出了具有新的符號的統一建模語言的活動圖的擴展,其使得能夠將系統功能進行分離。并通過使用一些真實世界的案例證明了提出的擴展方法的可行性。
文獻[10]為了解決特征變更在建模過程導致的漣漪效應以及因此產生新的共性和可變性演化。他們認為現有的分析方法還無法解決這個問題,會導致丟失一些潛在的產品共性,從而影響復用的效率。為了解決上述問題,他們提出了一種特征模型擴展和演化分析方法,該方法通過擴展特征關聯關系和模型演化元操作,實現對特征變更漣漪效應的分析,最后通過案例驗證該方法的可行性。
上述研究者的研究過程只是討論了在模型的表示過程中采用繼承方式對元模型進行擴展和采用實例化的方式完成模型的創建過程。與上述研究內容相比,本文分析了在模型表示中什么情況下選擇繼承實現重用,什么情況下選擇實例化實現重用,為基于MDA的軟件開發過程中模型的表示方法的選擇提供了理論基礎。
MDA是一種基于模型驅動的軟件開發思想,它將模型看作整個開發過程中一個重要的單元,因此完成模型的表示是使用模型推動MDA軟件開發過程的前提。本文為了解決在模型表示過程中如何選擇繼承和實例化方式的問題,分析了人們認識客觀世界的思維方式與繼承和實例化的對應關系,分析了在模型的表示過程中建模工具設計人員設計建模工具和建模人員使用建模工具建模的場景,給出了合適選用繼承,合適選用實例化實現重用的依據。
在下一步工作中,我們將研究如何將通過繼承和實例化兩種方式表示出的模型應用到基于MDA的模型轉換中,使得轉換過程能夠根據源模型包含的語義轉換為目標模型。