天天看點

軟體體系結構的風格簡述

對軟體體系結構風格的研究和實踐促進了對設計的複用,一些經過實踐證明的解決方案也可以可靠地用于解決新的問題。體系結構風格的不變部分使不同的系統可以共享同一個實作代碼。隻要系統是使用常用的、規範的方法來組織,就可使别的設計者很容易地了解系統的體系結構。例如,如果某人把系統描述為"客戶/伺服器"模式,則不必給出設計細節,我們立刻就會明白系統是如何組織和工作的。

  下面是Garlan和Shaw對通用體系結構風格的分類:

(1)資料流風格:批處理序列;管道/過濾器

(2)調用/傳回風格:主程式/子程式;面向對象風格;層次結構

(3)獨立構件風格:程序通訊;事件系統

(4)虛拟機風格:解釋器;基于規則的系統

限于篇幅,在本文中,我們将隻介紹幾種主要的和經典的體系結構風格和它們的優缺點。有關新出現的軟體體系結構風格,将在後續文章中進行介紹。

1、C2風格

  C2體系結構風格可以概括為:通過連接配接件綁定在一起的按照一組規則運作的并行構件網絡。C2風格中的系統組織規則如下:

(1)系統中的構件和連接配接件都有一個頂部和一個底部;

(2)構件的頂部應連接配接到某連接配接件的底部,構件的底部則應連接配接到某連接配接件的頂部,而構件與構件之間的直接連接配接是不允許的;

(3)一個連接配接件可以和任意數目的其它構件和連接配接件連接配接;

(4)當兩個連接配接件進行直接連接配接時,必須由其中一個的底部到另一個的頂部。

  C2風格是最常用的一種軟體體系結構風格。從C2風格的組織規則和結構圖中,我們可以得出,C2風格具有以下特點:

(1)系統中的構件可實作應用需求,并能将任意複雜度的功能封裝在一起;

2、管道/過濾器風格

  在管道/過濾器風格的軟體體系結構中,每個構件都有一組輸入和輸出,構件讀輸入的資料流,經過内部處理,然後産生輸出資料流。這個過程通常通過對輸入流的變換及增量計算來完成,是以在輸入被完全消費之前,輸出便産生了。是以,這裡的構件被稱為過濾器,這種風格的連接配接件就象是資料流傳輸的管道,将一個過濾器的輸出傳到另一過濾器的輸入。此風格特别重要的過濾器必須是獨立的實體,它不能與其它的過濾器共享資料,而且一個過濾器不知道它上遊和下遊的辨別。一個管道/過濾器網絡輸出的正确性并不依賴于過濾器進行增量計算過程的順序。

 管道/過濾器風格的示意圖。一個典型的管道/過濾器體系結構的例子是以Unix shell編寫的程式。Unix既提供一種符号,以連接配接各組成部分(Unix的程序),又提供某種程序運作時機制以實作管道。另一個著名的例子是傳統的編譯器。傳統的編譯器一直被認為是一種管道系統,在該系統中,一個階段(包括詞法分析、文法分析、語義分析和代碼生成)的輸出是另一個階段的輸入。

  管道/過濾器風格的軟體體系結構具有許多很好的特點:

(1)使得軟構件具有良好的隐蔽性和高内聚、低耦合的特點;

(2)允許設計者将整個系統的輸入/輸出行為看成是多個過濾器的行為的簡單合成;

(3)支援軟體重用。重要提供适合在兩個過濾器之間傳送的資料,任何兩個過濾器都可被連接配接起來;

(4)系統維護和增強系統性能簡單。新的過濾器可以添加到現有系統中來;舊的可以被改進的過濾器替換掉;

(5)允許對一些如吞吐量、死鎖等屬性的分析;

(6)支援并行執行。每個過濾器是作為一個單獨的任務完成,是以可與其它任務并行執行。

  但是,這樣的系統也存在着若幹不利因素。

  (1)通常導緻程序成為批處理的結構。這是因為雖然過濾器可增量式地處理資料,但它們是獨立的,是以設計者必須将每個過濾器看成一個完整的從輸入到輸出的轉換。

(2)不适合處理互動的應用。當需要增量地顯示改變時,這個問題尤為嚴重。

(3)因為在資料傳輸上沒有通用的标準,每個過濾器都增加了解析和合成資料的工作,這樣就導緻了系統性能下降,并增加了編寫過濾器的複雜性。

3、資料抽象和面向對象風格

  抽象資料類型概念對軟體系統有着重要作用,目前軟體界已普遍轉向使用面向對象系統。這種風格建立在資料抽象和面向對象的基礎上,資料的表示方法和它們的相應操作封裝在一個抽象資料類型或對象中。這種風格的構件是對象,或者說是抽象資料類型的執行個體。對象是一種被稱作管理者的構件,因為它負責保持資源的完整性。對象是通過函數和過程的調用來互動的。

  面向對象的系統有許多的優點,并早已為人所知:

  (1)因為對象對其它對象隐藏它的表示,是以可以改變一個對象的表示,而不影響其它的對象。

