1. 程式人生 > >軟體架構設計---軟體架構風格

軟體架構設計---軟體架構風格

軟體架構風格

    軟體架構設計的一個核心問題是能否使用重複的軟體架構模式,即能否達到架構級別的軟體重用。也就是說,能否在不同的軟體系統中,使用同一架構。基於這個目的,學者們開始研究和實踐軟體架構的風格和型別問題。

    軟體架構風格是描述某一特定應用領域中系統組織方式的慣用模式( idiomatic paradigm)。架構風格定義了一個系統家族,即一個架構定義一個詞彙表和一組約束。詞彙表中包含一些構件和連線件型別,而這組約束指出系統是如何將這些構件和連線件組合起來的。架構風格反映了領域中眾多系統所共有的結構和語義特性,並指導如何將各個模組和子系統有效地組織成一個完整的系統。按這種方式理解,軟體架構風格定義了用於描述系統的術語表和一組指導構建系統的規則。

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

    軟體架構風格為大粒度的軟體重用提供了可能。然而,對於應用架構風格來說,由於視點的不同,系統設計師有很大的選擇餘地。要為系統選擇或設計某一個架構風格,必須根據特定專案的具體特點,進行分析比較後再確定,架構風格的使用幾乎完全是特定的。

1 軟體架構風格分類

    討論架構風格時要回答的問題是:

   (1)設計詞彙表是什麼?

    (2)構件和連線件的型別是什麼?

    (3)可容許的結構模式是什麼?

    (4)基本的計算模型是什麼?

    (5)風格的基本不變性是什麼?

    (6)其使用的常見例子是什麼?

    (7)使用此風格的優缺點是什麼?

    (8)其常見的特例是什麼?

    這些問題的回答包括了架構風格的最關鍵的四要素內容,即提供一個詞彙表、定義一套配置規則、定義一套語義解釋原則和定義對基於這種風格的系統所進行的分析。Garlan 和 Shaw 根據此框架給出了通用架構風格的分類:

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

    (2)呼叫/返回風格:主程式/子程式;面向物件風格;層次結構。

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

    (4)虛擬機器風格:直譯器;基於規則的系統。

    (5)倉庫風格:資料庫系統;超文本系統;黑板系統。

2 資料流風格 

    資料流風格的軟體架構是一種最常見,結構最為簡單的軟體架構。這樣的架構下,所有的資料按照流的形式在執行過程中前進,不存在結構的反覆和重構,就像工廠中的汽車流水線一樣,資料就像汽車零部件一樣在流水線的各個節點上被加工,最終輸出所需要的結果(一部完整的汽車)。在流動過程中,資料經過序列間的資料處理元件進行處理,然後將處理結果向後傳送,最後進行輸出。

    資料流風格架構主要包括兩種具體的架構風格:批處理序列和管道-過濾器。

    1. 批處理序列

    批處理風格的每一步處理都是獨立的,並且每一步是順序執行的。只有當前一步處理完,後一步處理才能開始。資料傳送在步與步之間作為一個整體。(元件為一系列固定順序的計算單元,元件間只通過資料傳遞互動。每個處理步驟是一個獨立的程式,每一步必

須在前一步結束後才能開始,資料必須是完整的,以整體的方式傳遞)批處理的典型應用:

    (1)經典資料處理;

    (2)程式開發;

    (3)Windows 下的 BAT 程式就是這種應用的典型例項。 

    2. 管道和過濾器

    在管道/過濾器風格的軟體架構中,每個構件都有一組輸入和輸出,構件讀輸入的資料流,經過內部處理,然後產生輸出資料流。這個過程通常通過對輸入流的變換及增量計算來完成,所以在輸入被完全消費之前,輸出便產生了。因此,這裡的構件被稱為過濾器,這種風格的連線件就像是資料流傳輸的管道,將一個過濾器的輸出傳到另一過濾器的輸入。此風格特別重要的過濾器必須是獨立的實體,它不能與其他的過濾器共享資料,而且一個過濾器不知道它上游和下游的標識。一個管道/過濾器網路輸出的正確性並不依賴於過濾器進行增量計算過程的順序。

   圖 9-5 是管道/過濾器風格的示意圖。一個典型的管道/過濾器架構的例子是以 UNIX shell 編寫的程式。UNIX 既提供一種符號,以連線各組成部分(UNIX 的程序),又提供某種程序執行時機制以實現管道。另一個著名的例子是傳統的編譯器。傳統的編譯器一直被認為是一種管道系統,在該系統中,一個階段(包括詞法分析、語法分析、語義分析和程式碼生成)的輸出是另一個階段的輸入。

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

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

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

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

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

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

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

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

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

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

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

    3. 批處理序列風格與管道過濾器風格對比

    把批處理序列風格與管道過濾器風格比較:

    共同點:把任務分成一系列固定順序的計算單元(元件)。元件間只通過資料傳遞互動。

    區別:批處理是全部的、高潛伏性的,輸入時可隨機存取,無合作性、無互動性。而管道過濾器是遞增的,資料結果延遲小,輸入時處理區域性化,有反饋、可互動。批處理強調資料傳送在步與步之間作為一個整體,而管理過濾器無此要求。

