軟件體系結構是具有一定形式的結構化元素,即構件的集合,包括處理構件、數據構件和連接構件。處理構件負責對數據進(jìn)行加工,數據構件是被加工的信息,連接構件把體系結構的不同部分組組合連接起來(lái)。這一定義注重區分處理構件、數據構件和連接構件,這一方法在其他的定義和方法中基本上得到保持。
一、軟件體系結構的定義
雖然軟件體系結構已經(jīng)在軟件工程領(lǐng)域中有著(zhù)廣泛的應用,但迄今為止還沒(méi)有一個(gè)被大家所公認的定義。許多專(zhuān)家學(xué)者從不同角度和不同側面對軟件體系結構進(jìn)行了刻畫(huà),較為典型的定義有:
?。?)Dewayne Perry和A1ex Wo1f曾這樣定義:軟件體系結構是具有一定形式的結構化元素,即構件的集合,包括處理構件、數據構件和連接構件。處理構件負責對數據進(jìn)行加工,數據構件是被加工的信息,連接構件把體系結構的不同部分組組合連接起來(lái)。這一定義注重區分處理構件、數據構件和連接構件,這一方法在其他的定義和方法中基本上得到保持。
(2)Mary Shaw和David Garlan認為軟件體系結構是軟件設計過(guò)程中的一個(gè)層次,這一層次超越計算過(guò)程中的算法設計和數據結構設計。體系結構問(wèn)題包括總體組織和全局控制、通訊協(xié)議、同步、數據存取,給設計元素分配特定功能,設計元素的組織,規模和性能,在各設計方案間進(jìn)行選擇等。軟件體系結構處理算法與數據結構之上關(guān)于整體系統結構設計和描述方面的一些問(wèn)題,如全局組織和全局控制結構、關(guān)于通訊、同步與數據存取的協(xié)議,設計構件功能定義,物理分布與合成,設計方案的選擇、評估與實(shí)現等
?。?)Kruchten指出,軟件體系結構有四個(gè)角度,它們從不同方面對系統進(jìn)行描述:概念角度描述系統的主要構件及它們之間的關(guān)系;模塊角度包含功能分解與層次結構;運行角度描述了一個(gè)系統的動(dòng)態(tài)結構;代碼角度描述了各種代碼和庫函數在開(kāi)發(fā)環(huán)境中的組織。
?。?)Hayes Roth則認為軟件體系結構是一個(gè)抽象的系統規范,主要包括用其行為來(lái)描述的功能構件和構件之間的相互連接、接口和關(guān)系。
?。?)David Garlan和Dewne Perry于1995年在IEEE軟件工程學(xué)報上又采用如下的定義:軟件體系結構是一個(gè)程序/系統各構件的結構、它們之間的相互關(guān)系以及進(jìn)行設計的原則和隨時(shí)間進(jìn)化的指導方針。
?。?)Barry Boehm和他的學(xué)生提出,一個(gè)軟件體系結構包括一個(gè)軟件和系統構件,互聯(lián)及約束的集合;一個(gè)系統需求說(shuō)明的集合;一個(gè)基本原理用以說(shuō)明這一構件,互聯(lián)和約束能夠滿(mǎn)足系統需求。
?。?)1997年,Bass,Ctements和Kazman在《使用軟件體系結構》一書(shū)中給出如下的定義:一個(gè)程序或計算機系統的軟件體系結構包括一個(gè)或一組軟件構件、軟件構件的外部的可見(jiàn)特性及其相互關(guān)系。其中,"軟件外部的可見(jiàn)特性"是指軟件構件提供的服務(wù)、性能、特性、錯誤處理、共享資源使用等。
二、軟件體系結構的發(fā)展歷史
與最初的大型中央主機相適應,最初的軟件結構體系也是Mainframe結構,該結構下客戶(hù)、數據和程序被集中在主機上,通常只有少量的GUI界面,對遠程數據庫的訪(fǎng)問(wèn)比較困難。隨著(zhù)PC的廣泛應用,該結構逐漸在應用中被淘汰。
在80年代中期出現了Client/Server分布式計算結構,應用程序的處理在客戶(hù)(PC機)和服務(wù)器(Mainframe或Server)之間分擔;請求通常被關(guān)系型數據庫處理,PC機在接受到被處理的數據后實(shí)現顯示和業(yè)務(wù)邏輯;系統支持模塊化開(kāi)發(fā),通常有GUI界面。Client/Server結構因為其靈活性得到了極其廣泛的應用。但對于大型軟件系統而言,這種結構在系統的部署和擴展性方面還是存在著(zhù)不足。
Internet的發(fā)展給傳統應用軟件的開(kāi)發(fā)帶來(lái)了深刻的影響?;贗nternet和Web的軟件和應用系統無(wú)疑需要更為開(kāi)放和靈活的體系結構。隨著(zhù)越來(lái)越多的商業(yè)系統被搬上Internet,一種新的、更具生命力的體系結構被廣泛采用,這就是為我們所知的“三層/多層計算”。
??蛻?hù)層(client tier) 用戶(hù)接口和用戶(hù)請求的發(fā)出地,典型應用是網(wǎng)絡(luò )瀏覽器和胖客戶(hù)(如Java程序)
。服務(wù)器層(server tier) 典型應用是Web服務(wù)器和運行業(yè)務(wù)代碼的應用程序服務(wù)器
。數據層(data tier) 典型應用是關(guān)系型數據庫和其他后端(back-end)數據資源, 如 Oracle和SAP、 R/3等
三層體系結構中,客戶(hù)(請求信息)、程序(處理請求)和數據(被操作)被物理地隔離。三層結構是個(gè)更靈活的體系結構,它把顯示邏輯從業(yè)務(wù)邏輯中分離出來(lái),這就意味著(zhù)業(yè)務(wù)代碼是獨立的,可以不關(guān)心怎樣顯示和在哪里顯示。業(yè)務(wù)邏輯層現在處于中間層,不需要關(guān)心由哪種類(lèi)型的客戶(hù)來(lái)顯示數據,也可以與后端系統保持相對獨立性,有利于系統擴展。三層結構具有更好的移植性,可以跨不同類(lèi)型的平臺工作,允許用戶(hù)請求在多個(gè)服務(wù)器間進(jìn)行負載平衡。三層結構中安全性也更易于實(shí)現,因為應用程序已經(jīng)同客戶(hù)隔離。應用程序服務(wù)器是三層/多層體系結構的組成部分,應用程序服務(wù)器位于中間層。

