陳軍良
摘要:在基于構(gòu)件的軟件開發(fā)中,構(gòu)件組裝技術(shù)是關(guān)鍵。在一般組裝過程中,構(gòu)件積極主動(dòng)的“參與”造成構(gòu)件的復(fù)雜化。軟件體系結(jié)構(gòu)將連接器視為和構(gòu)件同等重要的一階實(shí)體。在當(dāng)前基于軟件體系結(jié)構(gòu)的構(gòu)件組裝方法上,整合接口匹配和消息傳遞的構(gòu)件組裝技術(shù)的特點(diǎn),提出了基于復(fù)合連接器模型的插拔式組裝實(shí)現(xiàn)框架。從而簡化構(gòu)件的開發(fā),提高組裝效率。本文重點(diǎn)研究了復(fù)合連接器模型各部分的實(shí)現(xiàn)和插拔式組裝算法,最后給出了一個(gè)面向Web應(yīng)用的構(gòu)件組裝工具實(shí)例。
關(guān)鍵詞:軟件體系結(jié)構(gòu)構(gòu)件復(fù)合連接器插拔式組裝
0引言
構(gòu)件組裝技術(shù)是基于構(gòu)件的軟件工程的核心,也是難點(diǎn)所在。構(gòu)件組裝就是通過現(xiàn)有的構(gòu)件和組裝機(jī)制,把構(gòu)件組裝成一個(gè)新的構(gòu)件或新的系統(tǒng)。目前,構(gòu)件組裝技術(shù)的應(yīng)用和研究正向著多角度、全方位的方向發(fā)展。軟件體系結(jié)構(gòu)(SA)是對軟件總體結(jié)構(gòu)的描述,即對其構(gòu)件和構(gòu)件間交互的高層組織的描述?;跇?gòu)件的SA的設(shè)計(jì)已成為軟件系統(tǒng)設(shè)計(jì)中的核心問題?;赟A構(gòu)件組裝方法有多種風(fēng)格,例如程序代碼生成技術(shù)、消息傳遞構(gòu)件組裝技術(shù)、利用連接器模型進(jìn)行構(gòu)件組裝“等等。但是,軟件體系結(jié)構(gòu)最重要的一個(gè)貢獻(xiàn)是將構(gòu)件之間的交互顯式的表示為連接器(connector),并將連接器視為和構(gòu)件同等重要的一階實(shí)體。體系結(jié)構(gòu)風(fēng)格既定義了構(gòu)件及連接方式的各種屬性,又規(guī)定了它們的組合規(guī)則和限制。因此,在基于SA構(gòu)件的構(gòu)件組裝技術(shù)中,通常利用連接器進(jìn)行構(gòu)件組裝。目前,北大提出的“連接子”,是利用連接器進(jìn)行組裝的典型,但是當(dāng)系統(tǒng)中需要組裝的構(gòu)件功能多樣時(shí),其連接的數(shù)量就成為一個(gè)顯著的問題,不僅每個(gè)構(gòu)件需要定義大量的接口,而且還要生成很多連接器,從而造成系統(tǒng)代碼的冗余。本文提出了基于復(fù)合連接器的插拔式構(gòu)件組裝方法。在組裝成應(yīng)用系統(tǒng)的過程中,構(gòu)件處于很積極(passive)的狀態(tài),主動(dòng)(active)的參與和完成組裝,這樣勢必造成構(gòu)件的復(fù)雜化。通過本文提到的復(fù)合連接器,①簡化構(gòu)件的開發(fā),更多的去考慮構(gòu)件的功能而不是其結(jié)構(gòu)規(guī)范。這樣可以使更多的人參與構(gòu)件的開發(fā),從而增加更多的構(gòu)件資源。②構(gòu)件與構(gòu)件之間的關(guān)系轉(zhuǎn)移到構(gòu)件與連接器上,實(shí)現(xiàn)構(gòu)件的插拔式組裝。③提高組裝效率,更好的理解組裝的場景,明晰組裝的流程?;趶?fù)合連接器的插拔式構(gòu)件組裝方法不僅可以清楚的描繪出構(gòu)件之間的關(guān)系,而且也體現(xiàn)了頁面視圖方面的組裝特點(diǎn),可以很好的表現(xiàn)實(shí)際的web頁面,比如頁面的布局,頁面的主題等。本文最后從實(shí)際項(xiàng)目出發(fā),結(jié)合C2體系結(jié)構(gòu)風(fēng)格,并借鑒開源框架Struts技術(shù),開發(fā)出基于復(fù)合連接器的插拔式構(gòu)件組裝系統(tǒng)。該系統(tǒng)設(shè)計(jì)符合J2EE規(guī)范,遵循插頭插座式體系結(jié)構(gòu)。
1基于復(fù)合連接器的插拔式構(gòu)件組裝的系統(tǒng)模型
1.1基于連接器的插拔式組裝框架在基于B/s結(jié)構(gòu)的系統(tǒng)中,為了實(shí)現(xiàn)插拔式組裝,把連接器置于客戶端和服務(wù)器之間。由于構(gòu)件庫放置在服務(wù)器上,所以首先由客戶端發(fā)送消息告訴連接器需要的構(gòu)件,再由連接器把消息傳遞給服務(wù)器,最后服務(wù)器根據(jù)消息做出選擇。構(gòu)件組裝系統(tǒng)框架的實(shí)現(xiàn)可以分為以下六個(gè)部分:①用戶(客戶端)發(fā)出組裝系統(tǒng)所需構(gòu)件的請求,連接器收到消息,根據(jù)構(gòu)件標(biāo)識(shí),生成構(gòu)件地址,并以URL的形式傳遞給服務(wù)器:②服務(wù)器根據(jù)構(gòu)件標(biāo)識(shí),在構(gòu)件庫中進(jìn)行查找;③在查找過程中,根據(jù)構(gòu)件描述文件中定義的標(biāo)識(shí),獲取相應(yīng)的構(gòu)件信息;④根據(jù)構(gòu)件信息,通過web部署文件的映射實(shí)例化構(gòu)件;⑤服務(wù)器把實(shí)例化后的構(gòu)件傳遞給連接器,連接器通過接口服務(wù)組裝構(gòu)件;⑥連接器把組裝后的系統(tǒng)返回客戶端。用戶獲取組裝后的構(gòu)件信息。
1.2連接器模型該體系中使用的連接器是一個(gè)自治的、可調(diào)度的軟件實(shí)體,可以清楚地說明它所需要的和它所提供的服務(wù)。比簡單連接器的實(shí)現(xiàn)更復(fù)雜,功能也更強(qiáng)大。同時(shí),封裝實(shí)施通信的協(xié)議和約束關(guān)系。待組裝的構(gòu)件只需插入到連接器的相應(yīng)接口即可實(shí)現(xiàn)相互的連接。本文提到的插拔式連接器分為兩部分:①插拔式接口:一個(gè)需求服務(wù)接口,一個(gè)提供服務(wù)接口。②通信實(shí)體:實(shí)現(xiàn)插入構(gòu)件之間的通信,包括通信的協(xié)議、服務(wù)等。
要實(shí)現(xiàn)插拔式連接器需解決一個(gè)關(guān)鍵問題:如何使構(gòu)件插拔式地使用該連接器,即構(gòu)件與插拔式連接器的接口匹配問題。為了給用戶一個(gè)直觀的組裝環(huán)境,使構(gòu)件的位置相對于用戶透明化,在組裝構(gòu)件時(shí),僅告訴連接器該構(gòu)件需要與哪個(gè)構(gòu)件進(jìn)行通信即可。這時(shí)連接器的作用是:接收到要組裝的構(gòu)件,發(fā)送消息到服務(wù)器(構(gòu)件庫),服務(wù)器接收到消息返回構(gòu)件,構(gòu)件根據(jù)組裝描述文件,實(shí)例化構(gòu)件,完成連接器與構(gòu)件的服務(wù)和接口的匹配,最后實(shí)現(xiàn)構(gòu)件組裝。這樣,構(gòu)件之間不必知道各自的實(shí)現(xiàn)方式,只要插裝到連接器上。就能實(shí)現(xiàn)相互間的銜接。連接器包括:構(gòu)件規(guī)范性描述、消息分發(fā)器、對象模型、調(diào)用者API和其它服務(wù)接口。連接器各部分功能如下:①對象模型:為插拔式組裝提出構(gòu)件規(guī)范。②消息分發(fā)器:通過HTTP協(xié)議,使構(gòu)件與連接器、連接器與服務(wù)器之間進(jìn)行消息通信。消息分發(fā)器負(fù)責(zé)消息的傳遞,主要完成判斷消息類型,傳遞消息內(nèi)容等功能。③調(diào)用者API:連接器引用的服務(wù),主要引用了構(gòu)件的創(chuàng)建(插裝)和銷毀(拔出)等服務(wù)。④核心容器:進(jìn)行插拔式組裝提供的容器,包括了構(gòu)件模板和視圖模板,是連接器提供的接口服務(wù)和抽象類的集合。⑤其它服務(wù)接口:提供了核心功能外的其他接口,如日志管理接口、服務(wù)配置接口等,也為連接器擴(kuò)展預(yù)留接口。
2構(gòu)件組裝實(shí)例
基于上述的思想,筆者實(shí)現(xiàn)了一個(gè)可視化的構(gòu)件組裝工具。組裝工具主要包括構(gòu)件管理和構(gòu)件組裝兩部分,在插拔式構(gòu)件組裝系統(tǒng)中,構(gòu)件分為4類:用戶操作、內(nèi)容管理、新聞、工具。每一類都包括了若干個(gè)構(gòu)件。制作的構(gòu)件都符合連接器與構(gòu)件接口之間的規(guī)范,并使用XML對構(gòu)件進(jìn)行了統(tǒng)一描述,使用DOM樹型結(jié)構(gòu)顯示在構(gòu)件庫界面上。系統(tǒng)提供了一個(gè)可視化的組裝環(huán)境。在這個(gè)環(huán)境中,呈現(xiàn)為一個(gè)“白板”,而“白板”實(shí)際是連接器的表現(xiàn)形式。在組裝時(shí)。隨機(jī)挑選幾個(gè)構(gòu)件進(jìn)行,包括時(shí)間構(gòu)件、內(nèi)容顯示構(gòu)件和用戶登錄構(gòu)件。組裝的主要流程如下:①從系統(tǒng)提供的一個(gè)主程序入口類——MainServlet類開始,傳遞待組裝構(gòu)件的消息,該類通過DOM技術(shù)加載構(gòu)件描述文件。②連接器收到組裝構(gòu)件的消息更新消息并轉(zhuǎn)發(fā)給服務(wù)器獲取這些構(gòu)件信息。③服務(wù)器接收到消息后,使用Map-ping方法映射到component class節(jié)點(diǎn)上,進(jìn)行構(gòu)件實(shí)例化。④調(diào)用getlnitParameter獲取init-param視圖節(jié)點(diǎn)信息,并把這些信息返回到連接器上。⑤如果要組裝的構(gòu)件的接口和連接器的接口匹配,構(gòu)件就組裝到連接器上;否則,組裝失敗。⑥最后,系統(tǒng)把組裝好的web應(yīng)用系統(tǒng)返回給用戶。
3結(jié)束語
為了實(shí)現(xiàn)插拔式組裝,論文研究了軟件體系結(jié)構(gòu)中的插頭插座式體系結(jié)構(gòu)、構(gòu)件的規(guī)范化和接口匹配等技術(shù)。對比了現(xiàn)有的組裝技術(shù),設(shè)計(jì)了復(fù)合連接器和插拔式構(gòu)件組裝模型,并給出了插拔式組裝系統(tǒng)的簡單實(shí)現(xiàn)。