[摘 要] 本文對(duì)幾種經(jīng)典的軟件體系結(jié)構(gòu)風(fēng)格進(jìn)行了具體的闡述,分析了各種風(fēng)格的特點(diǎn)、優(yōu)缺點(diǎn),最后重點(diǎn)介紹了三層C/S軟件體系結(jié)構(gòu)。 

  [關(guān)鍵詞] 軟件體系結(jié)構(gòu) 軟件體系結(jié)構(gòu)風(fēng)格 三層C/S軟件體系結(jié)構(gòu)   

  20世紀(jì)60年代中期的軟件危機(jī)使得人們開始重視軟件工程的研究。起初,人們把軟件設(shè)計(jì)的重點(diǎn)放在數(shù)據(jù)結(jié)構(gòu)和算法的選擇上。隨著軟件系統(tǒng)規(guī)模越來(lái)越大、越來(lái)越復(fù)雜,整個(gè)系統(tǒng)的結(jié)構(gòu)顯得越來(lái)越重要。 

  一、軟件體系結(jié)構(gòu)風(fēng)格分析 

  最初的軟件體系結(jié)構(gòu)是Mainframe結(jié)構(gòu)――客戶、數(shù)據(jù)和程序都被集中在主機(jī)上,通常只有少量的GUI界面,對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的訪問比較困難。隨著PC的廣泛應(yīng)用,該結(jié)構(gòu)逐漸被淘汰。在20世紀(jì)80年代中期出現(xiàn)了Client/Server分布式計(jì)算結(jié)構(gòu),應(yīng)用程序的處理在客戶機(jī)和服務(wù)器之間分擔(dān)。隨著大型軟件系統(tǒng)的開發(fā),這種結(jié)構(gòu)在系統(tǒng)的部署和擴(kuò)展性方面暴漏出不足。隨著Internet的發(fā)展,一個(gè)更靈活的體系結(jié)構(gòu)“三層/多層計(jì)算”體系結(jié)構(gòu)應(yīng)運(yùn)而生。 

  Garlan和Shaw將通用軟件體系結(jié)構(gòu)風(fēng)格總結(jié)為以下幾類: 

  1.數(shù)據(jù)流風(fēng)格:批處理序列;管道/過濾器。2.調(diào)用/返回風(fēng)格:主程序/子程序;面向?qū)ο箫L(fēng)格;層次結(jié)構(gòu)。3.獨(dú)立構(gòu)件風(fēng)格:進(jìn)程通訊;事件系統(tǒng)。4.虛擬機(jī)風(fēng)格:解釋器;基于規(guī)則的系統(tǒng)。5.倉(cāng)庫(kù)風(fēng)格:數(shù)據(jù)庫(kù)系統(tǒng);超文本系統(tǒng);黑板系統(tǒng)。 

  下面將介紹幾種主要和經(jīng)典的體系結(jié)構(gòu)風(fēng)格和它們的優(yōu)缺點(diǎn)。 

  1.C2風(fēng)格。C2體系結(jié)構(gòu)風(fēng)格可以概括為:通過連接件綁定在一起的按照一組規(guī)則運(yùn)作的并行構(gòu)件網(wǎng)絡(luò)。圖1中構(gòu)件與連接件之間的連接體現(xiàn)了C2風(fēng)格中構(gòu)建系統(tǒng)的規(guī)則。 

  C2風(fēng)格是最常用的一種軟件體系結(jié)構(gòu)風(fēng)格。從C2風(fēng)格的組織規(guī)則和結(jié)構(gòu)圖中,我們可以得出,C2風(fēng)格具有以下特點(diǎn): 

  (1)系統(tǒng)中的構(gòu)件可實(shí)現(xiàn)應(yīng)用需求,并能將任意復(fù)雜度的功能封裝在一起;(2)所有構(gòu)件之間的通訊是通過以連接件為中介的異步消息交換機(jī)制來(lái)實(shí)現(xiàn)的;(3)構(gòu)件相對(duì)獨(dú)立,構(gòu)件之間依賴性較少。系統(tǒng)中不存在某些構(gòu)件將在同一地址空間內(nèi)執(zhí)行,或某些構(gòu)件共享特定控制線程之類的相關(guān)性假設(shè)。 

  2.數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格。目前軟件界已普遍轉(zhuǎn)向使用面向?qū)ο笙到y(tǒng),抽象數(shù)據(jù)類型概念對(duì)軟件系統(tǒng)有著重要作用。這種風(fēng)格的構(gòu)件是對(duì)象,或者說是抽象數(shù)據(jù)類型的實(shí)例。對(duì)象是一種被稱作管理者的構(gòu)件,因?yàn)樗?fù)責(zé)保持資源的完整性。對(duì)象是通過函數(shù)和過程的調(diào)用來(lái)交互的。圖2是數(shù)據(jù)抽象和面向?qū)ο箫L(fēng)格的示意圖。 

  面向?qū)ο蟮南到y(tǒng)有許多的優(yōu)點(diǎn): 

  (1)因?yàn)閷?duì)象對(duì)其他對(duì)象隱藏它的表示,所以可以改變一個(gè)對(duì)象的表示,而不影響其他的對(duì)象。(2)設(shè)計(jì)者可將一些數(shù)據(jù)存取操作的問題分解成一些交互的代理程序的集合。面向?qū)ο蟮南到y(tǒng)也存在著某些問題:①為了使一個(gè)對(duì)象和另一個(gè)對(duì)象通過過程調(diào)用等進(jìn)行交互,必須知道對(duì)象的標(biāo)識(shí)。只要一個(gè)對(duì)象的標(biāo)識(shí)改變了,就必須修改所有其他明確調(diào)用它的對(duì)象。②必須修改所有顯式調(diào)用它的其他對(duì)象,并消除由此帶來(lái)的一些副作用。 

  3.基于事件的隱式調(diào)用風(fēng)格;谑录碾[式調(diào)用風(fēng)格的思想是構(gòu)件不直接調(diào)用一個(gè)過程,而是觸發(fā)或廣播一個(gè)或多個(gè)事件。系統(tǒng)中的其他構(gòu)件中的過程在一個(gè)或多個(gè)事件中注冊(cè),當(dāng)一個(gè)事件被觸發(fā),系統(tǒng)自動(dòng)調(diào)用在這個(gè)事件中注冊(cè)的所有過程,這樣,一個(gè)事件的觸發(fā)就導(dǎo)致了另一模塊中的過程的調(diào)用。基于事件的隱式調(diào)用風(fēng)格的主要特點(diǎn)是事件的觸發(fā)者并不知道哪些構(gòu)件會(huì)被這些事件影響。這樣不能假定構(gòu)件的處理順序,甚至不知道哪些過程會(huì)被調(diào)用。隱式調(diào)用系統(tǒng)的主要優(yōu)點(diǎn)有:(1)為軟件重用提供了強(qiáng)大的支持。當(dāng)需要將一個(gè)構(gòu)件加入現(xiàn)存系統(tǒng)中時(shí),只需將它注冊(cè)到系統(tǒng)的事件中。(2)為改進(jìn)系統(tǒng)帶來(lái)了方便。當(dāng)用一個(gè)構(gòu)件代替另一個(gè)構(gòu)件時(shí),不會(huì)影響到其他構(gòu)件的接口。隱式調(diào)用系統(tǒng)的主要缺點(diǎn)有:①構(gòu)件放棄了對(duì)系統(tǒng)計(jì)算的控制。一個(gè)構(gòu)件觸發(fā)一個(gè)事件時(shí),不能確定其他構(gòu)件是否會(huì)響應(yīng)它。而且即使它知道事件注冊(cè)了哪些構(gòu)件的構(gòu)成,它也不能保證這些過程被 調(diào)用的順序。②數(shù)據(jù)交換的問題。有時(shí)數(shù)據(jù)可被一個(gè)事件傳遞,但另一些情況下,基于事件的系統(tǒng)必須依靠一個(gè)共享的倉(cāng)庫(kù)進(jìn)行交互。在這些情況下,全局性能和資源管理便成了問題。③既然過程的語(yǔ)義必須依賴于被觸發(fā)事件的上下文約束,關(guān)于正確性的推理存在問題。 

  4.管道/過濾器風(fēng)格。在管道/過濾器風(fēng)格的軟件體系結(jié)構(gòu)中,每個(gè)構(gòu)件都有一組輸入和輸出,構(gòu)件讀輸入的數(shù)據(jù)流,經(jīng)過內(nèi)部處理,然后產(chǎn)生輸出數(shù)據(jù)流。這個(gè)過程通常通過對(duì)輸入流的變換及增量計(jì)算來(lái)完成,所以在輸入被完全消費(fèi)之前,輸出便產(chǎn)生了。因此,這里的構(gòu)件被稱為過濾器,這種風(fēng)格的連接件就象是數(shù)據(jù)流傳輸?shù)墓艿溃瑢⒁粋(gè)過濾器的輸出傳到另一過濾器的輸入。 

  圖3是管道/過濾器風(fēng)格的示意圖。 

  管道/過濾器風(fēng)格的軟件體系結(jié)構(gòu)的優(yōu)點(diǎn): 

  (1)使得軟構(gòu)件具有良好的隱蔽性和高內(nèi)聚、低耦合的特點(diǎn);(2)支持軟件重用。重要提供適合在兩個(gè)過濾器之間傳送的數(shù)據(jù),任何兩個(gè)過濾器都可被連接起來(lái);(3)系統(tǒng)維護(hù)和性能增強(qiáng)簡(jiǎn)單;(4)支持并行執(zhí)行。每個(gè)過濾器是作為一個(gè)單獨(dú)的任務(wù)完成,因此可與其他任務(wù)并行執(zhí)行。管道/過濾器風(fēng)格的主要缺點(diǎn):①通常導(dǎo)致進(jìn)程成為批處理的結(jié)構(gòu)。這是因?yàn)殡m然過濾器可增量式地處理數(shù)據(jù),但它們是獨(dú)立的,所以設(shè)計(jì)者必須將每個(gè)過濾器看成一個(gè)完整的從輸入到輸出的轉(zhuǎn)換。②不適合處理交互的應(yīng)用。當(dāng)需要增量地顯示改變時(shí),這個(gè)問題尤為嚴(yán)重。③因?yàn)樵跀?shù)據(jù)傳輸上沒有通用的標(biāo)準(zhǔn),每個(gè)過濾器都增加了解析和合成數(shù)據(jù)的工作,這樣就導(dǎo)致了系統(tǒng)性能下降,并增加了編寫過濾器的復(fù)雜性。 

  5.批處理風(fēng)格。批處理風(fēng)格的每一步處理都是獨(dú)立的,并且每一步是順序執(zhí)行的,只有當(dāng)前一步處理完后,后一步處理才能開始,數(shù)據(jù)傳送在步與步之間作為一個(gè)整體。批處理的典型應(yīng)用是經(jīng)典數(shù)據(jù)處理和程序開發(fā)。 

  批處理風(fēng)格與管道過濾器風(fēng)格的共同點(diǎn)是把任務(wù)分解成一系列固定順序的計(jì)算單元(組件),組件間只通過數(shù)據(jù)傳遞交互。區(qū)別表現(xiàn)在以下幾個(gè)方面:批處理是全部的、高潛伏性的、輸入時(shí)可隨機(jī)存取、無(wú)合作性、無(wú)交互性,管道過、濾器是遞增的、數(shù)據(jù)結(jié)果延遲小、輸入時(shí)處理局部化、有反饋、可交互。 

  6.倉(cāng)庫(kù)風(fēng)格。在倉(cāng)庫(kù)風(fēng)格中,有兩種不同的構(gòu)件:中央數(shù)據(jù)結(jié)構(gòu)說明當(dāng)前狀態(tài),獨(dú)立構(gòu)件在中央數(shù)據(jù)存貯上執(zhí)行,倉(cāng)庫(kù)與外構(gòu)件間的相互作用在系統(tǒng)中會(huì)有大的變化。 

  若輸入流中某類時(shí)間觸發(fā)進(jìn)程執(zhí)行的選擇,則倉(cāng)庫(kù)是一傳統(tǒng)型數(shù)據(jù)庫(kù);另一方面,若中央數(shù)據(jù)結(jié)構(gòu)的當(dāng)前狀態(tài)觸發(fā)進(jìn)程執(zhí)行的選擇,則倉(cāng)庫(kù)是一黑板系統(tǒng)。 

  二、三層C/S軟件體系結(jié)構(gòu)分析 

  C/S軟件體系結(jié)構(gòu)是20世紀(jì)90年代成熟起來(lái)的技術(shù),它將應(yīng)用一分為二,服務(wù)器(后臺(tái))負(fù)責(zé)數(shù)據(jù)管理,客戶機(jī)(前臺(tái))完成與用戶的交互任務(wù)。 

  傳統(tǒng)的二層C/S結(jié)構(gòu)存在以下幾個(gè)局限:1.二層C/S結(jié)構(gòu)是單一服務(wù)器且以局域網(wǎng)為中心的,所以難以擴(kuò)展至大型企業(yè)廣域網(wǎng)或Internet;2.軟、硬件的組合及集成能力有限;3.客戶機(jī)的負(fù)荷太重,難以管理大量的客戶機(jī),系統(tǒng)的性能容易變壞;4.數(shù)據(jù)安全性不好。因?yàn)槎䦟覥/S有這么多缺點(diǎn),三層C/S結(jié)構(gòu)應(yīng)運(yùn)而生。三層C/S結(jié)構(gòu)是將應(yīng)用功能分成表示層、功能層和數(shù)據(jù)層三個(gè)部分,如下圖所示。 

  表示層是應(yīng)用的用戶接口部分,它擔(dān)負(fù)著用戶與應(yīng)用間的對(duì)話功能。表示層一般使用圖形用戶接口,操作簡(jiǎn)單、易學(xué)易用。功能層相當(dāng)于應(yīng)用的本體,它是將具體的業(yè)務(wù)處理邏輯編入程序中。功能層的程序多半是用可視化編程工具開發(fā)的。數(shù)據(jù)層就是數(shù)據(jù)庫(kù)管理系統(tǒng),負(fù)責(zé)管理對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的讀寫。數(shù)據(jù)庫(kù)管理系統(tǒng)必須能迅速執(zhí)行大量數(shù)據(jù)的更新和檢索。因此,一般從功能層傳送到數(shù)據(jù)層的要求大都使用SQL語(yǔ)言。 

  對(duì)二層C/S結(jié)構(gòu)的局限,三層C/S的解決方案是:對(duì)這三層進(jìn)行明確分割,并在邏輯上使其獨(dú)立。與傳統(tǒng)的二層結(jié)構(gòu)相比,三層C/S結(jié)構(gòu)具有以下優(yōu)點(diǎn): 

  1.允許合理地劃分三層結(jié)構(gòu)的功能,使之在邏輯上保持相對(duì)獨(dú)立性,從而使整個(gè)系統(tǒng)的邏輯結(jié)構(gòu)更為清晰,能提高系統(tǒng)和軟件的可維護(hù)性和可擴(kuò)展性。2.允許更靈活有效地選用相應(yīng)的平臺(tái)和硬件系統(tǒng),使之在處理負(fù)荷能力上與處理特性上分別適應(yīng)于結(jié)構(gòu)清晰的三層;并且這些平臺(tái)和各個(gè)組成部分可以具有良好的可升級(jí)性和開放性。3.三層C/S結(jié)構(gòu)中,應(yīng)用的各層可以并行開發(fā),各層也可以選擇各自最適合的開發(fā)語(yǔ)言。使之能并行地而且是高效地進(jìn)行開發(fā),達(dá)到較高的性能價(jià)格比;對(duì)每一層的處理邏輯的開發(fā)和維護(hù)也會(huì)更容易些。4.允許充分利用功能層有效地隔離開表示層與數(shù)據(jù)層,未授權(quán)的用戶難以繞過功能層而利用數(shù)據(jù)庫(kù)工具或黑客手段去非法地訪問數(shù)據(jù)層,這就為嚴(yán)格的安全管理奠定了堅(jiān)實(shí)的基礎(chǔ);整個(gè)系統(tǒng)的管理層次也更加合理和可控制。 

  軟件體系結(jié)構(gòu)風(fēng)格為大粒度的軟件重用提供了可能。然而,對(duì)于應(yīng)用體系結(jié)構(gòu)風(fēng)格來(lái)說,由于視點(diǎn)的不同,系統(tǒng)設(shè)計(jì)師有很大的選擇空間。要為系統(tǒng)選擇或設(shè)計(jì)某一個(gè)體系結(jié)構(gòu)風(fēng)格,必須根據(jù)特定項(xiàng)目的具體特點(diǎn),進(jìn)行分析比較后再確定。不同的結(jié)構(gòu)有不同的處理能力的強(qiáng)項(xiàng)和弱點(diǎn),一個(gè)系統(tǒng)的體系結(jié)構(gòu)應(yīng)該根據(jù)實(shí)際需要進(jìn)行選擇,以解決實(shí)際問題。 

  參考文獻(xiàn): 

  [1]Shaw M, Garlan D, Software Architecture Perspectives on an emerging discipline, Prentice Hall, 1996 

  [2]馮 沖 江 賀 馮靜芳編著:軟件體系結(jié)構(gòu)理論與實(shí)踐.人民郵電出版社 

  [3]Mary Shaw. Making Choices:A comparison of styles forsoftware architecture[J].IEEE Software,special issue onsoftware architecture,1995 

  [4]覃 征 何堅(jiān)等編著:軟件體系結(jié)構(gòu).西安交通大學(xué)出版社