如圖所示,應用程序服務(wù)器運行于瀏覽器和數據資源之間,一個(gè)簡(jiǎn)單的實(shí)例是,顧客從瀏覽器中輸入一個(gè)定單,web服務(wù)器將該請求發(fā)送給應用程序服務(wù)器,由應用程序服務(wù)器執行處理邏輯,并且獲取或更新后端用戶(hù)數據。
摘自http://www.huihoo.com/middleware/application_server/1/a1.html
三、軟件體系結構的興起
六十年代的軟件危機使得人們開(kāi)始重視軟件工程的研究。起初,人們把軟件設計的重點(diǎn)放在數據結構和算法的選擇上,隨著(zhù)軟件系統規模越來(lái)越大、越來(lái)越復雜,整個(gè)系統的結構和規格說(shuō)明顯得越來(lái)越重要。軟件危機的程度日益加劇,現有的軟件工程方法對此顯得力不從心。對于大規模的復雜軟件系統來(lái)說(shuō),對總體的系統結構設計和規格說(shuō)明比起對計算的算法和數據結構的選擇已經(jīng)變得明顯重要得多。在此種背景下,人們認識到軟件體系結構的重要性,并認為對軟件體系結構的系統、深入的研究將會(huì )成為提高軟件生產(chǎn)率和解決軟件維護問(wèn)題的新的最有希望的途徑。
自從軟件系統首次被分成許多模塊,模塊之間有相互作用,組合起來(lái)有整體的屬性,就具有了體系結構。好的開(kāi)發(fā)者常常會(huì )使用一些體系結構模式作為軟件系統結構設計策略,但他們并沒(méi)有規范地、明確地表達出來(lái),這樣就無(wú)法將他們的知識與別人交流。軟件體系結構是設計抽象的進(jìn)一步發(fā)展,滿(mǎn)足了更好地理解軟件系統,更方便地開(kāi)發(fā)更大、更復雜的軟件系統的需要。
事實(shí)上,軟件總是有體系結構的,不存在沒(méi)有體系結構的軟件。體系結構(Architecture)一詞在英文里就是"建筑"的意思。把軟件比作一座樓房,從整體上講,是因為它有基礎、主體和裝飾,即操作系統之上的基礎設施軟件、實(shí)現計算邏輯的主體應用程序、方便使用的用戶(hù)界面程序。從細節上來(lái)看每一個(gè)程序也是有結構的。早期的結構化程序就是以語(yǔ)句組成模塊,模塊的聚集和嵌套形成層層調用的程序結構,也就是體系結構。結構化程序的程序(表達)結構和(計算的)邏輯結構的一致性及自頂向下開(kāi)發(fā)方法自然而然地形成了體系結構。由于結構化程序設計時(shí)代程序規模不大,通過(guò)強調結構化程序設計方法學(xué),自頂向下、逐步求精,并注意模塊的耦合性就可以得到相對良好的結構,所以,并未特別研究軟件體系結構。
我們可以作個(gè)簡(jiǎn)單的比喻,結構化程序設計時(shí)代是以磚、瓦、灰、沙、石、預制梁、柱、屋面板蓋平房和小樓,而面向對象時(shí)代以整面墻、整間房、一層樓梯的預制件蓋高樓大廈。構件怎樣搭配才合理?體系結構怎樣構造容易?重要構件有了更改后,如何保證整棟高樓不倒?每種應用領(lǐng)域需要什么構件(醫院、工廠(chǎng)、旅館)?有哪些實(shí)用、美觀(guān)、強度、造價(jià)合理的構件骨架使建造出來(lái)的建筑(即體系結構)更能滿(mǎn)足用戶(hù)的需求?如同土木工程進(jìn)入到現代建筑學(xué)一樣,軟件也從傳統的軟件工程進(jìn)入到現代面向對象的軟件工程,研究整個(gè)軟件系統的體系結構,尋求建構最快、成本最低、質(zhì)量最好的構造過(guò)程。
軟件體系結構雖脫胎于軟件工程,但其形成同時(shí)借鑒了計算機體系結構和網(wǎng)絡(luò )體系結構中很多寶貴的思想和方法,最近幾年軟件體系結構研究已完全獨立于軟件工程的研究,成為計算機科學(xué)的一個(gè)最新的研究方向和獨立學(xué)科分支。軟件體系結構研究的主要內容涉及軟件體系結構描述、軟件體系結構風(fēng)格、軟件體系結構評價(jià)和軟件體系結構的形式化方法等。解決好軟件的重用、質(zhì)量和維護問(wèn)題,是研究軟件體系結構的根本目的。
四、軟件體系結構應用現狀
1 形成研究熱點(diǎn),仍處于非形式化水平
自20世紀90年代后期以來(lái),軟件體系結構的研究成為一個(gè)熱點(diǎn)。廣大軟件工作者已經(jīng)認識到軟件體系結構研究的重大意義和它對軟件系統設計開(kāi)發(fā)的重要性,開(kāi)展了很多研究和實(shí)踐工作。
從軟件體系結構研究的現狀來(lái)看,當前的研究和對軟件體系結構的描述,在很大程度上來(lái)說(shuō)還停留在非形式化的基礎上。軟件構架師仍然缺乏必要的工具,這種工具應該是顯式描述的、有獨立性的形式化工具。
在目前通用的軟件開(kāi)發(fā)方法中,其描述通常是用非形式化的圖和文本,不能描述系統期望的存在于構件之間的接口,不能描述不同的組成系統的組合關(guān)系的意義。難以被開(kāi)發(fā)人員理解,更不能用來(lái)分析其一致性和完整性等特性。
當一個(gè)軟件系統中的構件之間幾乎以一種非形式化的方法描述時(shí),系統的重用性也會(huì )受到影響,在設計一個(gè)系統結構過(guò)程中的努力很難移植到另一個(gè)系統中去。對系統構件和連接關(guān)系的結構化假設沒(méi)有得到顯式的、形式化的描述時(shí),把這樣的系統構件移植到另一個(gè)系統中去將是有風(fēng)險的,甚至是不可能的。
2 軟件體系結構的形式化方法研究
軟件體系結構研究如果僅僅停留在非形式化的框圖階段,已經(jīng)難以適應進(jìn)一步發(fā)展的需要。為支持基于體系結構的開(kāi)發(fā),需要有形式化建模符號、體系結構說(shuō)明的分析與開(kāi)發(fā)工具。從軟件體系結構研究的現狀來(lái)看,在這一領(lǐng)域近來(lái)已經(jīng)有不少進(jìn)展,其中比較有代表性的是美國卡耐基梅隆大學(xué)(Carnegie Mellon University)的Robert J.A11en于l997年提出的Wright系統。Wright是-種結構描述語(yǔ)言,該語(yǔ)言基于一種形式化的、抽象的系統模型,為描述和分析軟件體系結構和結構化方法提供了一種實(shí)用的工具。Wright主要側重于描述系統的軟件構件和連接的結構、配置和方法。它使用顯式的、獨立的連接模型來(lái)作為交互的方式,這使得該系統可以用邏輯謂詞符號系統,而不依賴(lài)特定的系統實(shí)例來(lái)描述系統的抽象行為。該系統還可以通過(guò)一組靜態(tài)檢查來(lái)判斷系統結構規格說(shuō)明的一致性和完整性。從這些特性的分析來(lái)說(shuō),Wright系統的確適用于對大型系統的描述和分析。
3 軟件體系結構的建模研究
研究軟件體系結構的首要問(wèn)題是如何表示軟件體系結構,即如何對軟件體系結構建模。根據建模的側重點(diǎn)的不同,可以將軟件體系結構的模型分為5種:結構模型、框架模型、動(dòng)態(tài)模型、過(guò)程模型和功能模型。在這5個(gè)模型中,最常用的是結構模型和動(dòng)態(tài)模型。
(1)結構模型
這是一個(gè)最直觀(guān)、最普遍的建模方法。這種方法以體系結構的構件、連接件和其他概念來(lái)刻畫(huà)結構,并力圖通過(guò)結構來(lái)反映系統的重要語(yǔ)義內容,包括系統的配置、約束、隱含的假設條件、風(fēng)格、性質(zhì)。研究結構模型的核心是體系結構描述語(yǔ)言。
(2)框架模型
框架模型與結構模型類(lèi)似,但它不太側重描述結構的細節而更側重于整體的結構??蚣苣P椭饕砸恍┨厥獾膯?wèn)題為目標建立只針對和適應該問(wèn)題的結構。
(3)動(dòng)態(tài)模型
動(dòng)態(tài)模型是對結構或框架模型的補充,研究系統的"大顆粒"的行為性質(zhì)。例如,描述系統的重新配置或演化。動(dòng)態(tài)可能指系統總體結構的配置、建立或拆除通信通道或計算的過(guò)程。這類(lèi)系統常是激勵型的。
(4)過(guò)程模型
過(guò)程模型研究構造系統的步驟和過(guò)程。因而結構是遵循某些過(guò)程腳本的結果。
(5)功能模型
該模型認為體系結構是由一組功能構件按層次組成,下層向上層提供服務(wù)。它可以看作是一種特殊的框架模型。
這5種模型各有所長(cháng),也許將5種模型有機地統一在一起,形成一個(gè)完整的模型來(lái)刻畫(huà)軟件體系結構更合適。例如,Kruchten在1995年提出了一個(gè)"4+1"的視角模型。"4+1"模型從5個(gè)不同的視角包括邏輯視角、過(guò)程視角、物理視角、開(kāi)發(fā)視角和場(chǎng)景視角來(lái)描述軟件體系結構。每一個(gè)視角只關(guān)心系統的一個(gè)側面,5個(gè)視角結合在一起才能夠反映系統的軟件體系結構的全部?jì)热荨?4+1"模型如圖1所示。