(2)設計者可将一些資料存取操作的問題分解成一些互動的代理程式的集合。

  但是,面向對象的系統也存在着某些問題:

  (1)為了使一個對象和另一個對象通過過程調用等進行互動,必須知道對象的辨別。隻要一個對象的辨別改變了,就必須修改所有其他明确調用它的對象。

(2)必須修改所有顯式調用它的其它對象,并消除由此帶來的一些副作用。例如,如果A使用了對象B,C也使用了對象B,那麼,C對B的使用所造成的對A的影響可能是料想不到的。

4、基于事件的隐式調用風格

  基于事件的隐式調用風格的思想是構件不直接調用一個過程,而是觸發或廣播一個或多個事件。系統中的其它構件中的過程在一個或多個事件中注冊,當一個事件被觸發,系統自動調用在這個事件中注冊的所有過程,這樣,一個事件的觸發就導緻了另一子產品中的過程的調用。

  從體系結構上說,這種風格的構件是一些子產品,這些子產品既可以是一些過程,又可以是一些事件的集合。過程可以用通用的方式調用,也可以在系統事件中注冊一些過程,當發生這些事件時,過程被調用。

  基于事件的隐式調用風格的主要特點是事件的觸發者并不知道哪些構件會被這些事件影響。這樣不能假定構件的處理順序,甚至不知道哪些過程會被調用,是以,許多隐式調用的系統也包含顯式調用作為構件互動的補充形式。

  隐式調用系統的主要優點有:

  (1)為軟體重用提供了強大的支援。當需要将一個構件加入現存系統中時,隻需将它注冊到系統的事件中。

(2)為改進系統帶來了友善。當用一個構件代替另一個構件時,不會影響到其它構件的接口。

隐式調用系統的主要缺點有:

(1)構件放棄了對系統計算的控制。一個構件觸發一個事件時,不能确定其它構件是否會響應它。而且即使它知道事件注冊了哪些構件的構成,它也不能保證這些過程被 調用的順序。

(2)資料交換的問題。有時資料可被一個事件傳遞,但另一些情況下,基于事件的系統必須依靠一個共享的倉庫進行互動。在這些情況下,全局性能和資源管理便成了問題。

(3)既然過程的語義必須依賴于被觸發事件的上下文限制,關于正确性的推理存在問題。

5、層次系統風格

  層次系統組織成一個層次結構,每一層為上層服務,并作為下層客戶。在一些層次系統中,除了一些精心挑選的輸出函數外,内部的層隻對相鄰的層可見。這樣的系統中構件在一些層實作了虛拟機(在另一些層次系統中層是部分不透明的)。連接配接件通過決定層間如何互動的協定來定義,拓撲限制包括對相鄰層間互動的限制。

  這種風格支援基于可增加抽象層的設計。這樣,允許将一個複雜問題分解成一個增量步驟序列的實作。由于每一層最多隻影響兩層,同時隻要給相鄰層提供相同的接口,允許每層用不同的方法實作,同樣為軟體重用提供了強大的支援。

  層次系統有許多可取的屬性:

  (1)支援基于抽象程度遞增的系統設計,使設計者可以把一個複雜系統按遞增的步驟進行分解;

(2)支援功能增強,因為每一層至多和相鄰的上下層互動,是以功能的改變最多影響相鄰的上下層;

(3)支援重用。隻要提供的服務接口定義不變,同一層的不同實作可以交換使用。這樣,就可以定義一組标準的接口,而允許各種不同的實作方法。

但是,層次系統也有其不足之處:

(1)并不是每個系統都可以很容易地劃分為分層的模式,甚至即使一個系統的邏輯結構是階層化的,出于對系統性能的考慮,系統設計師不得不把一些低級或進階的功能綜合起來;

(2)很難找到一個合适的、正确的層次抽象方法。

6、倉庫風格

  在倉庫風格中,有兩種不同的構件:中央資料結構說明目前狀态,獨立構件在中央資料存貯上執行,倉庫與外構件間的互相作用在系統中會有大的變化。

  控制原則的選取産生兩個主要的子類。若輸入流中某類時間觸發程序執行的選擇,則倉庫是一傳統型資料庫;另一方面,若中央資料結構的目前狀态觸發程序執行的選擇,則倉庫是一黑闆系統。

  我們從圖4中可以看出,黑闆系統主要由三部分組成:

  (1)知識源。知識源中包含獨立的、與應用程式相關的知識,知識源之間不直接進行通訊,它們之間的互動隻通過黑闆來完成。

(2)黑闆資料結構。黑闆資料是按照與應用程式相關的層次來組織的解決問題的資料,知識源通過不斷地改變黑闆資料來解決問題。

(3)控制。控制完全由黑闆的狀态驅動,黑闆狀态的改變決定使用的特定知識。