劉 凱 梁 欣 李欣宜 張俊萍 趙麗娜
(1.航天器在軌故障診斷與維修重點實驗室 西安 710043)(2.西安衛(wèi)星測控中心 西安 710043)(3.東北林業(yè)大學(xué) 哈爾濱 150040)(4.63871部隊 華陰 714200)(5.63870部隊 華陰 714200)
隨著信息量的迅猛增長,信息系統(tǒng)軟件變得日益復(fù)雜,與此同時軟件體系結(jié)構(gòu)的重要性在整個軟件生命周期變得日益突出[1],具體體現(xiàn)在:
1)作為軟件的雛形,軟件體系結(jié)構(gòu)是所有軟件需求的一種客觀表述;
2)優(yōu)質(zhì)的軟件體系結(jié)構(gòu)設(shè)計可以減少甚至避免軟件錯誤,提高軟件產(chǎn)品的質(zhì)量;
3)軟件體系結(jié)構(gòu)分析有助于盡早識別系統(tǒng)設(shè)計中的潛在風(fēng)險,盡早發(fā)現(xiàn)軟件理解、設(shè)計中的錯誤,及時修改以降低軟件的開發(fā)代價及日后維護階段的高昂代價;
4)與單一系統(tǒng)的開發(fā)風(fēng)險相比,基于軟件體系結(jié)構(gòu)的軟件產(chǎn)品線只需付出較少的精力、花銷,就可以開發(fā)出相似系統(tǒng)的系列產(chǎn)品,開發(fā)風(fēng)險較低;
5)軟件體系結(jié)構(gòu)有助于維護人員熟悉軟件系統(tǒng)[2~3]。
綜上,軟件體系結(jié)構(gòu)設(shè)計對于系統(tǒng)設(shè)計與開發(fā)起著至關(guān)重要的作用。
在軟件體系結(jié)構(gòu)這一領(lǐng)域,許多專家學(xué)者都提出了自己的模型和概念描述,但眾多概念和描述規(guī)范尚未統(tǒng)一,仍需進行廣泛而深入地研究。通過對幾個具有代表性的軟件體系結(jié)構(gòu)的概念進行歸納、總結(jié),發(fā)現(xiàn)其核心大都圍繞下面一些實體。
1)構(gòu)件:軟件系統(tǒng)中擔(dān)當(dāng)處理與計算的單元或?qū)嶓w的抽象,包括計算構(gòu)件和數(shù)據(jù)構(gòu)件;
2)連接件:軟件系統(tǒng)中擔(dān)當(dāng)構(gòu)件間協(xié)調(diào)處理的協(xié)議單元或處理實體的抽象,實現(xiàn)構(gòu)件之間的交互、通訊或調(diào)用關(guān)系;
3)限制:包括構(gòu)件通訊協(xié)議、實時性、同步性等;
4)配置:反映系統(tǒng)的總體結(jié)構(gòu)、構(gòu)件和連接件構(gòu)成的拓撲結(jié)構(gòu);
5)設(shè)計原則與指導(dǎo)方針:體系結(jié)構(gòu)設(shè)計或描述的知識,包括體系結(jié)構(gòu)風(fēng)格、模式等高級概念[4~5]。
基于對軟件體系結(jié)構(gòu)定義的研究,本文傾向于文獻[4]所給出的定義:“軟件體系結(jié)構(gòu)是從一個較高抽象層次來考慮組成系統(tǒng)的構(gòu)件、構(gòu)件之間的交互,以及由構(gòu)件與構(gòu)件交互形成的拓撲結(jié)構(gòu)的關(guān)系。這些要素應(yīng)該滿足一定的限制,遵循一定的設(shè)計規(guī)則,能夠在一定的環(huán)境下進行演化[4]。軟件體系結(jié)構(gòu)應(yīng)能反映系統(tǒng)開發(fā)中具有重要影響的設(shè)計決策,便于各種人員的交流,反映多種關(guān)注,照此開發(fā)的系統(tǒng)能完成系統(tǒng)既定的功能和性能需求”。
軟件體系結(jié)構(gòu)風(fēng)格,或稱軟件體系結(jié)構(gòu)模式,從本質(zhì)上反映了一些特定的元素按照特定的方式組成的一個特定結(jié)構(gòu)。
目前,已經(jīng)形成了多種不同的軟件體系結(jié)構(gòu)風(fēng)格,如圖1所示。