4 發(fā)展基于體系結構的軟件開(kāi)發(fā)模型
軟件開(kāi)發(fā)模型是跨越整個(gè)軟件生存周期的系統開(kāi)發(fā)、運行、維護所實(shí)施的全部工作和任務(wù)的結構框架,給出了軟件開(kāi)發(fā)活動(dòng)各階段之間的關(guān)系。目前,常見(jiàn)的軟件開(kāi)發(fā)模型大致可分為三種類(lèi)型:
?。?)以軟件需求完全確定為前提的瀑布模型。
?。?)在軟件開(kāi)發(fā)初始階段只能提供基本需求時(shí)采用的漸進(jìn)式開(kāi)發(fā)模型,如螺旋模型等。
?。?)以形式化開(kāi)發(fā)方法為基礎的變換模型。
所有開(kāi)發(fā)方法都是要解決需求與實(shí)現之間的差距。但是,這三種類(lèi)型的軟件開(kāi)發(fā)模型都存在這樣或那樣的缺陷,不能很好地支持基于軟件體系結構的開(kāi)發(fā)過(guò)程。因此,研究人員在發(fā)展基于體系結構的軟件開(kāi)發(fā)模型方面做了一定的工作。例如,為了形象地表示體系結構的生命周期,北京郵電大學(xué)的周瑩新博士建立了一個(gè)軟件體系結構的生命周期模型,該模型如圖2所示。

