<name></name>陳宇
2005 年 8 月
MDA的概念來(lái)自于OMG的規(guī)范,按照它的說(shuō)法,MDA提供了一種開放的、供應(yīng)商中立的 方法以應(yīng)對(duì)商業(yè)與技術(shù)變化的挑戰(zhàn)。實(shí)際上,在真正應(yīng)用這種技術(shù)的時(shí)候,開發(fā)人員 面臨著更大的挑戰(zhàn),就是需要在面向?qū)ο螅∣O)開發(fā)的基礎(chǔ)上加入以模型為中心的思想。
1 I.MDA概述
1.1 定義
MDA的概念來(lái)自于OMG的規(guī)范,按照它的說(shuō)法,MDA提供了一種開放的、供應(yīng)商中立的 方法以應(yīng)對(duì)商業(yè)與技術(shù)變化的挑戰(zhàn)。實(shí)際上,在真正應(yīng)用這種技術(shù)的時(shí)候,開發(fā)人員 面臨著更大的挑戰(zhàn),就是需要在面向?qū)ο螅∣O)開發(fā)的基礎(chǔ)上加入以模型為中心的思想。
MDA
是把建模語(yǔ)言作為編程語(yǔ)言來(lái)使用而不僅僅作為設(shè)計(jì)語(yǔ)言, 用模型語(yǔ)言編程能夠帶來(lái)提升生產(chǎn)力,軟件質(zhì)量以及更長(zhǎng)遠(yuǎn)的好處。
1.2 目標(biāo)
真正達(dá)到重用模型,實(shí)現(xiàn)以模型為中心的開發(fā)方式和使模型真正成為可復(fù)用資產(chǎn)。
對(duì)于厭倦了一遍遍在編碼層解決在建模的抽象層中同樣的問(wèn)題提出徹底的解決辦法。
最小成本適應(yīng)不同平臺(tái)間的遷移。
1.3 相關(guān)概念
UML、MOF、XMI、JMI、XML、J2EE、EJB、.NET、PIM、PSM
1.4 關(guān)于MDA的誤解
1) MDA不是代碼自動(dòng)生成的規(guī)范,相反它的目標(biāo)是盡量減少自動(dòng)生成的代碼。
2) MDA不是代替RUP,XP等軟件工程的傳統(tǒng)開發(fā)過(guò)程,而是對(duì)這些開發(fā)過(guò)程一個(gè)有益的補(bǔ)充,特別是直接將分析設(shè)計(jì)階段所產(chǎn)生的模型應(yīng)用于編寫程序,并最終影響部署后的系統(tǒng)行為方式。
3) 你所說(shuō)的這種MDA實(shí)現(xiàn)還沒有達(dá)到開發(fā)企業(yè)級(jí)應(yīng)用的階段,換句話說(shuō),根本不實(shí)際。其實(shí),現(xiàn)在不僅僅有商業(yè)化的實(shí)現(xiàn),也有很優(yōu)秀的開源MDA平臺(tái),例如,openMDX
1.5 其他介紹文章
* An introduction to Model Driven Architecture (Part I)
See document: 3100.html
* An introduction to Model Driven Architecture (Part II)
See document: index.html
* An introduction to Model Driven Architecture (Part III)
See document: index.html
2 II.MDA開源產(chǎn)品比較
對(duì)于MDA的實(shí)現(xiàn)來(lái)說(shuō),現(xiàn)在有兩種不同的途徑:I)使用模型驅(qū)動(dòng)應(yīng)用開發(fā)過(guò)程;II)直接利用模型驅(qū)動(dòng)運(yùn)行時(shí)應(yīng)用系統(tǒng)的行為方式。前一種實(shí)現(xiàn),大部分支持從UML模型轉(zhuǎn)換的代碼生成工具都可以歸入此類,例如AndroMDA,而后一種實(shí)現(xiàn)就比較少,例如openMDX。
這兩種方式?jīng)]有優(yōu)劣之分,只是取決于你的應(yīng)用目的而有不同的側(cè)重。
2.1 AndroMDA
AndroMDA的功能非常強(qiáng)大,主要用途在于從UML模型生成Hibernate,EJB,Spring,WebServices,和Struts等框架標(biāo)準(zhǔn)對(duì)應(yīng)的代碼, 在開發(fā)過(guò)程的建模階段可以快速生成可運(yùn)行原型,就此而言它是非常實(shí)用有效的工具,但是它的代價(jià)就是增加了很多對(duì)應(yīng)各種框架類的 stereotype,這樣的模型事實(shí)上已不能再算作PIM了,這樣既不利于平臺(tái)的遷移和模型的復(fù)用。而openMDX則僅僅使用了兩個(gè)用于 語(yǔ)義描述的stereotype,這樣的模型顯得更加中立,更面向業(yè)務(wù)建模的視角。
在Struts和Spring已經(jīng)成為事實(shí)上的J2EE框架標(biāo)準(zhǔn)的情況下,AndroMDA能夠滿足很多J2EE項(xiàng)目的框架要求,并且節(jié)約了很多重復(fù)性的編碼工時(shí),特別是,相對(duì)于采用手工編寫此種代碼,避免了可能出現(xiàn)的"手誤"。
AndroMDA的長(zhǎng)處也正是它的短處,因?yàn)橥耆嫦騄2EE平臺(tái)開發(fā),對(duì)于通用、中立的類型沒有定義,也缺少對(duì)于屬性的特性支持,比如持久性屬性和導(dǎo)出屬性的區(qū)分。在模型的表達(dá)上,仍然是更傾向于從技術(shù)框架的角度進(jìn)行建模和描述系統(tǒng)行為。
另外還有一個(gè)通常的"代碼生成器"都有的問(wèn)題,就是對(duì)于模型的修改生成會(huì)覆蓋掉手工修改的代碼, 這僅僅是因?yàn)闆]有哪個(gè)流行的架構(gòu)會(huì)完全采用JMI或者接口編程的方式,這樣就很難避免在第一次生成代碼之后,需要小心再次生成模型可能會(huì)影響到的手工編寫的代碼。
2.2 openMDX
openMDX擁有自己獨(dú)立的中立性框架,支持J2EE、.Net和CORBA平臺(tái)等,同時(shí)具有極大的靈活性和擴(kuò)展性。基于openMDX的系統(tǒng),從桌面應(yīng)用程序到完全分布式應(yīng)用的轉(zhuǎn)化, 不需要改變一行代碼。在openMDX所使用的模型中,也沒有采用私有的模型標(biāo)簽和功能增強(qiáng)。openMDX沒有提供UML模型工具,但是支持所有主流的UML模型工具:Rational Rose, MagicDraw, Poseidon, Together等。現(xiàn)有的插件已經(jīng)提供了基本功能: 持久性,審核,歷史記錄和角色以及強(qiáng)大的日志功能。攜帶了一個(gè)集成的完整的界面生成引擎。
但是缺點(diǎn)也是顯見的,由于采用的框架完全圍繞模型來(lái)運(yùn)行和部署,迫使開發(fā)人員從習(xí)慣的開發(fā)方式和設(shè)計(jì)思考模式轉(zhuǎn)變到完全不同的重心上。例如,不再首先考慮UI,業(yè)務(wù)層,持久層所采用的方式和數(shù)據(jù)庫(kù)結(jié)構(gòu)等在以前的開發(fā)過(guò)程中作為核心的部分,而是首先考慮業(yè)務(wù)模型中的對(duì)象及其關(guān)聯(lián)關(guān)系,當(dāng)然這在真正的業(yè)務(wù)建模中是核心部分,OpenMDX將模型的這種核心地位延伸到了開發(fā)、部署和交付使用階段。
另外,openMDX也沒有提供一個(gè)IDE來(lái)支持整個(gè)開發(fā)測(cè)試和配置應(yīng)用。
對(duì)于這種苛刻的MDA實(shí)現(xiàn)方式,下面將介紹對(duì)于企業(yè)應(yīng)用系統(tǒng)來(lái)說(shuō)所帶來(lái)的利益。
3 III.openMDX帶來(lái)的利益
3.1 完全開源
開源軟件的好處在這里就不作討論了,OpenMDX提供了除了源代碼以外更多的東西,包括所有模型文件,API文檔,以及幾個(gè)不同使用方式的實(shí)例,甚至還有基于openMDX的完全開源的項(xiàng)目--一個(gè)企業(yè)級(jí)CRM應(yīng)用,openCRX。
3.2 提供了基于標(biāo)準(zhǔn)(J2EE、.NET等)的基礎(chǔ)架構(gòu)
基于openMDX的應(yīng)用可以很輕松的移植到多個(gè)不同平臺(tái),采用了MOF,JMI,XRI,XML等標(biāo)準(zhǔn)和協(xié)議,不用過(guò)多考慮會(huì)被綁定于某一平臺(tái)。
3.3 快速開發(fā)、部署和彈性配置
建立了成熟模型之后,開發(fā)測(cè)試的工作量降低到了難以想象的地步,舉例來(lái)說(shuō),openCRX總共兩百天的開發(fā)過(guò)程中,建模占了100天,界面設(shè)計(jì)定制用了70天,10天用于實(shí)現(xiàn),20天用于測(cè)試部署。
3.4 極強(qiáng)的系統(tǒng)互操作性
openMDX平臺(tái)上發(fā)布的功能模塊,對(duì)于數(shù)據(jù)的導(dǎo)入導(dǎo)出都是基于Schema-XML,而且可以方便的發(fā)布為Webservice,跟其他異種系統(tǒng)的交互達(dá)到了輕松自如的地步。
3.5 降低總體擁有成本(TCO)
不僅僅因?yàn)槠脚_(tái)本身是開源軟件,而且更因?yàn)榛贛DA規(guī)范,使得模型的重用得以實(shí)現(xiàn),并且可以積累對(duì)于企業(yè)更有價(jià)值的部分--業(yè)務(wù)模型。對(duì)模型變更的快速響應(yīng),能夠在幾分鐘內(nèi)實(shí)現(xiàn)從模型修改到生成代碼并部署運(yùn)行的整個(gè)開發(fā)過(guò)程。
4 IV.基于openMDX的開發(fā)過(guò)程
4.1 openMDX開發(fā)過(guò)程簡(jiǎn)介
openMDX 是一個(gè)OMG Model Driven Architecture(MDA)為起始的高級(jí)實(shí)現(xiàn).openMDX是一個(gè)工業(yè)化的,開放的,模型驅(qū)動(dòng)的運(yùn)行時(shí)引擎和平臺(tái)獨(dú)立模型(PIMs)框架。 不象大多數(shù)商業(yè)工具,openMDX 沒有實(shí)現(xiàn)PIM到PSM映射的方法。 而是提供了一個(gè)普通的,分布式的對(duì)象引擎(作為PIM 平臺(tái))。商業(yè)邏輯(模型的導(dǎo)出屬性和方法)是作為插件添加進(jìn)去的。下圖說(shuō)明了OpenMDX在軟件開發(fā)過(guò)程中所起到的作用:
-
建模: 創(chuàng)建PIM。當(dāng)前版本中, openMDX 僅僅需要與MOF兼容的類圖中的靜態(tài)模型圖,其他對(duì)系統(tǒng)行為建模的圖則暫不被支持,對(duì)于UML動(dòng)作語(yǔ)義和活動(dòng)圖和狀態(tài)圖的支持將在以后的版本中作為可選項(xiàng)加入。 openMDX 提供了工具將兼容MOF的模型映射, 即采用了JMI和 XMI 的映射。由MOF 映射所定義,類圖表達(dá)了一個(gè)組件對(duì)外的行為規(guī)范, 例如組件的接口。
-
開發(fā): 在這一步中開發(fā)者編寫客戶端和服務(wù)端的代碼。要注意,就像以后會(huì)看到的,現(xiàn)在手工編寫的代碼是平臺(tái)獨(dú)立的。
-
部署: 將生成的MOF 映射, 手工編寫的代碼, 部署信息和openMDX運(yùn)行時(shí)環(huán)境,在部署階段集成在一個(gè)可運(yùn)行、可部署的應(yīng)用服務(wù)平臺(tái)上,例如,J2EE應(yīng)用服務(wù)器、.Net服務(wù)器等。
openMDX 并未覆蓋整個(gè)開發(fā)過(guò)程。它沒有支持諸如需求工程,測(cè)試等階段的工作。 當(dāng)然,所有這些階段都是開發(fā)應(yīng)用的基礎(chǔ)階段。
4.2 openMDX模型基礎(chǔ)及Hello-World實(shí)例簡(jiǎn)介
在openMDX的發(fā)布包中,有一個(gè)Hello-World的實(shí)例,在文檔中有一篇《openMDX Quick Start》是專門介紹這個(gè)實(shí)例的配置運(yùn)行方法的,在這里不再贅述,只是討論以下幾個(gè)要點(diǎn),為下一篇的深入介紹做好基本概念的準(zhǔn)備:
1.在openMDX中,代碼與模型的關(guān)系
2.在基于openMDX的模型中所用到的一些UML概念
3.w3c的基本類型介紹
4.openMDX中所用到的stereotype的介紹
5.Hello-World的模型
1.在openMDX中,代碼與模型的關(guān)系
在基于openMDX的開發(fā)過(guò)程中,一旦模型創(chuàng)建完畢,并符合openMDX的建模規(guī)則,即可使用Ant構(gòu)建生成基于openMDX的工程。其中,使用generate target可以導(dǎo)出模型,分別生成對(duì)應(yīng)JMI和XMI標(biāo)準(zhǔn)的文檔,其中前者是java代碼,后者是XML格式的模型定義文件。搭建起Hello-World在Eclipse中的工程環(huán)境之后,可以很清晰的看出,自動(dòng)生成代碼和手工編寫的代碼是分放在兩個(gè)不同的目錄中,而對(duì)于導(dǎo)出屬性和操作則是通過(guò)delegate(委托)的方式去執(zhí)行手工編寫代碼的,而其中的委托關(guān)系,是以package(包,包括java類中的包和UML/MOF模型中的包的含義)為單位去配置映射關(guān)系的。關(guān)于JMI和XMI在openMDX中的具體作用和運(yùn)行調(diào)用關(guān)系,請(qǐng)參考《openMDX Introduction》。
2.在基于openMDX的模型中所用到的一些UML概念
openMDX的模型是兼容MOF標(biāo)準(zhǔn)的,另外加入了對(duì)于quarlifier(限定符)的支持。如果你對(duì)UML/MOF建模已經(jīng)非常了解,那么可能只需要熟悉幾種openMDX中常用的關(guān)聯(lián)關(guān)系和設(shè)計(jì)慣例。由于openMDX采用了XRI協(xié)議訪問(wèn)所有的應(yīng)用資源(包括模型、包、類、對(duì)象/實(shí)例),所以所有類圖模型中所定義的實(shí)體類都必須被每個(gè)包中的Segment直接或者間接的包含并且是可導(dǎo)航的,而其他作為參數(shù)或者返回結(jié)果定義的類(stereotype為Struct)和作為抽象類用于被繼承的類(stereotype為root)則可以單獨(dú)存在。
3.w3c的基本類型
在openMDX的模型中,有一個(gè)org::w3c的包,其中定義了幾種標(biāo)準(zhǔn)的原始類型,是作為模型中的基本數(shù)據(jù)類型存在的,并且具有中立性,由OpenMDX平臺(tái)負(fù)責(zé)對(duì)這幾種基本類型到具體語(yǔ)言平臺(tái)的映射。
4.openMDX中所用到的stereotype的介紹
"0..1" (針對(duì)屬性的修飾版類, 表明這是個(gè)可選的屬性)
"list" (針對(duì)屬性的修飾版類, 表明這是一個(gè)沒有空值的排序集合)
"set" (針對(duì)屬性的修飾版類, 表明這是一個(gè)不重復(fù)的未排序集合)
"sparsearray" (針對(duì)屬性的修飾版類, 表明這是一個(gè)允許空值的散列數(shù)組)
"stream" (針對(duì)屬性的修飾版類,對(duì)于類型是org::w3c::string 和org::w3c::binary 的屬性,表明這是字符或者二進(jìn)制流)
openMDX中的每個(gè)包含關(guān)系都需要一個(gè)類型為org::w3c::string 的quarlifier(限定符) "alias" (針對(duì)類的修飾版類,允許通過(guò)別名引用到一個(gè)給定類)
"root" (針對(duì)類的修飾版類,允許其他"root"或者非"root"類由此類繼承
"primitive" (針對(duì)類的修飾版類,表明了此類是原始類型,并由openMDX核心所支持
5.Hello-World的模型
下圖是此實(shí)例的初始模型圖:
注意在poseidon工具界面左方的面板里面,HelloWorld類的節(jié)點(diǎn)下面重復(fù)性的包含了SayHelloResult類的定義,如下圖所示:
因此,在做模型擴(kuò)展的時(shí)候,需要注意,增加了SayGoodbyeResult類之后,同樣要在HelloWorld類中復(fù)制一份。否則,在使用Ant構(gòu)建工程時(shí),會(huì)報(bào)不匹配建模規(guī)則的錯(cuò)誤。好在使用其他工具,比如Rose時(shí),不會(huì)有這樣麻煩的需求。
Hello-World的模型非常簡(jiǎn)單,沒有涉及到類與類之間的關(guān)聯(lián)以及對(duì)象實(shí)例的持久化等問(wèn)題,這些將在后面的部分進(jìn)一步講述。
|