圖1 軟件體系結(jié)構(gòu)風(fēng)格的分類
下面,分別對圖1所示的不同軟件體系結(jié)構(gòu)風(fēng)格進行分析。
數(shù)據(jù)流是一種將數(shù)據(jù)從輸入端顯式地輸送到輸出端的體系結(jié)構(gòu)風(fēng)格,其構(gòu)件是數(shù)據(jù)的處理單元,連接件是連接處理單元的通道[6]。數(shù)據(jù)流風(fēng)格又可細分為三種體系結(jié)構(gòu),分別是管道和過濾器、批處理以及任務(wù)處理。
1)管道和過濾器是最典型的數(shù)據(jù)流系統(tǒng)風(fēng)格。在這種風(fēng)格中,每個構(gòu)件有一套輸入集和一套輸出集,構(gòu)件從輸入集中得到數(shù)據(jù)流,經(jīng)過對輸入流的變換及增量計算來完成內(nèi)部處理,將產(chǎn)生的數(shù)據(jù)流送給輸出集,按標準順序傳遞一組完整的計算結(jié)果。在這種風(fēng)格中,構(gòu)件被稱作“過濾器”;連接件被稱為“管道”,它相當(dāng)于數(shù)據(jù)流的導(dǎo)管,負責(zé)將一個過濾器的輸出傳輸?shù)搅硪粋€過濾器[7~8]。如圖2所示,方框代表過濾器,帶箭頭的空心線代表管道。