圖2 軟件體系結構的生命周期模型
5 軟件產(chǎn)品線(xiàn)體系結構的研究
軟件體系結構的開(kāi)發(fā)是大型軟件系統開(kāi)發(fā)的關(guān)鍵環(huán)節。體系結構在軟件生產(chǎn)線(xiàn)的開(kāi)發(fā)中具有至關(guān)重要的作用,在這種開(kāi)發(fā)生產(chǎn)中,基于同一個(gè)軟件體系結構,可以創(chuàng )建具有不同功能的多個(gè)系統。在軟件產(chǎn)品族之間共享體系結構和一組可重用的構件,可以增加軟件工程和降低開(kāi)發(fā)和維護成本。
一個(gè)產(chǎn)品線(xiàn)代表著(zhù)一組具有公共的系統需求集的軟件系統,它們都是根據基本的用戶(hù)需求對標準的產(chǎn)品線(xiàn)構架進(jìn)行定制,將可重用構件與系統獨有的部分集成而得到的。采用軟件生產(chǎn)線(xiàn)式模式進(jìn)行軟件生產(chǎn),將產(chǎn)生巨型編程企業(yè)。但目前生產(chǎn)的軟件產(chǎn)品族大部分是處于同一領(lǐng)域的。
五、軟件體系結構的影響
軟件體系結構貫穿于軟件研發(fā)的整個(gè)生命周期內,具有重要的影響。這主要從以下三個(gè)方面來(lái)進(jìn)行考察:
(1) 利益相關(guān)人員之間的交流:軟件體系結構是一種常見(jiàn)的對系統的抽象,代碼級別的系統抽象僅僅可以成為程序員的交流工具,而包括程序員在內的絕大多數系統的利益相關(guān)人員都借助軟件體系結構來(lái)進(jìn)行彼此理解、協(xié)商、達成共識或者相互溝通的基礎。
(2) 系統設計的前期決策:軟件體系結構是我們所開(kāi)發(fā)的軟件系統最早期設計決策的體現,而這些早期決策對軟件系統的后續開(kāi)發(fā)、部署和維護具有相當重要的影響。這也是能夠對所開(kāi)發(fā)系統進(jìn)行分析的最早時(shí)間點(diǎn)。
(3) 可傳遞的系統級抽象:軟件體系結構是關(guān)于系統構造以及系統各個(gè)元素工作機制的相對較小、卻又能夠突出反映問(wèn)題的模型。由于軟件系統具有的一些共通特性,這種模型可以在多個(gè)系統之間傳遞,特別是可以應用到具有相似質(zhì)量屬性和功能需求的系統中,并能夠促進(jìn)大規模軟件的系統級復用。
六、軟件體系結構的風(fēng)格
對軟件體系結構風(fēng)格的研究和實(shí)踐促進(jìn)了對設計的復用,一些經(jīng)過(guò)實(shí)踐證實(shí)的解決方案也可以可靠地用于解決新的問(wèn)題。體系結構風(fēng)格的不變部分使不同的系統可以共享同一個(gè)實(shí)現代碼。只要系統是使用常用的、規范的方法來(lái)組織,就可使別的設計者很容易地理解系統的體系結構。例如,如果某人把系統描述為"客戶(hù)/服務(wù)器"模式,則不必給出設計細節,我們立刻就會(huì )明白系統是如何組織和工作的。
下面是Garlan和Shaw對通用體系結構風(fēng)格的分類(lèi):
?。?)數據流風(fēng)格:批處理序列;管道/過(guò)濾器
?。?)調用/返回風(fēng)格:主程序/子程序;面向對象風(fēng)格;層次結構
?。?)獨立構件風(fēng)格:進(jìn)程通訊;事件系統
?。?)虛擬機風(fēng)格:解釋器;基于規則的系統
?。?)倉庫風(fēng)格:數據庫系統;超文本系統;黑板系統
限于篇幅,在本文中,我們將只介紹幾種主要的和經(jīng)典的體系結構風(fēng)格和它們的優(yōu)缺點(diǎn)。有關(guān)新出現的軟件體系結構風(fēng)格,將在后續文章中進(jìn)行介紹。
1、C2風(fēng)格
C2體系結構風(fēng)格可以概括為:通過(guò)連接件綁定在一起的按照一組規則運作的并行構件網(wǎng)絡(luò )。C2風(fēng)格中的系統組織規則如下:
?。?)系統中的構件和連接件都有一個(gè)頂部和一個(gè)底部;
?。?)構件的頂部應連接到某連接件的底部,構件的底部則應連接到某連接件的頂部,而構件與構件之間的直接連接是不允許的;
?。?)一個(gè)連接件可以和任意數目的其它構件和連接件連接;
?。?)當兩個(gè)連接件進(jìn)行直接連接時(shí),必須由其中一個(gè)的底部到另一個(gè)的頂部。
圖3是C2風(fēng)格的示意圖。圖中構件與連接件之間的連接體現了C2風(fēng)格中構建系統的規則。

