當(dāng)你重視目標(biāo)平臺(tái)和中間件時(shí),構(gòu)建基于Web的分布式應(yīng)用會(huì)變得更容易。
?????????????????????????????????????????????????????????????????????????????????????????????????????????―― Peter Varhol??????
??????在軟件開發(fā)中,過去我們經(jīng)??吹介_發(fā)人員犯同樣的錯(cuò)誤。其中意義比較重大,并且長(zhǎng)期以來存在著很大分歧的錯(cuò)誤,就是應(yīng)用架構(gòu)是在特定平臺(tái)和操作系統(tǒng)上寫成的。這個(gè)錯(cuò)誤在大型分布式應(yīng)用中尤其顯著。這種情況在最初時(shí)可能沒什么問題,但是隨著平臺(tái)和操作系統(tǒng)的變化,特別是遇到不可預(yù)見的情況時(shí),問題就暴露出來了。
??????當(dāng)然你可能還要依靠其他一些軟件,例如應(yīng)用服務(wù)器、瀏覽器或者數(shù)據(jù)庫(kù)管理系統(tǒng)。在很多情況下,這些應(yīng)用比底層的硬件和操作系統(tǒng)更加趨向與動(dòng)態(tài)。最終導(dǎo)致的結(jié)果是,當(dāng)?shù)讓拥挠布虿僮飨到y(tǒng)發(fā)生變化時(shí),必須對(duì)應(yīng)用做重大調(diào)整才能使其正常工作在新的環(huán)境下。有些情況就更加糟糕了,一些應(yīng)用的架構(gòu)與它的底層支撐技術(shù)緊密結(jié)合,當(dāng)?shù)讓又渭夹g(shù)發(fā)生變動(dòng)時(shí),往往意味著整個(gè)的上層應(yīng)用都要被推翻重新設(shè)計(jì)。
???????進(jìn)入MDA的世界吧!MDA能夠?qū)?yīng)用框架和其實(shí)現(xiàn)相分離。MDA的支持者希望支撐軟件和硬件的改變不會(huì)使現(xiàn)有的企業(yè)應(yīng)用無(wú)法使用。更重要的是,通過降低應(yīng)用架構(gòu)和其運(yùn)行環(huán)境的耦合度,MDA能夠帶來更加優(yōu)秀的設(shè)計(jì),從而使應(yīng)用壽命更加長(zhǎng)久并且能夠很容易地移植到其他底層平臺(tái)上。
???????如你所料,MDA使基于統(tǒng)一建模語(yǔ)言的(UML)的。當(dāng)然光有UML還遠(yuǎn)遠(yuǎn)不夠,MDA還要使用Meta-Object Facility (MOF) and Common Warehouse Meta-model (CWM)。MDA由許多核心模型、或用于企業(yè)級(jí)開發(fā)和其他一些用于實(shí)時(shí)開發(fā)的框架組成。其他的核心模型將會(huì)逐步作為標(biāo)準(zhǔn)開發(fā)并提供出來。MDA結(jié)構(gòu)和工藝時(shí)對(duì)象建模組織(OMG)的一個(gè)標(biāo)準(zhǔn),COBRA和UML也是這個(gè)組織維護(hù)的。
???????UML提供了能夠清除地描述嵌入式系統(tǒng)的可視化建模技術(shù)。UML定義了幾個(gè)圖形視圖為開發(fā)提供了不同的系統(tǒng)透視圖。每一個(gè)圖標(biāo)表現(xiàn)完整模型的不同方面。例如:用例圖(use-case diagrams)和次序圖(sequence charts)用于分析和確定系統(tǒng);系統(tǒng)的行為可以用狀態(tài)圖(State charts)來建模。盡管每一個(gè)圖表反應(yīng)系統(tǒng)不同的方面,但是他們之間是有交迭的,至少是存在著依賴關(guān)系。UML圖可以軟件架構(gòu)、行為以及與系統(tǒng)其他部分的協(xié)作建模。UML用部署圖(deployment diagrams)描述系統(tǒng)的物理架構(gòu)。部署圖只是用幾個(gè)簡(jiǎn)單的圖像,因此很容易理解和實(shí)施。節(jié)點(diǎn)(Node)代表系統(tǒng)的重要物理對(duì)象。而交互連接(Interconnect)代表物理對(duì)象之間的連接?;顒?dòng)對(duì)象(Active Object)定義了分派給對(duì)象的任務(wù)。節(jié)點(diǎn)可以通過活動(dòng)對(duì)象組合成能夠在平臺(tái)上部署的子系統(tǒng)。
??????協(xié)作有助于決定在全局計(jì)算環(huán)境下應(yīng)用適合什么位置,其中最重要的方面就是確定合適的目標(biāo)平臺(tái)。UML通過使用協(xié)作圖來建模協(xié)作。協(xié)作圖關(guān)注協(xié)作對(duì)象的靜態(tài)結(jié)構(gòu)。也可以是用次序圖來完成這一工作。次序圖描述了對(duì)象之間的信息。
??????應(yīng)用MDA的第一步就是用UML創(chuàng)建應(yīng)用的模型,建模主要集中在建立應(yīng)用的架構(gòu)、行為和協(xié)作。這些模型是平臺(tái)無(wú)關(guān)的。UML以框圖的形式清晰的描述了應(yīng)用的架構(gòu),以及它的行為和其與其他系統(tǒng)元素的協(xié)作。
??????然而,目前為止,我們做的這些還不是軟件的實(shí)現(xiàn)。有很多有效的工具可以幫助你將UML建立的框圖轉(zhuǎn)換成實(shí)際代碼。但是你丟掉了很重要的一個(gè)因素,那就是應(yīng)用可能用到的操作系統(tǒng)和中間件的特性。一個(gè)簡(jiǎn)單的例子就是Windows和對(duì)話框。有時(shí)程序在觀念上就利用操作系統(tǒng)或平臺(tái)(包括Java)服務(wù),在特定平臺(tái)上實(shí)現(xiàn)。
??????因此出現(xiàn)了中間件。要實(shí)現(xiàn)分布式系統(tǒng),就要確定使用CORBA, COM,? Java信息服務(wù)(JMS), Web服務(wù)還是其他支持技術(shù)。在實(shí)現(xiàn)應(yīng)用時(shí)這些技術(shù)都要考慮到,但是這些技術(shù)卻是在建模之外的。
??????那么下一步就是讓將模型轉(zhuǎn)化成。MDA這一步處理的結(jié)果就是使UML模型映射到特定平臺(tái)下的UML模型以及本地平臺(tái)結(jié)構(gòu)。應(yīng)用的UML標(biāo)識(shí)也維護(hù)著相同的內(nèi)容,但是許多通過特定技術(shù)指引實(shí)現(xiàn)的附加信息加入來了。
??????一旦UML模型指向了特定平臺(tái)和特定技術(shù),那么它就可以在那個(gè)平臺(tái)上實(shí)現(xiàn)了。這是另一個(gè)有趣的過程。從特定平臺(tái)上的模型到特定平臺(tái)上的實(shí)現(xiàn),你要作的當(dāng)然不僅僅是代碼生成,而是比代碼生成多得多的事情,尤其是基于Web的分布式應(yīng)用,要做的就更多了。因?yàn)榛赪eb的分布式應(yīng)用要求你組合源文件、配置文件、定義文件和資源文件。用一句話概括,就是你構(gòu)建一個(gè)基于Web的分布式應(yīng)用時(shí)所需要?jiǎng)?chuàng)建的所有文件。
??????這個(gè)方法看起來并不會(huì)給你帶來多少利益除非某些文件創(chuàng)建工程時(shí)自動(dòng)完成的。畢竟僅僅依靠UML模型和代碼生成器,你就得通過模型將代碼生成出來,然后再通過某些方法手工修改代碼使其適應(yīng)你的特定平臺(tái)。讓平臺(tái)相關(guān)模型失去自動(dòng)生成那些代碼的能力可能并不比目前所能作的更加優(yōu)越。然而一旦工具鏈從UML模型延伸到創(chuàng)建平臺(tái)相關(guān)代碼,MDA的優(yōu)勢(shì)就顯現(xiàn)出來了。
??????MDA當(dāng)然不是專門為Java或Java 2 企業(yè)版(J2EE)而存在的。在保持技術(shù)獨(dú)立的前提下,MDA允許使用.NET、J2EE、Web服務(wù)以及其他支持分布式應(yīng)用的技術(shù)來實(shí)現(xiàn)應(yīng)用架構(gòu)。但是Java應(yīng)用,尤其是那些跨系統(tǒng)、跨平臺(tái),使用Web界面的應(yīng)用,最終都可以借助MDA來實(shí)現(xiàn)快速構(gòu)建。
??????MDA對(duì)于J2EE開發(fā)者來說到底意味著什么?由于Java語(yǔ)言的動(dòng)態(tài)屬性以及Java社區(qū)接受新技術(shù)的速度,MDA是延長(zhǎng)應(yīng)用的壽命,使其長(zhǎng)于支持技術(shù)的壽命的唯一可行的方法。然而隨著時(shí)間的流逝,底層技術(shù)也在不斷的發(fā)展,一個(gè)合理架構(gòu)的MDA能讓應(yīng)用持續(xù)有效。
??????Java開發(fā)人員對(duì)此應(yīng)該會(huì)萬(wàn)分激動(dòng)。由于Java社區(qū)的活力,使得Java更新的速度比其他任何語(yǔ)言都快。設(shè)計(jì)應(yīng)用時(shí)可以不需要考慮Java技術(shù)和版本變化帶來的沖擊會(huì)帶來在開發(fā)時(shí)間和可靠性上會(huì)帶來很多好處。很多時(shí)候我們要花在使應(yīng)用適應(yīng)不同版本的虛擬機(jī)JDK上的時(shí)間和實(shí)際寫代碼的時(shí)間一樣多。MDA能夠?qū)⑦@些時(shí)間從你的開發(fā)周期里抽取出來,把它交給能夠完美的處理復(fù)雜平臺(tái)的工具來完成。
??????市面上生成支持MDA的開發(fā)工具越來越多,其中大多數(shù)是Java陣營(yíng)里的,因?yàn)镴ava提供了從平臺(tái)無(wú)關(guān)到平臺(tái)相關(guān)的簡(jiǎn)易的建模途徑。支持MDA意味著什么?沒什么,至少現(xiàn)在并不意味著什么。大體上看來,目前支持能夠傳見平臺(tái)無(wú)關(guān)模型的UML工具都被稱作支持MDA。這些工具提供的能力只是自動(dòng)實(shí)現(xiàn)MDA工程的第一步,建立模型,并且在某些情況下生特定平臺(tái)下的代碼。
??????另一個(gè)不斷有新工具涌現(xiàn)的領(lǐng)域是平臺(tái)無(wú)關(guān)模型到平臺(tái)相關(guān)模型的映射工具。簡(jiǎn)單地將模型轉(zhuǎn)換為平臺(tái)相關(guān)模型實(shí)際上卻并不是很好理解,這比代碼生成高級(jí)的多。這需要對(duì)構(gòu)建技術(shù)有深厚的理解,而且知道如何將設(shè)計(jì)翻譯成技術(shù)的構(gòu)建模塊。
??????然而實(shí)際情況比這更加復(fù)雜。每年Java會(huì)出好幾個(gè)版本和中間件技術(shù)。如果你使用流行應(yīng)用服務(wù)的流行版本,MDA可以幫助開發(fā)團(tuán)隊(duì)更好的管理復(fù)雜度。
為了獲得更好的軟件質(zhì)量,MDA允許開發(fā)人員進(jìn)行更高層次的提取,而讓軟件來做具體的工作。在過去,能夠很好地生成通用代碼和特定平臺(tái)和技術(shù)下的代碼。MDA代表了應(yīng)用開發(fā)領(lǐng)域的下一個(gè)技術(shù)舞臺(tái),并承諾大幅度改善J2EE應(yīng)用的構(gòu)建。
??????但是MDA不是萬(wàn)能的。MDA并不能幫助開發(fā)人員寫出比目前能寫出的更好的代碼。質(zhì)量在復(fù)雜的技術(shù)和中間件理解中并不凸現(xiàn),但是能夠?qū)⒂脩舻男枨蠓g成有用的、可靠的應(yīng)用。與平臺(tái)技術(shù)不同,通過需求創(chuàng)建成功應(yīng)用的技術(shù)不會(huì)過時(shí)。MDA能夠使開發(fā)變得簡(jiǎn)單,但這僅當(dāng)你已經(jīng)充分理解了你要做什么的情況下。