圖2 管道和過濾器
管道和過濾器風(fēng)格中,過濾器不與其他過濾器共享數(shù)據(jù),也不必知道與其連接的上下游過濾器的身份標識,只需要從輸入管道接收數(shù)據(jù),然后將計算結(jié)果送入輸出管道。因此,過濾器之間相互獨立。
2)批處理體系結(jié)構(gòu)風(fēng)格中,每個構(gòu)件都是一個獨立的程序。只有在當(dāng)前構(gòu)件處理完成后,下一個構(gòu)件才會啟動,數(shù)據(jù)以整體的形式在構(gòu)件間傳輸[6],如批處理操作系統(tǒng)。
3)任務(wù)處理體系結(jié)構(gòu)風(fēng)格,主要用于控制系統(tǒng),它包括前反饋系統(tǒng)、后反饋系統(tǒng)等。
調(diào)用/返回風(fēng)格是基于模塊間的顯式調(diào)用而形成的體系結(jié)構(gòu)風(fēng)格。這種風(fēng)格的構(gòu)件是組成系統(tǒng)的模塊、層或者對象,連接件是構(gòu)件之間的調(diào)用關(guān)系。構(gòu)件對外隱藏了數(shù)據(jù)表示、物理設(shè)備的屬性、事件模型的實現(xiàn)、支持策略的機制等內(nèi)部信息,使構(gòu)件之間可以獨立地改變內(nèi)部系統(tǒng)的細節(jié)[6]。構(gòu)件之間通過調(diào)用接口進行協(xié)同工作,而不必關(guān)心被調(diào)用的構(gòu)件是如何實現(xiàn)的。
調(diào)用/返回風(fēng)格可細分為主、子調(diào)用,數(shù)據(jù)抽象和面向?qū)ο螅约皩哟误w系結(jié)構(gòu)。
1)主、子調(diào)用風(fēng)格只具有單一的控制線程,其調(diào)用關(guān)系是確定的。在這種風(fēng)格中,主過程的正確性依賴于子過程的正確性,而子過程的正確性依賴于子過程所調(diào)用的子過程的正確性。子過程的聚集稱為模塊,模塊可以是一段代碼、一個編譯單元或者一個工作單元。
2)數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格是以抽象數(shù)據(jù)類型和面向?qū)ο蠹夹g(shù)為基礎(chǔ)的,它的基本構(gòu)件是對象。該風(fēng)格體現(xiàn)了面向?qū)ο蟮姆庋b性、繼承性和多態(tài)性要求,數(shù)據(jù)結(jié)構(gòu)和操作被封裝在一個抽象數(shù)據(jù)類型里,對象之間通過傳遞消息發(fā)生聯(lián)系[7]。
3)層次體系結(jié)構(gòu)采取層次化的組織方法,每一層向上一層提供服務(wù),同時又是下層的客戶,調(diào)用下層的服務(wù)。在該風(fēng)格中,內(nèi)部的層只對相鄰的層可見。連接件通過協(xié)議進行定義,它決定了各層之間如何進行交互,典型的例子是OSI七層結(jié)構(gòu)。
虛擬機風(fēng)格屏蔽了底層硬件的異構(gòu)性,可以讓不同的軟件在它上面運行,就好像在另一臺機器上運行一樣。它好似一臺計算機,有輸入、輸出,工作過程也像一臺計算機,將虛擬機的指令映射到機器指令集上。虛擬機的構(gòu)件包括用于保存輸入數(shù)據(jù)的部件、虛擬機執(zhí)行引擎、用于保存當(dāng)前虛擬機狀態(tài)的部件,連接件包括過程調(diào)用和直接存儲訪問[6~7]。
虛擬機風(fēng)格包括解釋器和基于規(guī)則的體系結(jié)構(gòu)兩種風(fēng)格。
1)解釋器通過建立一種虛擬機以彌合程序語義與計算引擎硬件之間的間隙。其構(gòu)件包括正在被解釋的程序、執(zhí)行引擎、被解釋的程序的狀態(tài)和執(zhí)行引擎的當(dāng)前狀態(tài),典型例子是Java虛擬機。
2)基于規(guī)則的體系結(jié)構(gòu)類似于解釋器,它根據(jù)已知的規(guī)則對輸入進行處理。構(gòu)件包括工作內(nèi)存、知識庫、規(guī)則解釋器、規(guī)則與數(shù)據(jù)元素選擇器。
數(shù)據(jù)中心體系結(jié)構(gòu),也叫數(shù)據(jù)倉庫,它是一種以數(shù)據(jù)為中心的體系結(jié)構(gòu)風(fēng)格,用于收集、管理和維護大量的復(fù)雜數(shù)據(jù)。這種風(fēng)格中,構(gòu)件包括用于表示當(dāng)前數(shù)據(jù)狀態(tài)的中心數(shù)據(jù)結(jié)構(gòu)和在數(shù)據(jù)中心存儲的數(shù)據(jù)上進行操作的獨立部件的集合,連接件是獨立部件對中心數(shù)據(jù)結(jié)構(gòu)的訪問[6]。
依據(jù)不同的控制策略,數(shù)據(jù)中心體系結(jié)構(gòu)可分為不同的兩大類:一是傳統(tǒng)的數(shù)據(jù)庫模式,即數(shù)據(jù)庫體系結(jié)構(gòu),系統(tǒng)由輸入的事務(wù)信息驅(qū)動,典型的例子是數(shù)據(jù)庫系統(tǒng);二是黑板結(jié)構(gòu),即黑板體系結(jié)構(gòu),系統(tǒng)由黑板上的信息驅(qū)動,典型的例子是HearsayⅡ語音識別系統(tǒng)。
獨立組件風(fēng)格以處理過程或?qū)ο笞鳛闃?gòu)件,以事件綁定或者消息傳遞作為連接件,包括事件處理體系結(jié)構(gòu)和通訊處理體系結(jié)構(gòu)[7~8]。
1)事件處理體系結(jié)構(gòu)主要處理隱式調(diào)用,因此也稱為隱式調(diào)用風(fēng)格。這種風(fēng)格的構(gòu)件是一個包含過程集合和一組事件的模塊,連接件即過程調(diào)用,事件聲明以及過程調(diào)用的綁定等。該風(fēng)格的基本思想是構(gòu)件不直接調(diào)用一個過程,而是觸發(fā)或聲明一個或多個事件。系統(tǒng)中其它構(gòu)件中的過程可以通過一個與這個或這些事件相聯(lián)系的過程,在這個或這些事件中進行登記[9~10]。當(dāng)某事件被觸發(fā)時,系統(tǒng)會自動調(diào)用所有在這個或這些事件中登記過的過程。舉例來說,在一個用JAVA編寫的程序中,當(dāng)為某變量申請內(nèi)存失敗時,系統(tǒng)會拋出一個內(nèi)存異常,從而產(chǎn)生一個異常事件,這時系統(tǒng)會通過調(diào)用注冊過的相應(yīng)的中斷程序進行相應(yīng)的處理,即隱式調(diào)用[11]。
2)通訊處理體系結(jié)構(gòu)由一組過程組成,每個過程擁有自己的地址空間,因此也可以看作一個虛擬的處理器。消息之間通過同步的、異步的、點對點的或者基于某種協(xié)議的點對點調(diào)用進行消息傳遞[6]。
正交軟件體系結(jié)構(gòu)是一種以垂直線索組件族為基礎(chǔ)的層次化結(jié)構(gòu),它由組織層(橫向)和線索(縱向)的組件兩大部分組成。層是由一組具有相同抽象水平的組件構(gòu)成的;線索(垂直線索組件族)是相對的子系統(tǒng)特例,它由完成不同層次功能的組件構(gòu)成,每一條線索完成正交結(jié)構(gòu)中相對獨立的一部分功能而與其他線索的實現(xiàn)無關(guān)或關(guān)聯(lián)很少,在同一層次中組件之間不存在相互調(diào)用。這完全符合正交的定義:“如果線索間是相互獨立的,即不同線索中的組件之間沒有相互調(diào)用,那么此結(jié)構(gòu)就是完全正交的[10]”。正交體系結(jié)構(gòu)的基本思想是把應(yīng)用系統(tǒng)的結(jié)構(gòu)按功能的正交相關(guān)性,垂直分割為若干個線索(子系統(tǒng)),線索又分為幾個層次,每個線索由多個具有不同層次功能和不同抽象級別的構(gòu)件構(gòu)成,其結(jié)構(gòu)如圖3所示。