C2風(fēng)格是最常用的一種軟件體系結構風(fēng)格。從C2風(fēng)格的組織規則和結構圖中,我們可以得出,C2風(fēng)格具有以下特點(diǎn):
?。?)系統中的構件可實(shí)現應用需求,并能將任意復雜度的功能封裝在一起;
?。?)所有構件之間的通訊是通過(guò)以連接件為中介的異步消息交換機制來(lái)實(shí)現的;
?。?)構件相對獨立,構件之間依賴(lài)性較少。系統中不存在某些構件將在同一地址空間內執行,或某些構件共享特定控制線(xiàn)程之類(lèi)的相關(guān)性假設。
2、管道/過(guò)濾器風(fēng)格
在管道/過(guò)濾器風(fēng)格的軟件體系結構中,每個(gè)構件都有一組輸入和輸出,構件讀輸入的數據流,經(jīng)過(guò)內部處理,然后產(chǎn)生輸出數據流。這個(gè)過(guò)程通常通過(guò)對輸入流的變換及增量計算來(lái)完成,所以在輸入被完全消費之前,輸出便產(chǎn)生了。因此,這里的構件被稱(chēng)為過(guò)濾器,這種風(fēng)格的連接件就象是數據流傳輸的管道,將一個(gè)過(guò)濾器的輸出傳到另一過(guò)濾器的輸入。此風(fēng)格特別重要的過(guò)濾器必須是獨立的實(shí)體,它不能與其它的過(guò)濾器共享數據,而且一個(gè)過(guò)濾器不知道它上游和下游的標識。一個(gè)管道/過(guò)濾器網(wǎng)絡(luò )輸出的正確性并不依賴(lài)于過(guò)濾器進(jìn)行增量計算過(guò)程的順序。
圖4是管道/過(guò)濾器風(fēng)格的示意圖。一個(gè)典型的管道/過(guò)濾器體系結構的例子是以Unix shell編寫(xiě)的程序。Unix既提供一種符號,以連接各組成部分(Unix的進(jìn)程),又提供某種進(jìn)程運行時(shí)機制以實(shí)現管道。另一個(gè)著(zhù)名的例子是傳統的編譯器。傳統的編譯器一直被認為是一種管道系統,在該系統中,一個(gè)階段(包括詞法分析、語(yǔ)法分析、語(yǔ)義分析和代碼生成)的輸出是另一個(gè)階段的輸入。

