摘要: 本文簡述了軟件體系結(jié)構(gòu)的定義,探討了Mary shaw和Daviad Garlan所提出的五種風格,即數(shù)據(jù)流風格、調(diào)用/返同風格、獨立組件風格、獨立組件風格、虛擬機風格、倉庫風格軟件體系結(jié)構(gòu)。
關(guān)鍵詞: 軟件體系結(jié)構(gòu)定義風格類型
一、什么是軟件體系結(jié)構(gòu)
在所有對于軟件體系結(jié)構(gòu)的定義中,我認為最有代表性的就是Hayes Roth所提出的:“認為軟件體系結(jié)構(gòu)是一個抽象的系統(tǒng)規(guī)范,主要包括用其行為來描述的功能構(gòu)件和構(gòu)件之間的相互連接、接口和關(guān)系?!边@樣的定義,我認為從根本上描述了軟件體系結(jié)構(gòu)所要做的事情,是一個很概括的規(guī)范化公式。與此同時,在定義各式各樣的“構(gòu)件”的時候,人們似乎一直在默認Dewayne Perry和A1ex Wo1f的定義,也就是:“軟件體系結(jié)構(gòu)是具有一定形式的結(jié)構(gòu)化元素,即構(gòu)件的集合,包括處理構(gòu)件、數(shù)據(jù)構(gòu)件和連接構(gòu)件。處理構(gòu)件負責對數(shù)據(jù)進行加工,數(shù)據(jù)構(gòu)件是被加工的信息,連接構(gòu)件把體系結(jié)構(gòu)的不同部分組組合連接起來?!边@一定義將處理構(gòu)件、數(shù)據(jù)構(gòu)件和連接構(gòu)件區(qū)分了開來,明確了這三者在軟件體系結(jié)構(gòu)中的組件性質(zhì),將這三者視為軟件體系結(jié)構(gòu)的標準組成及探討對象。
在此基礎(chǔ)上,反復(fù)提到的則是Mary Shaw和David Garlan所提出的:“軟件體系結(jié)構(gòu)是軟件設(shè)計過程中的一個層次,這一層次超越計算過程中的算法設(shè)計和數(shù)據(jù)結(jié)構(gòu)設(shè)計。體系結(jié)構(gòu)問題包括總體組織和全局控制、通訊協(xié)議、同步、數(shù)據(jù)存取,給設(shè)計元素分配特定功能,設(shè)計元素的組織,規(guī)模和性能,在各設(shè)計方案間進行選擇等。軟件體系結(jié)構(gòu)處理算法與數(shù)據(jù)結(jié)構(gòu)之上關(guān)于整體系統(tǒng)結(jié)構(gòu)設(shè)計和描述方面的一些問題,如全局組織和全局控制結(jié)構(gòu)、關(guān)于通訊、同步與數(shù)據(jù)存取的協(xié)議,設(shè)計構(gòu)件功能定義,物理分布與合成,設(shè)計方案的選擇、評估與實現(xiàn)等?!边@樣的定義,我認為進一步地提出了軟件體系結(jié)構(gòu)的地位和所研究內(nèi)容的具體情況,它提出了一個對于“控制”和“協(xié)議”的具體化要求,在以上定義的基礎(chǔ)上強調(diào)了軟件體系結(jié)構(gòu)對于構(gòu)架的調(diào)配和規(guī)劃功能,細分了軟件體系結(jié)構(gòu)的內(nèi)容。
除去Kruchten對于軟件體系結(jié)構(gòu)“四個角度”,即概念角度、模塊角度、運行角度、代碼角度的定義,以及Barry Boehm和他的學生提出的關(guān)于強調(diào)“互聯(lián)及約束的集合”的概念之外,還有其他的定義方式。如Bass,Ctements和Kazman在1997年的《使用軟件體系結(jié)構(gòu)》書中提出的:“關(guān)于一個程序或計算機系統(tǒng)的軟件體系結(jié)構(gòu)包括一個或一組軟件構(gòu)件、軟件構(gòu)件的外部的可見特性及其相互關(guān)系?!逼鋸娬{(diào)了“軟件外部的可見特性”,是指軟件構(gòu)件提供的服務(wù)、性能、特性、錯誤處理、共享資源使用等。這一定義的特點在于把軟件體系結(jié)構(gòu)提升,或者也可以說是限制在了軟件的“表征特性”上,這使得軟件體系結(jié)構(gòu)有了更緊縮、健康的概念。
我在思考對于軟件體系結(jié)構(gòu)的定義的時候,并沒有一個標準的答案,因為我在拜讀其他名家的定義的時候發(fā)現(xiàn),它們有著很多相似之處,也各自有著突出的特點與不足,這使得我無論是出于尊敬還是出于對自己認識層次的保留,都不愿意給出一個自己所謂的“定義”,但是可以說的是,所謂軟件體系結(jié)構(gòu),是一種思想方式,也是一種分析方式和控制方式,這種方式的對象,是軟件(廣義)的——主要是創(chuàng)建過程中的—結(jié)構(gòu)和統(tǒng)一規(guī)范的建議,其表現(xiàn)形式是構(gòu)件化的描述體系。這樣的一種理解方式,也就是我上面所提及的在前輩們定義的軟件體系結(jié)構(gòu)中的三個要素:(1)構(gòu)件性——軟件體系結(jié)構(gòu)由三個構(gòu)件組成:處理構(gòu)件、數(shù)據(jù)構(gòu)件和連接構(gòu)件;(2)控制性——軟件體系結(jié)構(gòu)的作用是在“控制”和“協(xié)議”層次上;(3)表征性——軟件體系結(jié)構(gòu)的對象,是“軟件外部的可見特性”。
二、常見軟件體系結(jié)構(gòu)風格
所謂軟件體系結(jié)構(gòu)風格是指:“描述某一特定應(yīng)用領(lǐng)域中系統(tǒng)組織方式的慣用模式?!彼从沉祟I(lǐng)域中眾多系統(tǒng)所共有的結(jié)構(gòu)和語義特性,并指導(dǎo)如何將各個模塊和子系統(tǒng)有效地組65eeb92b2f48f684fae477c3a96da689織成一個完整的系統(tǒng)。按這種方式理解,軟件體系結(jié)構(gòu)風格是指:“定義了用于描述系統(tǒng)的術(shù)語表和一組指導(dǎo)構(gòu)件系統(tǒng)的規(guī)則。”對軟件體系結(jié)構(gòu)風格的研究和實踐促進了對設(shè)計的復(fù)用,一些經(jīng)過實踐證實的解決方案也可以可靠地用于解決新的問題。體系結(jié)構(gòu)風格的不變部分使不同的系統(tǒng)可以共享同一個實現(xiàn)代碼。只要系統(tǒng)是采用常用的、規(guī)范的方法來組織,就可使別的設(shè)計者很容易地理解系統(tǒng)的體系結(jié)構(gòu)。
軟件體系結(jié)構(gòu)風格有很多種,現(xiàn)在我主要分析的是Mary Shaw和David Garlan所提出的五種主要風格類型,也就是:(1)數(shù)據(jù)流風格,包括批處理序列,管道/過濾器形式等;(2)調(diào)用/返回風格,包括主程序/子程序,面向?qū)ο箫L格,分層結(jié)構(gòu)等;(3)獨立組件風格,包括進程通訊,事件系統(tǒng)等;(4)虛擬機風格,包括解釋器,基于規(guī)則的系統(tǒng)等;(5)倉庫風格,包括中心數(shù)據(jù)庫系統(tǒng),黑板系統(tǒng)等。
這五種風格各有各的特點,也有共同之處,下面我將逐一分析這些風格。
1.數(shù)據(jù)流風格
這是一種最常見、結(jié)構(gòu)最為簡單的軟件體系結(jié)構(gòu)。在這樣的結(jié)構(gòu)體系下,所有的數(shù)據(jù)按照流的形式在執(zhí)行過程中前進,不存在結(jié)構(gòu)的反復(fù)和重構(gòu)。在流動過程中,數(shù)據(jù)經(jīng)過序列間的數(shù)據(jù)處理組件進行處理,然后將處理結(jié)果向后傳送,最后進行輸出,這也就是說,最簡單和直接的數(shù)據(jù)流風格是單向的,沒有返回的流水線系統(tǒng)。但是在實際應(yīng)用中,并不一定限制數(shù)據(jù)處理組件的順序,其運算的先后順序不影響最終系統(tǒng)結(jié)構(gòu)的正確性。這種風格很容易用管道/過濾器的形式(見下圖)來解釋。
上圖所表示的就是一個管道/過濾器的形式,我在隨處可見的理論圖的原型基礎(chǔ)上只保留了其中必要的過濾器塊,而用三種不同形式的數(shù)據(jù)流表示了數(shù)據(jù)的行進過程,這三種情況分別是單向流水、非順序流水和回流。其中:
表示了一種正向的流水方式,也就是最常見的、最直觀的數(shù)據(jù)流方式,在這種方式中,正向數(shù)據(jù)管道引導(dǎo)數(shù)據(jù)的正向流動,在此時,我們可以將整個的上方三個過濾器所組成的正向通道作為一個完整的“管道”,這是一種廣義的管道。此時,數(shù)據(jù)從左方,也就是管道的入口處進入,再經(jīng)過過濾器的處理,最終由“管道”的結(jié)尾處流出。
表示了一種打亂(更改)了順序的管道方式,交換了其中兩個過濾器的順序,這樣的結(jié)構(gòu)在實際中是允許的,并且不影響管道/過濾器輸出的正確性。其前提條件是,每個過濾器必須是獨立的實體,它不能與其他的過濾器共享數(shù)據(jù),而且一個過濾器不知道它上游和下游的標志。同樣,也可以把這樣的結(jié)構(gòu)視為廣義的“管道”。
表示了一種回流方式,即某些數(shù)據(jù)可能經(jīng)由一些管道回流,以通過過濾器的結(jié)果數(shù)據(jù)形式,重新通過過濾器,這種情況下的回流發(fā)生在上述廣義“管道”內(nèi)部,而不是像上述兩種情況。在上述兩種情況之中,也可以存在這種回流方式,只不過回流的情況是返回源頭,重新參加數(shù)據(jù)的流動過程,略有不同。
此種風格的優(yōu)點:(1)使得軟構(gòu)件具有良好的隱蔽性和高內(nèi)聚、低耦合的特點;(2)允許設(shè)計者將整個系統(tǒng)的輸入/輸出行為看成是多個過濾器的行為的簡單合成;(3)支持軟件重用。主要提供適合在兩個過濾器之間傳送的數(shù)據(jù),任何兩個過濾器都可被連接起來;(4)系統(tǒng)維護和增強系統(tǒng)性能簡單。新的過濾器可以添加到現(xiàn)有系統(tǒng)中來,舊的可以被改進的過濾器替換掉;(5)允許對一些如吞吐量、死鎖等屬性的分析;(6)支持并行執(zhí)行。每個過濾器是作為一個單獨的任務(wù)完成,因此可與其他任務(wù)并行執(zhí)行。
此種風格的缺點:(1)通常導(dǎo)致進程成為批處理的結(jié)構(gòu)。這是因為雖然過濾器可增量式地處理數(shù)據(jù),但它們是獨立的,所以設(shè)計者必須將每個過濾器看成一個完整的從輸入到輸出的轉(zhuǎn)換;(2)不適合處理交互的應(yīng)用。當需要增量地顯示改變時,這個問題尤為嚴重;(3)因為在數(shù)據(jù)傳輸上沒有通用的標準,每個過濾器都增加了解析和合成數(shù)據(jù)的工作,這樣就導(dǎo)致了系統(tǒng)性能下降,并增強了編寫過濾器的復(fù)雜性。
總之,此種風格最大的特點在于簡單獨立,這就使其具備簡便易用的優(yōu)勢及不夠豐富靈活的劣勢,是一種很基礎(chǔ)的風格。
2.調(diào)用/返回風格
這是一種相對更為常用的風格,在這種風格之中,程序之間不再像“過濾器”那樣“必須是獨立的實體”,而是有了更為豐富的相互聯(lián)系,此種情況分很多種,具體到實際應(yīng)用中的類型,比如子程序調(diào)用,面向?qū)ο蠼Y(jié)構(gòu)化設(shè)計,以及分層式系統(tǒng)結(jié)構(gòu)等。這些風格有一個共同的特點,也就是存在一個類似與軟件體系結(jié)構(gòu)之對于軟件開發(fā)的關(guān)系的一種迭代關(guān)系,即我理解的這種風格,實際上是一種在軟件體系結(jié)構(gòu)中套用軟件體系結(jié)構(gòu)的過程。
比如對于主/子程序的調(diào)用,在一定環(huán)境中,子程序是一段段獨立存在的,負責承擔相應(yīng)功能模塊功能的個體,而事實上,主程序并不能(指廣泛意義上講)實現(xiàn)其所需要的功能,或者需要重復(fù)冗余代碼來實現(xiàn),在此時,采用子程序的調(diào)用會給這種情況帶來比較好的解決方法,對于一個程序來說,特別是當該程序是由相對獨立的功能模塊組成的時候,特別是在這種功能模塊的調(diào)用成為一種長期的、多次的情況的時候,采用將模塊設(shè)計成子程序由主程序視情況而進行調(diào)用,是一種很好的解決辦法。
在面向?qū)ο蟮脑O(shè)計中更是如此,最明顯的例子就是抽象數(shù)據(jù)類型的提出,對于抽象數(shù)據(jù)類型(A.D.T.)這種描述方式來說,更可以將此種方式作為一種對于軟件體系結(jié)構(gòu)的深層套用。而在分層系統(tǒng)中,按照功能模塊所處的功能層次進行分解,并由高級調(diào)用低級,最終形成金字塔形的整體結(jié)構(gòu),這樣的環(huán)境其實在現(xiàn)實的程序環(huán)境中是很常見的。對比我們現(xiàn)存的語言環(huán)境的分層結(jié)構(gòu),即高級語言對低級語言的透明調(diào)用,也就是這種情況的廣義示例,只不過在現(xiàn)實的應(yīng)用中,我們更多的是在統(tǒng)計的語言環(huán)境中,對于所需開發(fā)的軟件進行功能應(yīng)用上的分層,而不再注重語言環(huán)境上的層次關(guān)系(如下圖所示)。
以上說明的是主/子程序的調(diào)用過程,也是最為廣泛應(yīng)用的設(shè)計模型。數(shù)據(jù)抽象和面向?qū)ο蟮娘L格特點:抽象數(shù)據(jù)類型概念對軟件系統(tǒng)有著重要作用,目前軟件界已普遍轉(zhuǎn)向使用面向?qū)ο笙到y(tǒng)。這種風格建立在數(shù)據(jù)抽象和面向?qū)ο蟮幕A(chǔ)上,“數(shù)據(jù)的表示方法和它們的相應(yīng)操作封裝在一個抽象數(shù)據(jù)類型或?qū)ο笾小?。這種風格的構(gòu)件是對象,或者說是抽象數(shù)據(jù)類型的實例。對象是一種被稱作管理者的構(gòu)件,因為它負責保持資源的完整性。對象是通過函數(shù)和過程的調(diào)用來交互的。
此種風格的優(yōu)點:(1)其可以改變一個對象的表示,而不影響其他的對象,因為該對象對其他對象隱藏其表示,這可以使該對象更獨立,對象的更新更安全;(2)設(shè)計者可將一些數(shù)據(jù)存取操作的問題分解成一些交互的代理程序的集合,而不必一切都堆放在一起,提高了進程效率。
此種風格的缺點:(1)為了使一個對象和另一個對象通過過程調(diào)用等進行交互,必須知道對象的標識。只要一個對象的標識改變了,就必須修改所有其他明確調(diào)用它的對象,造成了結(jié)構(gòu)修改的復(fù)雜;(2)“必須修改所有顯式調(diào)用它的其他對象,并消除由此帶來的一些副作用”也就是說,同時調(diào)用一個對象的兩者,并不能保證他們對這個對象的操作會不會帶來同步上的問題及相互的影響。
3.獨立組件風格
獨立組件的風格很常用常見,在互聯(lián)網(wǎng)上廣為流傳的集群計算就是這樣的風格,但是不管什么樣的表現(xiàn)形式,都有統(tǒng)一的特點,也就是組件的獨立性和獨立組件間的協(xié)同性。在這種風格中,最簡單常見,卻容易被人忽視的就是基于事件的隱式調(diào)用,下面進行具體分析。
“基于事件的隱式調(diào)用風格的思想是構(gòu)件不直接調(diào)用一個過程,而是觸發(fā)或廣播一個或多個事件”。系統(tǒng)中的其他構(gòu)件中的過程在一個或多個事件中注冊,當一個事件被觸發(fā),系統(tǒng)自動調(diào)用在這個事件中注冊的所有過程,這樣一個事件的觸發(fā)就導(dǎo)致了另一模塊中的過程的調(diào)用。從體系結(jié)構(gòu)上說,這種風格的構(gòu)件是一些模塊,這些模塊既可以是一些過程,又可以是一些事件的集合?!斑^程可以用通用的方式調(diào)用,也可以在系統(tǒng)事件中注冊一些過程,當發(fā)生這些事件時,過程被調(diào)用”。基于事件的隱式調(diào)用風格的主要特點是事件的觸發(fā)者并不知道哪些構(gòu)件會被這些事件影響。這樣不能假定構(gòu)件的處理順序,甚至不知道哪些過程會被調(diào)用,因此,許多隱式調(diào)用的系統(tǒng)包含顯式調(diào)用作為構(gòu)件交互的補充形式。支持基于事件的隱式調(diào)用的應(yīng)用系統(tǒng)很多,“例如,在編程環(huán)境中用于集成各種工具,在數(shù)據(jù)庫管理系統(tǒng)中確保數(shù)據(jù)的一致性約束,在用戶界面系統(tǒng)中管理數(shù)據(jù),以及在編輯器中支持語法檢查”。
此種風格的優(yōu)點:(1)為軟件重用提供了強大的支持。當需要將一個構(gòu)件加入現(xiàn)存系統(tǒng)中時,只需將它注冊到系統(tǒng)的事件中;(2)為改進系統(tǒng)帶來了方便。當用一個構(gòu)件代替另一個構(gòu)件時,不會影響到其他構(gòu)件的接口。
此種風格的缺點:(1)構(gòu)件放棄了對系統(tǒng)計算的控制。一個構(gòu)件觸發(fā)一個事件時,不能確定其他構(gòu)件是否會響應(yīng)它。而且即使它知道事件注冊了哪些構(gòu)件的構(gòu)成,也不能保證這些過程被調(diào)用的順序;(2)數(shù)據(jù)交換的問題。有時數(shù)據(jù)可被一個事件傳遞,但在另一些情況下,基于事件的系統(tǒng)必須依靠一個共享的倉庫進行交互。在這些情況下,全局性能和資源管理便成了問題;(3)既然過程的語義必須被觸發(fā)事件的上下文約束,關(guān)于正確性的推理就存在問題。
4.虛擬機風格
虛擬機的風格在討論中并沒有作為重點,是因為它其實更像是一種軟件體系結(jié)構(gòu)中的應(yīng)用層次。層次系統(tǒng)組織成一個層次結(jié)構(gòu),每一層為上層服務(wù),并作為下層客戶。在一些層次系統(tǒng)中,除了一些精心挑選的輸出函數(shù)外,內(nèi)部的層只對相鄰的層可見。在這樣的系統(tǒng)中構(gòu)件在一些層實現(xiàn)了虛擬機(在另一些層次系統(tǒng)中層是部分不透明的)。連接件通過決定層間如何交互的協(xié)議來定義,拓撲約束包括對相鄰層間交互的約束。
這種風格支持基于可增加抽象層的設(shè)計,這樣允許將一個復(fù)雜問題分解成一個增量步驟序列的實現(xiàn)。每一層最多只影響兩層,同時只要給相鄰層提供相同的接口,允許每層用不同的方法實現(xiàn),同樣為軟件重用提供強大的支持。
此種風格的優(yōu)點:(1)支持基于抽象程度遞增的系統(tǒng)設(shè)計,使設(shè)計者可以把一個復(fù)雜系統(tǒng)按遞增的步驟進行分解;(2)支持功能增強,因為每一層至多和相鄰的上下層交互,所以功能的改變最多影響相鄰的上下層;(3)支持重用。只要提供的服務(wù)接口定義不變,同一層的不同實現(xiàn)可以交換使用。這樣就可以定義一組標準的接口,而允許各種不同的實現(xiàn)方法。
此種風格的缺點:(1)并不是每個系統(tǒng)都可以很容易地劃分為分層的模式,甚至即使一個系統(tǒng)的邏輯結(jié)構(gòu)是層次化的,出于對系統(tǒng)性能的考慮,也不得不把一些低級或高級的功能綜合起來;(2)很難找到一個合適的、正確的層次抽象方法。
5.倉庫風格
倉庫風格事實上就是一種基于數(shù)據(jù)庫的體系結(jié)構(gòu),“在倉庫風格中,有兩種不同的構(gòu)件:中央數(shù)據(jù)結(jié)構(gòu)說明當前狀態(tài),獨立構(gòu)件在中央數(shù)據(jù)存儲上執(zhí)行,倉庫與外構(gòu)件間的相互作用在系統(tǒng)中會有大的變化”??刂圃瓌t的選取產(chǎn)生兩個主要的子類。若輸入流中某類時間觸發(fā)進程執(zhí)行的選擇,則倉庫是一傳統(tǒng)型數(shù)據(jù)庫;若中央數(shù)據(jù)結(jié)構(gòu)的當前狀態(tài)觸發(fā)進程執(zhí)行的選擇,則倉庫是一黑板系統(tǒng)。
對于這種結(jié)構(gòu)的討論也不需要太多,因為這種結(jié)構(gòu)太過常用和標準,甚至不用去分析它的優(yōu)缺點,因為就現(xiàn)實的情況來說,還沒有什么系統(tǒng)有可能或者說有希望取代這樣的一種風格,其必然會在相當長的時間段里占據(jù)主導(dǎo)地位。
其組成:(1)知識源。知識源中包含獨立的、與應(yīng)用程序相關(guān)的知識,知識源之間不直接進行通訊,它們之間的交互只通過黑板來完成;(2)黑板數(shù)據(jù)結(jié)構(gòu)。黑板數(shù)據(jù)是按照與應(yīng)用程序相關(guān)的層次來組織的解決問題的數(shù)據(jù),知識源通過不斷地改變黑板數(shù)據(jù)來解決問題;(3)控制??刂仆耆珊诎宓臓顟B(tài)驅(qū)動,黑板狀態(tài)的改變決定使用的特定知識。
至此,軟件體系結(jié)構(gòu)是一門很抽象的學科,值得研究和大膽探求,接下來需要更加深入地學習其他的相關(guān)知識。
參考文獻:
[1]覃征,何堅,謝國彤,王志敏,張麗,王向華.軟件體系結(jié)構(gòu)[M].西安:西安交通大學出版社,2002.12.
[2]Frank Buschmann等著,賁可榮等譯.面向模式的軟件體系結(jié)構(gòu)[M].卷1:模式系統(tǒng).北京:機械工業(yè)出版社,2003.1.
?。?]謝曉芹,梁邦勇.框架不是框框——應(yīng)用框架的基本思想[J].計算機世界報,第04期B6、B7.http:∥www.huihoo.com/patterns/framework/4.html.