3 呼叫/返回風格

    呼叫返回風格顧名思義,就是指在系統中採用了呼叫與返回機制。利用呼叫-返回實際上是一種分而治之的策略,其主要思想是將一個複雜的大系統分解為一些子系統,以便降低複雜度,並且增加可修改性。程式從其執行起點開始執行該構件的程式碼,程式執行結束,將控制返回給程式呼叫構件。

    呼叫/返回風格架構主要包括三種具體的架構風格:主程式/子程式;面向物件風格;層次結構。

    1. 主程式/子程式

    主程式/子程式風格是結構化開發時期的經典架構風格。這種風格一般採用單執行緒控制,把問題劃分為若干處理步驟,構件即為主程式和子程式。子程式通常可合成為模組。過程呼叫作為互動機制,即充當連線件。呼叫關係具有層次性,其語義邏輯表現為子程式的正確性,取決於它呼叫的子程式的正確性。

    2. 面向物件風格

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

    圖 9-6 是資料抽象和麵向物件風格的示意圖。

    這種風格的兩個重要特徵為:

    (1)物件負責維護其表示的完整性;

    (2)物件的表示對其他物件而言是隱蔽的。因為一個物件對它的客戶隱藏了自己的表示,所以這些物件可以不影響它的客戶就能改變其實現方法。

    面向物件的系統有許多優點,並早已為人所知:

    (1)因為物件對其他物件隱藏它的表示,所以可以改變一個物件的表示,而不影響其他的物件;

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

    但是,面向物件的系統也存在著某些問題:

    (1)為了使一個物件和另一個物件通過過程呼叫等進行互動,必須知道物件的標識。只要一個物件的標識改變了,就必須修改所有其他明確呼叫它的物件;

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

    2.  層次結構風格

    層次系統組織成一個層次結構,每一層為上層服務,並作為下層客戶。在一些層次系統中,除了一些精心挑選的輸出函式外,內部的層只對相鄰的層可見。這樣的系統中構件在一些層實現了虛擬機器(在另一些層次系統中層是部分不透明的)。連線件通過決定層間如何互動的協議來定義,拓撲約束包括對相鄰層間互動的約束。

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

    圖 9-7 是層次系統風格的示意圖。層次系統最廣泛的應用是分層通訊協議。在這一應用領域中,每一層提供一個抽象的功能,作為上層通訊的基礎。較低的層次定義低層的互動,最低層通常只定義硬體物理連線。

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

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

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

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

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

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

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