管道/過(guò)濾器風(fēng)格的軟件體系結構具有許多很好的特點(diǎn):
?。?)使得軟構件具有良好的隱蔽性和高內聚、低耦合的特點(diǎn);
?。?)允許設計者將整個(gè)系統的輸入/輸出行為看成是多個(gè)過(guò)濾器的行為的簡(jiǎn)單合成;
?。?)支持軟件重用。重要提供適合在兩個(gè)過(guò)濾器之間傳送的數據,任何兩個(gè)過(guò)濾器都可被連接起來(lái);
?。?)系統維護和增強系統性能簡(jiǎn)單。新的過(guò)濾器可以添加到現有系統中來(lái);舊的可以被改進(jìn)的過(guò)濾器替換掉;
?。?)允許對一些如吞吐量、死鎖等屬性的分析;
?。?)支持并行執行。每個(gè)過(guò)濾器是作為一個(gè)單獨的任務(wù)完成,因此可與其它任務(wù)并行執行。
但是,這樣的系統也存在著(zhù)若干不利因素。
?。?)通常導致進(jìn)程成為批處理的結構。這是因為雖然過(guò)濾器可增量式地處理數據,但它們是獨立的,所以設計者必須將每個(gè)過(guò)濾器看成一個(gè)完整的從輸入到輸出的轉換。
?。?)不適合處理交互的應用。當需要增量地顯示改變時(shí),這個(gè)問(wèn)題尤為嚴重。
?。?)因為在數據傳輸上沒(méi)有通用的標準,每個(gè)過(guò)濾器都增加了解析和合成數據的工作,這樣就導致了系統性能下降,并增加了編寫(xiě)過(guò)濾器的復雜性。
3、數據抽象和面向對象風(fēng)格
抽象數據類(lèi)型概念對軟件系統有著(zhù)重要作用,目前軟件界已普遍轉向使用面向對象系統。這種風(fēng)格建立在數據抽象和面向對象的基礎上,數據的表示方法和它們的相應操作封裝在一個(gè)抽象數據類(lèi)型或對象中。這種風(fēng)格的構件是對象,或者說(shuō)是抽象數據類(lèi)型的實(shí)例。對象是一種被稱(chēng)作管理者的構件,因為它負責保持資源的完整性。對象是通過(guò)函數和過(guò)程的調用來(lái)交互的。
圖5是數據抽象和面向對象風(fēng)格的示意圖。

