劉磊 周業(yè)林 楊小兵
摘要:模型驅(qū)動(dòng)架構(gòu)(Model Driven Architecture,MDA)是一種先進(jìn)、系統(tǒng)、高效的軟件開發(fā)方法。然而掌握MDA模型轉(zhuǎn)換和實(shí)現(xiàn)完整代碼生成,具有一定的難度。在研究元建模技術(shù)的基礎(chǔ)上,對(duì)領(lǐng)域建模語(yǔ)言(Domain Specific Language,DSL)與元建模相結(jié)合的開發(fā)方法進(jìn)行了探索,該方法基于MDA以模型為中心的思想,能快速通過(guò)模型轉(zhuǎn)換實(shí)現(xiàn)完整代碼的生成,易用性提高。結(jié)合Web應(yīng)用系統(tǒng)這個(gè)領(lǐng)域,利用領(lǐng)域型元建模工具M(jìn)etaEdit+,以學(xué)生健康信息收集系統(tǒng)的開發(fā)為例,驗(yàn)證了領(lǐng)域元建模開發(fā)方式在解決領(lǐng)域問(wèn)題上的可行性。
關(guān)鍵詞:模型驅(qū)動(dòng);模型轉(zhuǎn)化;代碼生成;領(lǐng)域語(yǔ)言;元建模;建模工具
中圖分類號(hào):TP31文獻(xiàn)標(biāo)志碼:A文章編號(hào):1008-1739(2023)01-54-5
當(dāng)今社會(huì),人們的工作生活更加依賴各類信息系統(tǒng)提供的便利化管理和服務(wù),各行業(yè)軟件開發(fā)需求大量增長(zhǎng)。傳統(tǒng)的開發(fā)方式以編寫代碼為核心,存在文檔和代碼容易脫節(jié)、系統(tǒng)平臺(tái)轉(zhuǎn)換麻煩以及投入人力、物力高的問(wèn)題。2001年,國(guó)際對(duì)象管理組織提出了模型驅(qū)動(dòng)架構(gòu)(Model Driven Architecture, MDA)的方法[1],以模型為中心,通過(guò)模型轉(zhuǎn)換,自動(dòng)生成程序代碼,這樣的方式可以有效地解決傳統(tǒng)開發(fā)方式存在的文檔和代碼不能統(tǒng)一的問(wèn)題。然而隨著時(shí)間的推移,MDA的開發(fā)方式并沒(méi)有大規(guī)模得到應(yīng)用和推廣。而以建立建模語(yǔ)言的元建模技術(shù)卻正在逐漸興起,元建模技術(shù)是一種輕量化的MDA,在元建模工具的支持下,能高效地實(shí)現(xiàn)形式化建模和完整的代碼轉(zhuǎn)化。針對(duì)不同的問(wèn)題領(lǐng)域,領(lǐng)域建模語(yǔ)言與元建模技術(shù)相結(jié)合可以更好地針對(duì)問(wèn)題本身,解決問(wèn)題,滿足用戶的需求,并實(shí)現(xiàn)代碼自動(dòng)生成。
MDA沒(méi)有廣泛地推廣和應(yīng)用,綜合分析主要有2方面原因:一是模型轉(zhuǎn)換復(fù)雜,不易于掌握和使用。模型轉(zhuǎn)換是MDA開發(fā)方法的核心。模型轉(zhuǎn)換是通過(guò)模型轉(zhuǎn)換工具,按照定義的轉(zhuǎn)換規(guī)則,將源模型轉(zhuǎn)換成為目標(biāo)模型的過(guò)程。隨著模型轉(zhuǎn)換開發(fā)工具的推出和改進(jìn),模型轉(zhuǎn)換逐漸得到了應(yīng)用。然而,模型轉(zhuǎn)換并不像人們想象的那樣容易。模型之間的轉(zhuǎn)換就分好幾種類型,包括PIMtoPIM,PIMtoPSM,PSMtoPSM,PSMtoPIM和PSMtoCode等,其中模型轉(zhuǎn)換的技術(shù)也有很多種,很抽象,采用的技術(shù)路線不容易理解,比如:QVT轉(zhuǎn)換方法、基于圖文法的轉(zhuǎn)換和基于結(jié)構(gòu)的轉(zhuǎn)換等[2],一般的開發(fā)人員很難掌握。二是支持MDA的工具軟件還不完善。MDA中最常用的建模工具UML,體系龐大復(fù)雜,支持UML的MDA工具有Rational Rose,Enterprise Architect,IBM Rational Software Architec,Powerdesigner,Trufun等,只能生成部分代碼或是程序框架[3],常規(guī)的操作都被包含在實(shí)體模型中,但是對(duì)于業(yè)務(wù)邏輯的操作,只產(chǎn)生空的方法體[4],與生成完整應(yīng)用系統(tǒng)還有相當(dāng)?shù)牟罹?,這也制約了MDA真正投入到日常的軟件開發(fā)過(guò)程,國(guó)產(chǎn)支持MDA的工具軟件更是寥寥無(wú)幾。
要理解元建模首先要了解元模型。模型是對(duì)現(xiàn)實(shí)世界事物的一種抽象和概括,元模型是定義模型的模型,它是對(duì)模型的構(gòu)成進(jìn)行更高層次的抽象,元模型的構(gòu)成還可以繼續(xù)抽象,抽象形成的模型稱為元元模型,從理論上說(shuō),抽象還可以繼續(xù)延伸深化,但抽象到了一定的層次已經(jīng)可以解決建模的問(wèn)題了,過(guò)度的深入沒(méi)有太大的現(xiàn)實(shí)意義。OMG專門為模型的實(shí)現(xiàn)和抽象制定了核心標(biāo)準(zhǔn)即元對(duì)象機(jī)制(Meta-Object Facility,MOF)[5],其結(jié)構(gòu)如圖1所示。
MOF是一個(gè)4層模型,從下到上是逐漸抽象的過(guò)程是逐漸實(shí)現(xiàn)的過(guò)程,也是模型轉(zhuǎn)換的過(guò)程。M0層的對(duì)象是M1層對(duì)象的實(shí)例,M1層對(duì)象是M2層對(duì)象的實(shí)例,M2層對(duì)象是M3層對(duì)象的實(shí)例,這里的實(shí)例是相對(duì)于上一層模型而言,并不完全都是實(shí)現(xiàn),只有M0層是具體的事物。MOF位于M3層,是最高層次的抽象,MOF可以自己構(gòu)造自己,自己描述自己。常見(jiàn)的用UML建立的模型屬于M1層,UML的元模型屬于M2層。同樣,用DSL建立的模型屬于M1層,而DSL元模型屬于M2層。本文研究的元建模是指處于M2層的DSL元模型。
元建模指的是建立一種帶語(yǔ)義描述建模語(yǔ)言的元模型[5],需要有支持相關(guān)建模語(yǔ)言的工具。通過(guò)這個(gè)工具來(lái)設(shè)計(jì)、呈現(xiàn)這個(gè)元模型。
3.1建模語(yǔ)言
軟件開發(fā)是為了解決問(wèn)題,問(wèn)題是有領(lǐng)域的,因此,軟件開發(fā)也面臨問(wèn)題領(lǐng)域。對(duì)于建模語(yǔ)言來(lái)說(shuō),相應(yīng)可以按照適用范圍,分為通用語(yǔ)言(General Purpose Language,GPL)和領(lǐng)域語(yǔ)言(Domain Specific Language,DSL)。GPL常見(jiàn)的有UML,C和Python等語(yǔ)言,優(yōu)點(diǎn)是適用面廣,缺點(diǎn)是太通用、不聚焦,不能很好地表達(dá)一些具體問(wèn)題。UML作為一種通用建模語(yǔ)言,支持其建模的工具是最多的,然而UML過(guò)于通用和復(fù)雜,從UML模型生成完整的應(yīng)用系統(tǒng)是很困難的,其包含大部分抽象概念,不是來(lái)自于問(wèn)題域的抽象,導(dǎo)致UML中描述的模型與問(wèn)題域存在一定的差異。DSL常見(jiàn)的有HTML,SQL和MERL等,優(yōu)點(diǎn)在于貼近問(wèn)題域,對(duì)于領(lǐng)域設(shè)計(jì)人員而言,領(lǐng)域建模語(yǔ)言學(xué)習(xí)起來(lái)更容易,從領(lǐng)域模型生成程序相對(duì)容易。根據(jù)資料顯示,基于元建模的領(lǐng)域建模要比基于UML的效率高出10倍[5]。元建模開發(fā)示意如圖2所示。
3.2建模工具
元建模除了建模的理論,還需要有強(qiáng)大的工具軟件來(lái)整合配置元元模型、模型,并實(shí)現(xiàn)模型到相關(guān)平臺(tái)代碼的自動(dòng)生成。因此元建模工具是非常關(guān)鍵的。現(xiàn)在出現(xiàn)了不少元建模工具,常見(jiàn)的有GME,EMF,Visual Studio DSL,GMF和MetaEdit+等。EMF是Eclipse的一項(xiàng)全新的建模框架,該框架允許代碼自動(dòng)生成,支持模型和元數(shù)據(jù)管理,可高效完成模型轉(zhuǎn)換,生成的模型可轉(zhuǎn)換為Java代碼,在現(xiàn)有工具中具有強(qiáng)大的生命力[6]。Visual Studio DSL是Windows平臺(tái)下的圖形化工具,包括元建模環(huán)境和代碼生成,除了提供模型與圖形之間的支持,還提供了對(duì)模型的驗(yàn)證、規(guī)則和事務(wù)的支持[7]。GME是美國(guó)范德比特大學(xué)研發(fā)的一款元建模工具,其元模型是建立在UML基礎(chǔ)上,并利用關(guān)系數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)[8]。GMF提供了圖形化的開發(fā)環(huán)境和基本的框架,設(shè)計(jì)人員可在圖形環(huán)境中定制自己的領(lǐng)域模型,并自動(dòng)生成代碼框架[9]。MetaEdit+具有專屬的元建模語(yǔ)言和生成器定義語(yǔ)言,不需要依賴UML的模型,具有靈活的DSL定義功能,不需要手工編寫代碼,代碼生成器具備強(qiáng)有力的代碼生成功能[10]。MetaEdit+可以快速設(shè)計(jì)建模語(yǔ)言而且成本低廉,適用于信息系統(tǒng)的開發(fā),工具的幫助文檔內(nèi)容十分友好,方便進(jìn)行學(xué)習(xí)和使用。
3.3建??蚣?/p>
元建模框架是元建模的開發(fā)的模式和架構(gòu),發(fā)展到現(xiàn)在,元建模框架結(jié)構(gòu)主要有2種類型[11]:
①基于通用建模工具的元建模
這是最常用的一種架構(gòu),以通用建模工具為核心。開發(fā)人員使用通用建模工具建立某個(gè)領(lǐng)域的元模型;用元模型來(lái)對(duì)通用建模工具做配置,使通用建模工具成為支持該元模型的建模工具,通過(guò)配置過(guò)的建模工具來(lái)生成應(yīng)用的源代碼。其優(yōu)點(diǎn)是支持多種元模型進(jìn)行配置,從而支持多種建模語(yǔ)言。這類元建模工具有MetaEdit+,GME等。
②基于專用建模工具的元建模
定制生成一個(gè)專用的建模工具,通過(guò)這個(gè)建模工具來(lái)生成應(yīng)用的源代碼。這種建模方式的優(yōu)點(diǎn)是建模工具是定制、對(duì)建模的支持更好,缺點(diǎn)是使用難度較大,采用這種架構(gòu)的元建模工具主要有EMF和GMF。
通過(guò)元建模工具及架構(gòu)的比較,由于MetaEdit+具有功能全面、適用于信息系統(tǒng)開發(fā),使用相對(duì)容易,且有良好的文檔支持、能快速建模的特點(diǎn),因此,選擇MetaEdit+作為研究領(lǐng)域元建模開發(fā)的建模工具。
為了領(lǐng)域建模語(yǔ)言+元建模能實(shí)現(xiàn)基于MDA的元建模架構(gòu)開發(fā),并最終生成系統(tǒng)代碼,將通過(guò)一個(gè)簡(jiǎn)單的學(xué)生健康收集系統(tǒng)“InfoCollecting”開發(fā)過(guò)程進(jìn)行驗(yàn)證。近2年來(lái),加強(qiáng)新冠肺炎防控,保護(hù)人民群眾生命安全成了日常的一件重大事情。對(duì)于學(xué)校來(lái)說(shuō),校園疫情防控壓力很大,除了定期開展核酸檢測(cè)篩查以外,還必須加強(qiáng)學(xué)生日常健康申報(bào)管理,“InfoCollecting”系統(tǒng)就是以此為背景設(shè)計(jì)。系統(tǒng)有2類活動(dòng)參與者,并且他們對(duì)系統(tǒng)具有以下幾種操作。
①學(xué)生(注冊(cè)系統(tǒng)、登錄系統(tǒng)、健康登記、查詢登記信息、修改密碼和退出系統(tǒng))。
②管理員(登錄系統(tǒng)、更改密碼、查詢登記信息、管理登記信息和退出系統(tǒng))。
4.1系統(tǒng)設(shè)計(jì)模式
InfoCollecting系統(tǒng)主要考慮采用B/S結(jié)構(gòu),系統(tǒng)設(shè)計(jì)模式使用Model-View-Controller,Model層代表業(yè)務(wù)邏輯層最終通過(guò)JavaBeans來(lái)實(shí)現(xiàn),讀寫數(shù)據(jù)庫(kù),View層代表交互界面層最終通過(guò)JSP來(lái)生成、提交和響應(yīng)用戶請(qǐng)求,Controller層代表控制器層,負(fù)責(zé)View層和Model層之間的銜接。
4.2MetaEdit+元建模的主要步驟
MetaEdit+以GOPPRR作為元建模語(yǔ)言,主要包含6種元素,分別是Graph(圖)、Object(對(duì)象)、Property(屬性)、Por(端口)、Relationship(聯(lián)系)和Role(角色)[11]。Graph指一種由對(duì)象及其聯(lián)系組成的圖形;Object指一種事物,用一種圖形符號(hào)來(lái)表示;Property指其他5種元素所具有的特點(diǎn)描述;Port指角色連接對(duì)象的一個(gè)特定位置;Relationship指對(duì)象之間的連接關(guān)系;Role定義了對(duì)象如何參與到一個(gè)聯(lián)系中,如圖3所示。
MetaEdit+元建模的主要步驟如下:
步驟1利用GOPPRR元元模型,設(shè)計(jì)系統(tǒng)元模型
元模型的建立是將應(yīng)用系統(tǒng)涉及的對(duì)象領(lǐng)域概念、數(shù)據(jù)庫(kù)概念的內(nèi)容及它們之間關(guān)聯(lián)抽象成為Objects,Relationships,Roles,Property和Port等元元模型,在通過(guò)這些元元模型來(lái)描述應(yīng)用系統(tǒng),建立Graph圖形元模型。在MetaEdit+中使用Graph Tool工具來(lái)建立圖形元模型。圖4給出了“InfoCollecting”部分的系統(tǒng)元模型。Graph Tool可以根據(jù)抽象的模型元素創(chuàng)建圖所需的各種對(duì)象、聯(lián)系、角色以及其之間的綁定關(guān)系,圖形還可以包含子圖形和各種約束條件。