4 獨立構件風格

    獨立構件風格主要強調系統中的每個構件都是相對獨立的個體,它們之間不直接通訊,以降低耦合度,提升靈活性。獨立構件風格主要包括:程序通訊和事件系統子風格。 

    1. 程序通訊架構風格程序通訊架構風格:構件是獨立的過程,連線件是訊息傳遞。這種風格的特點是構件通常是命名過程,訊息傳遞的方式可以是點到點、非同步和同步方式及遠過程呼叫等。

    2. 事件系統風格基於事件的隱式呼叫風格的思想是構件不直接呼叫一個過程,而是觸發或廣播一個或多個事件。系統中的其他構件中的過程在一個或多個事件中註冊,當一個事件被觸發,系統自動呼叫在這個事件中註冊的所有過程,這樣,一個事件的觸發就導致了另一模組中的過程的呼叫。

    從架構上說,這種風格的構件是一些模組,這些模組既可以是一些過程,又可以是一些事件的集合。過程可以用通用的方式呼叫,也可以在系統事件中註冊一些過程,當發生這些事件時,過程被呼叫。

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

    支援基於事件的隱式呼叫的應用系統很多。例如,在程式設計環境中用於整合各種工具,在資料庫管理系統中確保資料的一致性約束,在使用者介面系統中管理資料,以及在編輯器中支援語法檢查。例如在某系統中,編輯器和變數監視器可以登記相應 Debugger 的斷點事件。當 Debugger 在斷點處停下時,它宣告該事件,由系統自動呼叫處理程式,如編輯程式可以卷屏到斷點,變數監視器重新整理變數數值。而 Debugger 本身只宣告事件,並不關心哪些過程會啟動,也不關心這些過程做什麼處理。

    隱式呼叫系統的主要優點有:

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

    (2)為改進系統帶來了方便。當用一個構件代替另一個構件時,不會影響到其他構件的介面。

    隱式呼叫系統的主要缺點有:

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

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

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

5 虛擬機器風格

    虛擬機器風格的基本思想是人為構建一個執行環境,在這個環境之上,可以解析與執行自定義的一些語言,這樣來增加架構的靈活性,虛擬機器風格主要包括直譯器和規則為中心兩種架構風格。

    1.直譯器

    一個直譯器通常包括完成解釋工作的解釋引擎,一個包含將被解釋的程式碼的儲存區,一個記錄解釋引擎當前工作狀態的資料結構,以及一個記錄原始碼被解釋執行進度的資料結構。

    具有直譯器風格的軟體中含有一個虛擬機器,可以模擬硬體的執行過程和一些關鍵應用。直譯器通常被用來建立一種虛擬機器以彌合程式語義與硬體語義之間的差異。其缺點是執行效率較低。典型的例子是專家系統。

    2. 規則為中心

    基於規則的系統包括規則集、規則直譯器、規則/資料選擇器及工作記憶體。

6 倉庫風格 

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

   倉庫風格包括的子風格有:資料庫系統、超文本系統、黑板風格。

    資料庫架構是庫風格最常見的形式。構件主要有兩大類,一個是中央共享資料來源,儲存當前系統的資料狀態;另一個是多個獨立處理元素,處理元素對資料元素進行操作。而超文本系統的典型代表,就是早期的靜態網頁。三種架構子風格中,最複雜的是黑板系統。

    黑板系統是在抽象與總結語言理解系統 HEARSAY-11 的基礎上產生的,適合於解決複雜的非結構化的問題,能在求解過程中綜合運用多種不同知識源,使得問題的表達、組織和求解變得比較容易。黑板系統是一種問題求解模型,是組織推理步驟、控制狀態資料和問題求解之領域知識的概念框架。它將問題的解空間組織成一個或多個應用相關的分級結構。分級結構的每一層資訊由一個唯一的詞彙來描述,它代表了問題的部分解。領域相關的知識被分成獨立的知識模組,它將某一層次中的資訊轉換成同層或相鄰層的資訊。各種應用通過不同知識表達方法、推理框架和控制機制的組合來實現。影響黑板系統設計的最大因素是應用問題本身的特性,但是支撐應用程式的黑板體系結構有許多相似的特徵和構件。

    對於特定應用問題,黑板系統可通過選取各種黑板、知識源和控制模組的構件來設計;也可以利用預先定製的黑板體系結構的程式設計環境。圖 9-8 是黑板系統的組成。黑板系統的傳統應用是訊號處理領域,如語音和模式識別。另一應用是鬆耦合代理資料共享存取。

    我們從圖 9-8 中可以看出,黑板系統主要由三部分組成:

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

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

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