面向對象的系統有許多的優(yōu)點(diǎn),并早已為人所知:
?。?)因為對象對其它對象隱藏它的表示,所以可以改變一個(gè)對象的表示,而不影響其它的對象。
?。?)設計者可將一些數據存取操作的問(wèn)題分解成一些交互的代理程序的集合。
但是,面向對象的系統也存在著(zhù)某些問(wèn)題:
?。?)為了使一個(gè)對象和另一個(gè)對象通過(guò)過(guò)程調用等進(jìn)行交互,必須知道對象的標識。只要一個(gè)對象的標識改變了,就必須修改所有其他明確調用它的對象。
?。?)必須修改所有顯式調用它的其它對象,并消除由此帶來(lái)的一些副作用。例如,如果A使用了對象B,C也使用了對象B,那么,C對B的使用所造成的對A的影響可能是料想不到的。
4、基于事件的隱式調用風(fēng)格
基于事件的隱式調用風(fēng)格的思想是構件不直接調用一個(gè)過(guò)程,而是觸發(fā)或廣播一個(gè)或多個(gè)事件。系統中的其它構件中的過(guò)程在一個(gè)或多個(gè)事件中注冊,當一個(gè)事件被觸發(fā),系統自動(dòng)調用在這個(gè)事件中注冊的所有過(guò)程,這樣,一個(gè)事件的觸發(fā)就導致了另一模塊中的過(guò)程的調用。
從體系結構上說(shuō),這種風(fēng)格的構件是一些模塊,這些模塊既可以是一些過(guò)程,又可以是一些事件的集合。過(guò)程可以用通用的方式調用,也可以在系統事件中注冊一些過(guò)程,當發(fā)生這些事件時(shí),過(guò)程被調用。
基于事件的隱式調用風(fēng)格的主要特點(diǎn)是事件的觸發(fā)者并不知道哪些構件會(huì )被這些事件影響。這樣不能假定構件的處理順序,甚至不知道哪些過(guò)程會(huì )被調用,因此,許多隱式調用的系統也包含顯式調用作為構件交互的補充形式。
支持基于事件的隱式調用的應用系統很多。例如,在編程環(huán)境中用于集成各種工具,在數據庫管理系統中確保數據的一致性約束,在用戶(hù)界面系統中管理數據,以及在編輯器中支持語(yǔ)法檢查。例如在某系統中,編輯器和變量監視器可以登記相應Debugger的斷點(diǎn)事件。當Debugger在斷點(diǎn)處停下時(shí),它聲明該事件,由系統自動(dòng)調用處理程序,如編輯程序可以卷屏到斷點(diǎn),變量監視器刷新變量數值。而Debugger本身只聲明事件,并不關(guān)心哪些過(guò)程會(huì )啟動(dòng),也不關(guān)心這些過(guò)程做什么處理。
隱式調用系統的主要優(yōu)點(diǎn)有:
?。?)為軟件重用提供了強大的支持。當需要將一個(gè)構件加入現存系統中時(shí),只需將它注冊到系統的事件中。
?。?)為改進(jìn)系統帶來(lái)了方便。當用一個(gè)構件代替另一個(gè)構件時(shí),不會(huì )影響到其它構件的接口。
隱式調用系統的主要缺點(diǎn)有:
?。?)構件放棄了對系統計算的控制。一個(gè)構件觸發(fā)一個(gè)事件時(shí),不能確定其它構件是否會(huì )響應它。而且即使它知道事件注冊了哪些構件的構成,它也不能保證這些過(guò)程被 調用的順序。
?。?)數據交換的問(wèn)題。有時(shí)數據可被一個(gè)事件傳遞,但另一些情況下,基于事件的系統必須依靠一個(gè)共享的倉庫進(jìn)行交互。在這些情況下,全局性能和資源管理便成了問(wèn)題。
?。?)既然過(guò)程的語(yǔ)義必須依賴(lài)于被觸發(fā)事件的上下文約束,關(guān)于正確性的推理存在問(wèn)題。
5、層次系統風(fēng)格
層次系統組織成一個(gè)層次結構,每一層為上層服務(wù),并作為下層客戶(hù)。在一些層次系統中,除了一些精心挑選的輸出函數外,內部的層只對相鄰的層可見(jiàn)。這樣的系統中構件在一些層實(shí)現了虛擬機(在另一些層次系統中層是部分不透明的)。連接件通過(guò)決定層間如何交互的協(xié)議來(lái)定義,拓撲約束包括對相鄰層間交互的約束。
這種風(fēng)格支持基于可增加抽象層的設計。這樣,允許將一個(gè)復雜問(wèn)題分解成一個(gè)增量步驟序列的實(shí)現。由于每一層最多只影響兩層,同時(shí)只要給相鄰層提供相同的接口,允許每層用不同的方法實(shí)現,同樣為軟件重用提供了強大的支持。
圖6是層次系統風(fēng)格的示意圖。層次系統最廣泛的應用是分層通信協(xié)議。在這一應用領(lǐng)域中,每一層提供一個(gè)抽象的功能,作為上層通信的基礎。較低的層次定義低層的交互,最低層通常只定義硬件物理連接。