圖3 正交軟件體系結(jié)構(gòu)框架
圖3是一個三級線索、五層結(jié)構(gòu)的正交軟件體系結(jié)構(gòu)框架圖。其中,ABDFK組成了一條線索,ACEJK也是一條線索。因為B、C處于同一層次中,所以不允許進行互相調(diào)用;同理,H、J也不允許進行互相調(diào)用。第五層是一個物理數(shù)據(jù)庫連接構(gòu)件或設(shè)備構(gòu)件,供整個系統(tǒng)共用。
正交軟件體系結(jié)構(gòu)的主要特征可以歸納如下[12~13]:
1)系統(tǒng)由完成不同功能的n(n>1)個線索(子系統(tǒng))組成;
2)系統(tǒng)具有m(m>1)個不同抽象級別的層;
3)線索之間是相互獨立的(正交的);
4)系統(tǒng)有且僅有一個公共驅(qū)動層(一般為最上層,觸發(fā)各線索運行),而且有且僅有一個公共數(shù)據(jù)結(jié)構(gòu)(一般為最底層,包含所有線索使用的公共數(shù)據(jù)資源等)。
C/S軟件體系結(jié)構(gòu),即Client/Server(客戶機服務(wù)器)結(jié)構(gòu),是基于資源不對等,且為實現(xiàn)共享而提出來的技術(shù)[13]。它最鮮明的特征是資源共享,可以分配處理任務(wù)和數(shù)據(jù)給客戶機和服務(wù)器,使系統(tǒng)共享從數(shù)據(jù)到處理能力的每一種資源[10]。C/S軟件體系結(jié)構(gòu)又可細分為二層C/S結(jié)構(gòu)和三層C/S結(jié)構(gòu)。
1)二層C/S結(jié)構(gòu)以局域網(wǎng)為中心,將應(yīng)用一分為二,單一服務(wù)器(后臺)負責(zé)數(shù)據(jù)管理,客戶機(前臺)完成與用戶的交互任務(wù)。在實際應(yīng)用中,這種結(jié)構(gòu)大多采用一臺數(shù)據(jù)庫服務(wù)器(如DB2、ORACEL等數(shù)據(jù)庫)作為服務(wù)器,客戶端選用可視化編程語言(如Microsoft Visual Basic6.0)編寫的客戶軟件,通過ODBC或ADO同數(shù)據(jù)庫服務(wù)器通信,組成一個應(yīng)用系統(tǒng)[10]。這種結(jié)構(gòu)的不足之處在于客戶端很龐大,應(yīng)用程序升級和維護困難且耗資很大。
2)三層C/S結(jié)構(gòu)是在二層C/S結(jié)構(gòu)的基礎(chǔ)上提出的,系統(tǒng)在客戶機和數(shù)據(jù)庫服務(wù)器間添加一個應(yīng)用服務(wù)器。三層C/S結(jié)構(gòu)將應(yīng)用功能分成表示層、功能層和數(shù)據(jù)層三個部分。作為應(yīng)用的用戶接口部分,表示層承擔(dān)系統(tǒng)與用戶間的對話功能,用于簡單檢查用戶輸入的數(shù)據(jù)、顯示輸出的數(shù)據(jù);功能層又稱業(yè)務(wù)邏輯層,它將具體的業(yè)務(wù)處理邏輯編入程序中;數(shù)據(jù)層即數(shù)據(jù)庫管理系統(tǒng),負責(zé)管理對數(shù)據(jù)庫數(shù)據(jù)的讀寫,要求能夠迅速執(zhí)行大量數(shù)據(jù)的更新和檢索。通過對三層結(jié)構(gòu)的功能進行合理劃分,使整個系統(tǒng)的邏輯結(jié)構(gòu)更為清晰,有效地提高了系統(tǒng)和軟件的可維護性和可擴展性[9]。
B/S結(jié)構(gòu),即Browser/Server(瀏覽器/服務(wù)器)結(jié)構(gòu),是隨著Internet技術(shù)的興起對C/S結(jié)構(gòu)進行變化或改進的結(jié)構(gòu)。它利用了不斷成熟的WWW瀏覽器技術(shù),結(jié)合瀏覽器的多種Script語言(如VBScript、JavaScript等)和ActiveX技術(shù),用通用瀏覽器實現(xiàn)了原來需要復(fù)雜專用軟件才能實現(xiàn)的強大功能,并節(jié)約了開發(fā)成本,是一種全新的軟件系統(tǒng)構(gòu)造技術(shù)[12]。在這種結(jié)構(gòu)下,用戶界面完全通過WWW瀏覽器實現(xiàn),一部分事務(wù)邏輯在前端實現(xiàn),但主要事務(wù)邏輯在服務(wù)器端實現(xiàn),通過Internet/Intranet模式應(yīng)用數(shù)據(jù)庫。以目前的技術(shù)看,這種B/S結(jié)構(gòu)的網(wǎng)絡(luò)應(yīng)用相對易于把握、成本較低,是一次性到位的開發(fā),能實現(xiàn)不同人員、從不同地點、以不同接入方式(比如LAN、WAN、Internet/Intranet等)訪問和操作公共數(shù)據(jù)庫,并能有效保護數(shù)據(jù)平臺,管理訪問權(quán)限,服務(wù)器數(shù)據(jù)庫也很安全[14]。
實際上,各種軟件體系結(jié)構(gòu)并非獨立存在的,一個系統(tǒng)中可能同時存在多種軟件體系結(jié)構(gòu),從而形成復(fù)雜的體系結(jié)構(gòu),我們稱之為“異構(gòu)的軟件體系結(jié)構(gòu)”。這種體系結(jié)構(gòu)的組合方式有多種,可以采用平行的方式,即根據(jù)軟件各子系統(tǒng)的結(jié)構(gòu)、功能和性能,為每個子系統(tǒng)選擇相應(yīng)的體系結(jié)構(gòu),也可以分層組織,即在某種體系結(jié)構(gòu)的一個組成部分的內(nèi)部采用另一種不同的體系結(jié)構(gòu)[10]。許多學(xué)者已開始了對異構(gòu)軟件體系結(jié)構(gòu)風(fēng)格的研究,如文獻[12]提出的“B/S與C/S混合軟件體系結(jié)構(gòu)”,把B/S和C/S兩種軟件體系結(jié)構(gòu)進行了有機的結(jié)合,揚長避短,有效地發(fā)揮了各自的優(yōu)勢[12];又如文獻[15]提出的“整體應(yīng)用框架采用正交體系結(jié)構(gòu)而子部分系統(tǒng)采用C/S模式”[15],綜合了正交和C/S結(jié)構(gòu)的優(yōu)點,結(jié)構(gòu)清晰,易于理解,保證了應(yīng)用系統(tǒng)的安全性。異構(gòu)軟件體系結(jié)構(gòu)將成為軟件體系結(jié)構(gòu)領(lǐng)域的發(fā)展趨勢。
下面對上述常見軟件體系結(jié)構(gòu)風(fēng)格的優(yōu)缺點進行分析、比較,以深化對體系結(jié)構(gòu)風(fēng)格的理解,如表1所示。
通過對上述多種軟件體系結(jié)構(gòu)風(fēng)格的優(yōu)缺點比較發(fā)現(xiàn),眾多軟件體系結(jié)構(gòu)風(fēng)格各有所長,同時也存在不足。系統(tǒng)研發(fā)時,建議將不同的體系結(jié)構(gòu)有機地結(jié)合起來,發(fā)揮各自結(jié)構(gòu)的優(yōu)勢,彌補不足,取長補短,以更好地為系統(tǒng)服務(wù)。

表1 多種軟件體系結(jié)構(gòu)風(fēng)格的優(yōu)缺點比較
由于視角不同,系統(tǒng)設(shè)計師在考慮體系結(jié)構(gòu)風(fēng)格時存在著很大的選擇空間,若要為系統(tǒng)選擇或設(shè)計一種適合的體系結(jié)構(gòu)風(fēng)格,必須根據(jù)特定項目的具體特點,進行反復(fù)分析比較后確定。本文在對軟件體系結(jié)構(gòu)及其風(fēng)格的概念分析的基礎(chǔ)上,對多種軟件體系結(jié)構(gòu)風(fēng)格展開了研究,并對這些不同風(fēng)格的優(yōu)缺點進行了比較與分析,可為軟件體系結(jié)構(gòu)風(fēng)格的優(yōu)化設(shè)計提供強有力的指導(dǎo)。