圖6 層次系統風(fēng)格的體系結構
層次系統有許多可取的屬性:
?。?)支持基于抽象程度遞增的系統設計,使設計者可以把一個(gè)復雜系統按遞增的步驟進(jìn)行分解;
?。?)支持功能增強,因為每一層至多和相鄰的上下層交互,因此功能的改變最多影響相鄰的上下層;
?。?)支持重用。只要提供的服務(wù)接口定義不變,同一層的不同實(shí)現可以交換使用。這樣,就可以定義一組標準的接口,而允許各種不同的實(shí)現方法。
但是,層次系統也有其不足之處:
?。?)并不是每個(gè)系統都可以很容易地劃分為分層的模式,甚至即使一個(gè)系統的邏輯結構是層次化的,出于對系統性能的考慮,系統設計師不得不把一些低級或高級的功能綜合起來(lái);
?。?)很難找到一個(gè)合適的、正確的層次抽象方法。
6、倉庫風(fēng)格
在倉庫風(fēng)格中,有兩種不同的構件:中央數據結構說(shuō)明當前狀態(tài),獨立構件在中央數據存貯上執行,倉庫與外構件間的相互作用在系統中會(huì )有大的變化。
控制原則的選取產(chǎn)生兩個(gè)主要的子類(lèi)。若輸入流中某類(lèi)時(shí)間觸發(fā)進(jìn)程執行的選擇,則倉庫是一傳統型數據庫;另一方面,若中央數據結構的當前狀態(tài)觸發(fā)進(jìn)程執行的選擇,則倉庫是一黑板系統。
圖7是黑板系統的組成。黑板系統的傳統應用是信號處理領(lǐng)域,如語(yǔ)音和模式識別。另一應用是松耦合代理數據共享存取。

圖7 黑板系統的組成
我們從圖4中可以看出,黑板系統主要由三部分組成:
?。?)知識源。知識源中包含獨立的、與應用程序相關(guān)的知識,知識源之間不直接進(jìn)行通訊,它們之間的交互只通過(guò)黑板來(lái)完成。
?。?)黑板數據結構。黑板數據是按照與應用程序相關(guān)的層次來(lái)組織的解決問(wèn)題的數據,知識源通過(guò)不斷地改變黑板數據來(lái)解決問(wèn)題。
?。?)控制??刂仆耆珊诎宓臓顟B(tài)驅動(dòng),黑板狀態(tài)的改變決定使用的特定知識。
七、發(fā)展方向
1 各種ADLs之間的信息互換
現有的ADLs大多是與領(lǐng)域相關(guān)的,所以不利于對不同領(lǐng)域體系結構的說(shuō)明。但這些針對不同領(lǐng)域的ADLs在某些方面又大同小異,造成資源的冗余。其實(shí),大多數ADLs具有一系列的共同概念。如何用一種公共形式把各種語(yǔ)言綜合起來(lái),使得能夠交換各種體系結構描述信息,將是今后軟件體系結構研究和實(shí)踐的重點(diǎn)之一。
2 設計工具和環(huán)境
軟件體系結構設計既然作為軟件工程的一部分,它的計算機輔助實(shí)現手段是相當重要的。我們應當開(kāi)發(fā)出一些軟件工具來(lái)實(shí)現體系結構的描述和分析,開(kāi)發(fā)階段轉換工具,以實(shí)現階段成果的自動(dòng)轉換,例如,把需求規格說(shuō)明自動(dòng)轉換為構件等。目前關(guān)于這方面的研究成果很少,特別是可以應用到實(shí)際項目開(kāi)發(fā)中的工具和環(huán)境就更少。
3 體系結構再工程
當今軟件系統的規模變得越來(lái)越大,結構也越來(lái)越復雜,同時(shí)從頭開(kāi)始構建的大系統數量在急劇地減少,因而很多遺留系統正在被逐步地利用。從遺留系統軟件代碼和系統中抽取結構信息,經(jīng)過(guò)描述、統一、抽象、一般化與實(shí)例化等處理,可總結出系統的體系結構。
在這種情況下,軟件再工程變得越來(lái)越重要,因為它提供了一條把遺留系統轉換為可進(jìn)化系統的現實(shí)可行的途徑,是一種可以改進(jìn)人們對軟件的理解和改進(jìn)軟件本身的活動(dòng)。這類(lèi)研究的目的是為一些特定的應用領(lǐng)域的軟件系統提供一些體系結構框架,如控制系統、移動(dòng)機器人和用戶(hù)接口界面等。通過(guò)這些框架可以很方便地構造一個(gè)新的軟件系統。
聯(lián)系客服