《軟件體系結(jié)構(gòu)教程》課件第4章_第1頁(yè)
《軟件體系結(jié)構(gòu)教程》課件第4章_第2頁(yè)
《軟件體系結(jié)構(gòu)教程》課件第4章_第3頁(yè)
《軟件體系結(jié)構(gòu)教程》課件第4章_第4頁(yè)
《軟件體系結(jié)構(gòu)教程》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩339頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第4章軟件體系結(jié)構(gòu)描述4.1軟件體系結(jié)構(gòu)描述方法4.2軟件體系結(jié)構(gòu)描述語(yǔ)言4.3典型的軟件體系結(jié)構(gòu)描述語(yǔ)言4.4可擴(kuò)展標(biāo)記語(yǔ)言4.5基于XML的軟件體系結(jié)構(gòu)描述語(yǔ)言4.6使用“4+1”模型描述軟件體系結(jié)構(gòu)4.7使用UML描述軟件體系結(jié)構(gòu)4.8本章小結(jié)習(xí)題

4.1軟件體系結(jié)構(gòu)描述方法

1.圖形表達(dá)工具

對(duì)于軟件體系結(jié)構(gòu)的描述和表達(dá),一種簡(jiǎn)潔易懂且使用廣泛的方法是采用由矩形框和有向線(xiàn)段組合而成的圖形表達(dá)工具。在這種方法中,矩形框代表抽象構(gòu)件,框內(nèi)標(biāo)注的文字為抽象構(gòu)件的名稱(chēng);有向線(xiàn)段代表輔助各構(gòu)件進(jìn)行通信、控制或關(guān)聯(lián)的連接件。圖4-1表示某軟件輔助理解和測(cè)試工具的部分體系結(jié)構(gòu)描述。圖4-1某軟件輔助理解和測(cè)試工具部分體系結(jié)構(gòu)描述目前,這種圖形表達(dá)工具在軟件設(shè)計(jì)中占據(jù)著主導(dǎo)地位。盡管由于在術(shù)語(yǔ)和表達(dá)語(yǔ)義上存在著一些不規(guī)范和不精確,使得以矩形框與線(xiàn)段為基礎(chǔ)的傳統(tǒng)圖形表達(dá)方法在不同系統(tǒng)和不同文檔之間有著許多不一致甚至矛盾,但該方法仍然以其簡(jiǎn)潔易用的特點(diǎn)在實(shí)際的設(shè)計(jì)和開(kāi)發(fā)工作中被廣泛使用。

為了克服圖形表達(dá)方法中所缺乏的語(yǔ)義特征,有關(guān)研究人員試圖通過(guò)增加含有語(yǔ)義的圖元素的方式來(lái)開(kāi)發(fā)圖文法理論。

2.模塊內(nèi)連接語(yǔ)言

軟件體系結(jié)構(gòu)的第二種描述和表達(dá)方式是采用將一種或幾種傳統(tǒng)程序設(shè)計(jì)語(yǔ)言的模塊連接起來(lái)的模塊內(nèi)連接語(yǔ)言(MeduleInterconnectionLanguage,MIL)。由于程序設(shè)計(jì)語(yǔ)言和模塊內(nèi)連接語(yǔ)言具有嚴(yán)格的語(yǔ)義基礎(chǔ),因此能支持對(duì)較大的軟件單元進(jìn)行描述。例如,Ada語(yǔ)言采用use實(shí)現(xiàn)包的重用,Pascal語(yǔ)言采用過(guò)程(函數(shù))實(shí)現(xiàn)模塊的交互。

MIL方式對(duì)模塊化的程序設(shè)計(jì)和分段編譯等技術(shù)發(fā)揮了很大的作用。然而,由于這些語(yǔ)言處理和描述的軟件設(shè)計(jì)開(kāi)發(fā)層次過(guò)于依賴(lài)程序設(shè)計(jì)語(yǔ)言,因此,限制了它們處理和描述比程序設(shè)計(jì)語(yǔ)言元素更為抽象的高層次軟件體系結(jié)構(gòu)元素的能力。

3.基于軟構(gòu)件的系統(tǒng)描述語(yǔ)言

軟件體系結(jié)構(gòu)的第三種描述和表達(dá)方式是采用基于軟構(gòu)件的系統(tǒng)描述語(yǔ)言?;谲洏?gòu)件的系統(tǒng)描述語(yǔ)言將軟件系統(tǒng)描述成一種由許多以特定形式相互作用的特殊軟件實(shí)體組成的系統(tǒng)。

例如,Darwin最初用作設(shè)計(jì)和構(gòu)造復(fù)雜分布式系統(tǒng)的配置說(shuō)明語(yǔ)言,因具有動(dòng)態(tài)特性,也可用來(lái)描述動(dòng)態(tài)體系結(jié)構(gòu)。這種描述方式雖然也是一種以構(gòu)件為單位的軟件系統(tǒng)描述方法,但是它們所面向和針對(duì)的系統(tǒng)元素仍然是一些層次較低的以程序設(shè)計(jì)為基礎(chǔ)的通信協(xié)作軟件實(shí)體單元,而且這些語(yǔ)言所描述和表達(dá)的系統(tǒng)一般而言都是面向特定應(yīng)用的特殊系統(tǒng),這些特性使得基于軟構(gòu)件的系統(tǒng)描述仍然不是十分適合軟件體系結(jié)構(gòu)的描述和表達(dá)。

4.軟件體系結(jié)構(gòu)描述語(yǔ)言

軟件體系結(jié)構(gòu)描述語(yǔ)言(ArchitectureDescriptionLanguage,ADL)是參照傳統(tǒng)程序設(shè)計(jì)語(yǔ)言的設(shè)計(jì)和開(kāi)發(fā)經(jīng)驗(yàn),針對(duì)軟件體系結(jié)構(gòu)特點(diǎn),重新設(shè)計(jì)、開(kāi)發(fā)的描述方式。由于A(yíng)DL是在吸收了傳統(tǒng)程序設(shè)計(jì)中的語(yǔ)義嚴(yán)格精確的特點(diǎn)基礎(chǔ)上,針對(duì)軟件體系結(jié)構(gòu)的整體性和抽象性特點(diǎn),定義和確定適合于軟件體系結(jié)構(gòu)表達(dá)與描述的有關(guān)抽象元素,因此,ADL是當(dāng)前軟件開(kāi)發(fā)和設(shè)計(jì)方法學(xué)中一種發(fā)展很快的軟件體系結(jié)構(gòu)描述方法。目前,已經(jīng)有幾十種常見(jiàn)的ADL。

5.軟件體系結(jié)構(gòu)描述框架標(biāo)準(zhǔn)

鑒于體系結(jié)構(gòu)描述的概念與實(shí)踐的不統(tǒng)一,IEEE于1995年8月成立了體系結(jié)構(gòu)工作組,綜合體系結(jié)構(gòu)描述研究成果,并參考業(yè)界的體系結(jié)構(gòu)描述的實(shí)踐,負(fù)責(zé)起草了體系結(jié)構(gòu)描述框架標(biāo)準(zhǔn),即IEEEP1471,并于2000年9月21日通過(guò)IEEE-SA標(biāo)準(zhǔn)委員會(huì)評(píng)審。

IEEEP1471適用于軟件密集的系統(tǒng),其目標(biāo)在于:便于體系結(jié)構(gòu)的表達(dá)與交流,并通過(guò)體系結(jié)構(gòu)要素及其實(shí)踐標(biāo)準(zhǔn)化,奠定質(zhì)量與成本的基礎(chǔ)。

IEEEP1471僅僅提供了體系結(jié)構(gòu)描述的概念框架、體系結(jié)構(gòu)描述應(yīng)該遵循的規(guī)范,并給出建立框架的思路,但在如何描述以及具體的描述技術(shù)等方面缺乏更進(jìn)一步的指導(dǎo)。

在IEEEP1471推薦的體系結(jié)構(gòu)描述的概念框架基礎(chǔ)上,Rational公司起草了可重用的軟件資產(chǎn)規(guī)格說(shuō)明,專(zhuān)門(mén)討論了體系結(jié)構(gòu)描述的規(guī)格說(shuō)明,提出了一套易于重用的體系結(jié)構(gòu)描述規(guī)范??芍赜玫捏w系結(jié)構(gòu)描述框架建議基于RUP(RationalUnifiedProcess)、采用UML模型描述軟件體系結(jié)構(gòu),認(rèn)為體系結(jié)構(gòu)描述的關(guān)鍵是定義視點(diǎn)、視圖以及建模元素之間的映射關(guān)系??梢詮乃膫€(gè)視點(diǎn)出發(fā)描述體系結(jié)構(gòu),這四個(gè)視點(diǎn)分別是需求視點(diǎn)、設(shè)計(jì)視點(diǎn)、實(shí)現(xiàn)視點(diǎn)和測(cè)試視點(diǎn)。并在此基礎(chǔ)上提出了7個(gè)體系結(jié)構(gòu)視圖,分別是用例視圖、域視圖、非功能需求視圖、邏輯視圖、實(shí)現(xiàn)視圖、過(guò)程視圖和部署視圖。然后,從系統(tǒng)建模的角度考慮多個(gè)視圖之間的映射關(guān)系,并建議了這些視圖的表示和視圖之間的映射關(guān)系的表示。與IEEEP1471相比,Rational公司的描述方案涉及面比較窄,所注重的層次比較低,因而更具體。由于將體系結(jié)構(gòu)的描述限于UML和RUP,具有一定的局限性,但該建議標(biāo)準(zhǔn)結(jié)合了業(yè)界已經(jīng)廣泛采用的建模語(yǔ)言和開(kāi)發(fā)過(guò)程,因而易于推廣,可以有效實(shí)現(xiàn)在跨組織之間重用體系結(jié)構(gòu)描述結(jié)果。

4.2軟件體系結(jié)構(gòu)描述語(yǔ)言

4.2.1軟件體系結(jié)構(gòu)描述語(yǔ)言構(gòu)成要素

軟件體系結(jié)構(gòu)描述語(yǔ)言是一種形式化語(yǔ)言,它在底層語(yǔ)義模型的支持下,為軟件系統(tǒng)的概念體系結(jié)構(gòu)建模提供具體語(yǔ)法和概念框架?;诘讓诱Z(yǔ)義的工具為體系結(jié)構(gòu)的表示、分析、演化、細(xì)化、設(shè)計(jì)過(guò)程等提供支持。其三個(gè)基本元素如下:

(1)構(gòu)件:計(jì)算或數(shù)據(jù)存儲(chǔ)單元。

(2)連接件:用于構(gòu)件之間交互建模的體系結(jié)構(gòu)構(gòu)造塊及其支配這些交互的規(guī)則。

(3)體系結(jié)構(gòu)配置:描述體系結(jié)構(gòu)的構(gòu)件與連接件的連接圖。

下面對(duì)它的三個(gè)基本構(gòu)成元素進(jìn)行介紹。

1.構(gòu)件

構(gòu)件是一個(gè)計(jì)算單元或數(shù)據(jù)存儲(chǔ)單元。也就是說(shuō),構(gòu)件是計(jì)算與狀態(tài)存在的場(chǎng)所。在體系結(jié)構(gòu)中,一個(gè)構(gòu)件可能小到只有一個(gè)過(guò)程或大到整個(gè)應(yīng)用程序。它可以要求自己的數(shù)據(jù)與/或執(zhí)行空間,也可以與其他構(gòu)件共享這些空間。作為軟件體系結(jié)構(gòu)構(gòu)造塊的構(gòu)件,其自身也包含了多種屬性,如接口、類(lèi)型、語(yǔ)義、約束、演化和非功能屬性等。

接口是構(gòu)件與外部世界的一組交互點(diǎn)。與面向?qū)ο蠓椒ㄖ械念?lèi)說(shuō)明相同,ADL中的構(gòu)件接口說(shuō)明了構(gòu)件提供的那些服務(wù)(消息、操作、變量)。為了能夠充分地推斷構(gòu)件及包含它的體系結(jié)構(gòu),ADL提供了能夠說(shuō)明構(gòu)件需要的工具。這樣,接口就定義了構(gòu)件能夠提出的計(jì)算委托及其用途上的約束。構(gòu)件作為一個(gè)封裝的實(shí)體,只能通過(guò)其接口與外部環(huán)境交互,構(gòu)件的接口由一組端口組成,每個(gè)端口表示了構(gòu)件和外部環(huán)境的交互點(diǎn)。通過(guò)不同的端口類(lèi)型,一個(gè)構(gòu)件可以提供多重接口。一個(gè)端口可以非常簡(jiǎn)單,如過(guò)程調(diào)用,也可以表示更為復(fù)雜的界面,如必須以某種順序調(diào)用的一組過(guò)程調(diào)用。

構(gòu)件類(lèi)型是實(shí)現(xiàn)構(gòu)件重用的手段。構(gòu)件類(lèi)型保證了構(gòu)件能夠在體系結(jié)構(gòu)描述中多次實(shí)例化,并且每個(gè)實(shí)例都可以對(duì)應(yīng)于構(gòu)件的不同實(shí)現(xiàn)。抽象構(gòu)件類(lèi)型也可以參數(shù)化,進(jìn)一步促進(jìn)重用。現(xiàn)有的ADL都將構(gòu)件類(lèi)型與實(shí)例區(qū)分開(kāi)來(lái)。由于基于體系結(jié)構(gòu)開(kāi)發(fā)的系統(tǒng)大都是大型、長(zhǎng)時(shí)間運(yùn)行的系統(tǒng),因而系統(tǒng)的演化能力顯得格外重要。構(gòu)件的演化能力是系統(tǒng)演化的基礎(chǔ)。ADL是通過(guò)構(gòu)件的子類(lèi)型及其特性的細(xì)化來(lái)支持演化過(guò)程的。目前,只有少數(shù)幾種ADL部分地支持演化,對(duì)演化的支持程度通常依賴(lài)于所選擇的程序設(shè)計(jì)語(yǔ)言。其他ADL將構(gòu)件模型看做是靜態(tài)的。

2.連接件

連接件是用來(lái)建立構(gòu)件間的交互以及支配這些交互規(guī)則的體系結(jié)構(gòu)構(gòu)造模塊。與構(gòu)件不同,連接件可以不與實(shí)現(xiàn)系統(tǒng)中的編譯單元對(duì)應(yīng)。它們可以以兼容消息路由設(shè)備實(shí)現(xiàn)(如C2),也可以以共享變量、表入口、緩沖區(qū)、對(duì)連接件的指令、動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)、內(nèi)嵌在代碼中的過(guò)程調(diào)用序列、初始化參數(shù)、客戶(hù)服務(wù)協(xié)議、管道、數(shù)據(jù)庫(kù)、應(yīng)用程序之間的SQL語(yǔ)句等形式出現(xiàn)。大多數(shù)ADL將連接件作為第一類(lèi)實(shí)體,也有的ADL則不將連接件作為第一類(lèi)實(shí)體。連接件作為建模軟件體系結(jié)構(gòu)的主要實(shí)體,同樣也有接口。連接件的接口由一組角色組成,連接件的每一個(gè)角色定義了該連接件表示的交互參與者,二元連接有兩個(gè)角色,如消息傳遞連接件的角色是發(fā)送者和接收者。有的連接件有多于兩個(gè)的角色,如事件廣播有一個(gè)事件發(fā)布者角色和任意多個(gè)事件接收者角色。

顯然,連接件的接口是一組它與所連接構(gòu)件之間的交互點(diǎn)。為了保證體系結(jié)構(gòu)中的構(gòu)件連接以及它們之間的通信正確,連接件應(yīng)該導(dǎo)出所期待的服務(wù)作為它的接口。它能夠推導(dǎo)出軟件體系結(jié)構(gòu)的形成情況。體系結(jié)構(gòu)配置中要求構(gòu)件端口與連接件角色顯式連接。體系結(jié)構(gòu)級(jí)的通信需要用復(fù)雜協(xié)議來(lái)表達(dá)。為了抽象這些協(xié)議并使之能夠重用,ADL應(yīng)該將連接件構(gòu)造為類(lèi)型。構(gòu)造連接件類(lèi)型可以將那些用通信協(xié)議定義的類(lèi)型系統(tǒng)化,并獨(dú)立于實(shí)現(xiàn),或者作為內(nèi)嵌的、基于它們的實(shí)現(xiàn)機(jī)制的枚舉類(lèi)型。

為完成對(duì)構(gòu)件接口的有用分析,保證跨體系結(jié)構(gòu)抽象層的細(xì)化一致性,強(qiáng)調(diào)互聯(lián)與通信約束等,體系結(jié)構(gòu)描述提供了連接件協(xié)議以及變換語(yǔ)法。為了確保執(zhí)行計(jì)劃的交互協(xié)議,建立其內(nèi)部連接件依賴(lài)關(guān)系,強(qiáng)制用途邊界,就必須說(shuō)明連接件約束。ADL可以通過(guò)強(qiáng)制風(fēng)格不變性來(lái)實(shí)現(xiàn)約束,或通過(guò)接受屬性限制給定角色中的服務(wù)。

3.體系結(jié)構(gòu)配置

體系結(jié)構(gòu)配置或拓?fù)涫敲枋鲶w系結(jié)構(gòu)的構(gòu)件與連接件的連接圖。體系結(jié)構(gòu)配置提供信息來(lái)確定構(gòu)件是否正確連接、接口是否匹配、連接件構(gòu)成的通信是否正確,并說(shuō)明實(shí)現(xiàn)要求行為的組合語(yǔ)義。體系結(jié)構(gòu)適合于描述大規(guī)模的、生命周期長(zhǎng)的系統(tǒng)。利用配置來(lái)支持系統(tǒng)的變化,使不同技術(shù)人員都能理解并熟悉系統(tǒng)。為幫助開(kāi)發(fā)人員在一個(gè)較高的抽象層上理解系統(tǒng),需要對(duì)軟件體系結(jié)構(gòu)進(jìn)行說(shuō)明。為了使開(kāi)發(fā)者與其有關(guān)人員之間的交流容易些,ADL必須以簡(jiǎn)單的、可理解的語(yǔ)法來(lái)配置結(jié)構(gòu)化信息。理想的情況是從配置說(shuō)明中澄清系統(tǒng)結(jié)構(gòu),即不需研究構(gòu)件與連接件就能使構(gòu)建系統(tǒng)的各種參與者理解系統(tǒng)。體系結(jié)構(gòu)配置說(shuō)明除文本形式外,有些ADL還提供了圖形說(shuō)明形式。文本描述與圖形描述可以互換。多視圖、多場(chǎng)景的體系結(jié)構(gòu)說(shuō)明方法在最新的研究中得到了明顯的加強(qiáng)。為了在不同細(xì)節(jié)層次上描述軟件系統(tǒng),ADL將整個(gè)體系結(jié)構(gòu)作為另一個(gè)較大系統(tǒng)的單個(gè)構(gòu)件。也就是說(shuō),體系結(jié)構(gòu)具有復(fù)合或等級(jí)復(fù)合的特性。另一方面,體系結(jié)構(gòu)配置支持采用異構(gòu)構(gòu)件與連接件。這是因?yàn)檠芯寇浖w系結(jié)構(gòu)的目的之一是促進(jìn)大規(guī)模系統(tǒng)的開(kāi)發(fā),即傾向于使用已有的構(gòu)件與不同粒度的連接件,這些構(gòu)件與連接件的設(shè)計(jì)者、形式模型、開(kāi)發(fā)者、編程語(yǔ)言、操作系統(tǒng)、通信協(xié)議可能都不相同。另外一個(gè)事實(shí)是,大型的、長(zhǎng)期運(yùn)行的系統(tǒng)是在不斷增長(zhǎng)的。因而,ADL必須支持可能增長(zhǎng)的系統(tǒng)的說(shuō)明與開(kāi)發(fā)。大多數(shù)ADL提供了復(fù)合特性,所以,任意尺度的配置都可以相對(duì)簡(jiǎn)潔地抽象表示出來(lái)。我們知道,體系結(jié)構(gòu)設(shè)計(jì)是整個(gè)軟件生命周期中關(guān)鍵的一環(huán),一般在需求分析之后、軟件設(shè)計(jì)之前進(jìn)行。而形式化的、規(guī)范化的體系結(jié)構(gòu)描述對(duì)于體系結(jié)構(gòu)的設(shè)計(jì)和理解都是非常重要的。因此,ADL如何能夠承上啟下將是十分重要的問(wèn)題,一方面是體系結(jié)構(gòu)描述如何向其他文檔轉(zhuǎn)移,另一方面是如何利用需求分析成果來(lái)直接生成系統(tǒng)的體系結(jié)構(gòu)說(shuō)明。4.2.2ADL與其他語(yǔ)言的比較

按照MaryShaw和DavidGarlan的觀(guān)點(diǎn),典型的ADL在充分繼承和吸收傳統(tǒng)程序設(shè)計(jì)語(yǔ)言的精確性和嚴(yán)格性特點(diǎn)的同時(shí),還應(yīng)該具有構(gòu)造、抽象、重用、組合、異構(gòu)、分析和推理等各種能力和特性。

(1)構(gòu)造能力指的是ADL能夠使用較小的獨(dú)立體系結(jié)構(gòu)元素來(lái)建造大型軟件系統(tǒng)。

(2)抽象能力指的是ADL使得軟件體系結(jié)構(gòu)中的構(gòu)件和連接件描述可以只關(guān)注它們的抽象特性,而不管其具體的實(shí)現(xiàn)細(xì)節(jié)。

(3)重用能力指的是ADL使得組成軟件系統(tǒng)的構(gòu)件、連接件甚至是軟件體系結(jié)構(gòu)都成為軟件系統(tǒng)開(kāi)發(fā)和設(shè)計(jì)的可重用部件。

(4)組合能力指的是ADL使得其描述的每一系統(tǒng)元素都有其自己的局部結(jié)構(gòu),這種描述局部結(jié)構(gòu)的特點(diǎn)使得ADL支持軟件系統(tǒng)的動(dòng)態(tài)變化組合。

(5)異構(gòu)能力指的是ADL允許多個(gè)不同的體系結(jié)構(gòu)描述關(guān)聯(lián)存在。

(6)分析和推理能力指的是ADL允許對(duì)其描述的體系結(jié)構(gòu)進(jìn)行多種不同的性能和功能上的多種推理分析。根據(jù)這些特點(diǎn),將下面這樣的語(yǔ)言排除在A(yíng)DL之外:高層設(shè)計(jì)符號(hào)語(yǔ)言、MIL、編程語(yǔ)言、面向?qū)ο蟮慕7?hào)、形式化說(shuō)明語(yǔ)言。ADL與需求語(yǔ)言的區(qū)別在于后者描述的是問(wèn)題空間,而前者則扎根于解空間中;ADL與建模語(yǔ)言的區(qū)別在于后者對(duì)整體行為的關(guān)注要大于對(duì)部分的關(guān)注,而ADL集中在構(gòu)件的表示上;ADL與傳統(tǒng)的程序設(shè)計(jì)語(yǔ)言的構(gòu)成元素既有許多相同和相似之處,又各自有著很大的不同。

下面,給出程序設(shè)計(jì)語(yǔ)言和ADL的典型元素的屬性和含義比較以及軟件體系結(jié)構(gòu)中經(jīng)常出現(xiàn)的一些構(gòu)件與連接件元素,見(jiàn)表4-1和表4-2。

4.3典型的軟件體系結(jié)構(gòu)描述語(yǔ)言

目前已經(jīng)有很多體系結(jié)構(gòu)建模ADL,見(jiàn)表4-3。

有些ADL是面向特定領(lǐng)域的體系結(jié)構(gòu)描述語(yǔ)言,有些可以作為通用的軟件體系結(jié)構(gòu)描述語(yǔ)言。主要的體系結(jié)構(gòu)描述語(yǔ)言有Aesop、MetaH、C2、Rapide、SADL、UniCon和Wright等,盡管它們都描述軟件體系結(jié)構(gòu),卻有不同的特點(diǎn):

(1)?Aesop支持體系結(jié)構(gòu)風(fēng)格的應(yīng)用。

(2)?MetaH為設(shè)計(jì)者提供了關(guān)于實(shí)時(shí)電子控制軟件系統(tǒng)的設(shè)計(jì)指導(dǎo)。

(3)?C2支持基于消息傳遞風(fēng)格的用戶(hù)界面系統(tǒng)的描述。

(4)?Rapide支持體系結(jié)構(gòu)設(shè)計(jì)的模擬并提供了分析模擬結(jié)果的工具。

(5)?SADL提供了關(guān)于體系結(jié)構(gòu)加細(xì)的形式化基礎(chǔ)。

(6)?UniCon支持異構(gòu)的構(gòu)件和連接件類(lèi)型并提供了關(guān)于體系結(jié)構(gòu)的高層編譯器。

(7)?Wright支持體系結(jié)構(gòu)構(gòu)件之間交互的說(shuō)明和分析。這些ADL強(qiáng)調(diào)了體系結(jié)構(gòu)不同的側(cè)面,對(duì)體系結(jié)構(gòu)的研究和應(yīng)用起到了重要的作用,但也有負(fù)面的影響。每一種ADL都以獨(dú)立的形式存在,描述語(yǔ)法不同且互不兼容,同時(shí)又有許多共同的特征,這使設(shè)計(jì)人員很難選擇一種合適的ADL;大部分ADL都是領(lǐng)域相關(guān)的,不利于對(duì)不同領(lǐng)域的體系結(jié)構(gòu)進(jìn)行分析;一些ADL在某些方面大同小異,有很多冗余的部分。

下面對(duì)其中的幾種ADL進(jìn)行較詳細(xì)的介紹,來(lái)了解ADL描述系統(tǒng)的體系結(jié)構(gòu)的具體方法。4.3.1UniCon

UniCon是一種圍繞著構(gòu)件和連接件這兩個(gè)基本概念組織的體系結(jié)構(gòu)描述語(yǔ)言。構(gòu)件代表了軟件系統(tǒng)中的計(jì)算和數(shù)據(jù)的處所,用于將計(jì)算和數(shù)據(jù)組織成多個(gè)部分。這些組成部分都有完善定義的語(yǔ)義和行為。連接件是代表構(gòu)件間的交互作用的類(lèi),它們?cè)跇?gòu)件之間的交互中起中介作用。

UniCon的主要目的在于支持對(duì)體系結(jié)構(gòu)的描述,對(duì)構(gòu)件交互模式進(jìn)行定位和編碼,并且對(duì)需要不同交互模式的構(gòu)件的打包加以區(qū)分。具體地說(shuō),UniCon及其支持工具的主要目的有:

(1)提供對(duì)大量構(gòu)件和連接件的統(tǒng)一的訪(fǎng)問(wèn)。

(2)區(qū)分不同類(lèi)型的構(gòu)件和連接件以便對(duì)體系結(jié)構(gòu)配置進(jìn)行檢查。

(3)支持不同的表示方式和不同開(kāi)發(fā)人員的分析工具。

(4)支持對(duì)現(xiàn)有構(gòu)件的使用。為了達(dá)到目的(1),UniCon提供了一組預(yù)先定義的構(gòu)件和連接件類(lèi)型,體系結(jié)構(gòu)的開(kāi)發(fā)者從中選擇合適的構(gòu)件或連接件。對(duì)于目的(2),UniCon區(qū)分所有類(lèi)型的構(gòu)件和連接件的交互點(diǎn),并對(duì)它們的組合方式進(jìn)行限制。根據(jù)這些限制,UniCon工具可以對(duì)組合失配進(jìn)行檢查。對(duì)于目的(3),特性列表的方法已經(jīng)被ACME和USC開(kāi)發(fā)的ArchitectureCaptureTool所采納。對(duì)于已有的構(gòu)件,通過(guò)利用UniCon的術(shù)語(yǔ)對(duì)其接口重新定義的方式,使得它們可以被UniCon使用。在UniCon中,定義構(gòu)件的語(yǔ)法如下:

<component>:==COMPONENT<identifier>

<interface>

<component_implementation>

END<identifier>

可見(jiàn),構(gòu)件的定義主要包括兩方面的內(nèi)容,即接口和實(shí)現(xiàn)。

構(gòu)件是通過(guò)接口來(lái)定義的。接口定義了構(gòu)件所承擔(dān)的計(jì)算任務(wù),并規(guī)定了在使用構(gòu)件時(shí)的約束條件。它還對(duì)構(gòu)件的性能和行為做了要求。

UniCon中定義接口的語(yǔ)法如下:

<interface>:==INTERFACEIS

TYPE<component_type>

<property_list>

<player_list>

<component_type>:==Module|Computation|SharedData

|SeqFile|Filter|Process|General接口包括3方面的信息:構(gòu)件類(lèi)型、屬性和參與者定義。

構(gòu)件類(lèi)型:表達(dá)了設(shè)計(jì)者所認(rèn)為的構(gòu)件所承擔(dān)的功能種類(lèi)。構(gòu)件類(lèi)型對(duì)參與者的數(shù)目、類(lèi)型等做出了約束。

屬性:屬性列表用于對(duì)構(gòu)件整體信息進(jìn)行補(bǔ)充說(shuō)明,以“特性-值”形式成對(duì)出現(xiàn)。在定義構(gòu)件接口時(shí),諸如運(yùn)行某個(gè)進(jìn)程的處理器的名字,或在運(yùn)行環(huán)境中進(jìn)程的優(yōu)先級(jí),都用屬性說(shuō)明。

參與者:它起到類(lèi)似掛鉤的作用,構(gòu)件通過(guò)它與其他構(gòu)件實(shí)現(xiàn)交互。在連接件把構(gòu)件組織成系統(tǒng)時(shí),實(shí)際上是參與者被關(guān)聯(lián)了起來(lái)。構(gòu)件的實(shí)現(xiàn)有兩種方式:原始的方式和合成的方式。

原始的實(shí)現(xiàn)方式由一個(gè)指向源文檔的指針構(gòu)成,該文檔使用UniCon之外的語(yǔ)言,構(gòu)件的實(shí)現(xiàn)包含在此源文檔中。此源文檔可以是某種程序設(shè)計(jì)語(yǔ)言編寫(xiě)的源代碼,或obj文件,或二進(jìn)制形式的可執(zhí)行代碼,或一段Unix下的Shell腳本等。

合成的實(shí)現(xiàn)方式是對(duì)構(gòu)件和連接件配置的一種描述,這些構(gòu)件和連接件也是用UniCon定義的。

UniCon中定義構(gòu)件實(shí)現(xiàn)的語(yǔ)法如下:

<component_implementation>:==

<primitive_implementation>|<composite_implementation>

<primitive_implementation>:==IMPLEMENTATIONIS

<property_list>

<variant_list>

ENDIMPLEMENTATION

<composite_implementation>:==IMPLEMENTATIONIS

<property_list>

<composite_statement_list>

ENDIMPLEMENTATION軟件系統(tǒng)中,構(gòu)件與構(gòu)件之間的交互有著不同的特點(diǎn)。按照這些特點(diǎn),可以把構(gòu)件間的交互分為不同的類(lèi)型。這種不同類(lèi)型的交互在連接件上的反映,就是不同的連接件類(lèi)型。

UniCon中定義連接件的語(yǔ)法如下;

<connector>:==CONNECTOR<identifier>

<protocol>

<connector_implementation>

END<identifier>連接件的定義主要包括兩方面的內(nèi)容,即協(xié)議和實(shí)現(xiàn)。

連接件用協(xié)議來(lái)定義。協(xié)議定義了多個(gè)構(gòu)件之間所允許的交互,并為這些交互提供保障。它也包括3方面的信息:連接件類(lèi)型、屬性和角色定義。

連接件類(lèi)型表達(dá)了設(shè)計(jì)者所認(rèn)為的連接件所承擔(dān)的構(gòu)件交互種類(lèi),對(duì)可以定義的角色的數(shù)目、類(lèi)型等做出了約束。

屬性對(duì)連接件的整體信息進(jìn)行補(bǔ)充說(shuō)明,以“特性-值”形式成對(duì)出現(xiàn),它們體現(xiàn)了協(xié)議所承擔(dān)的交互任務(wù)。角色是連接件中可視的語(yǔ)義單元。連接件通過(guò)角色在構(gòu)件之間進(jìn)行中介。當(dāng)系統(tǒng)中的構(gòu)件和連接件有交互時(shí),構(gòu)件的參與者和連接件的角色被關(guān)聯(lián)起來(lái)。角色定義了連接件對(duì)參與者的需求和職責(zé)。

UniCon中定義協(xié)議的語(yǔ)法如下:

<protocol>:==PROTOCOLIS

TYPE<connector_type>

<property_list>

<role_list>

ENDPROTOCOL

<connector_type>:==DataAccess|FileIO|Pipe

|PLBundler|ProcedureCall

|RemoteProcCall|RTScheduler連接件的實(shí)現(xiàn)方式是UniCon語(yǔ)言?xún)?nèi)建的。UniCon工具集提供了專(zhuān)門(mén)的實(shí)現(xiàn)方式。UniCon不提供任何的機(jī)制用于支持用戶(hù)自定義的連接件實(shí)現(xiàn)。與構(gòu)件的實(shí)現(xiàn)類(lèi)似,連接件的實(shí)現(xiàn)也有兩種方式:原始的方式和合成的方式(但由于連接件的合成方式實(shí)現(xiàn)比較復(fù)雜,目前版本的UniCon還不支持)。

UniCon中定義連接件實(shí)現(xiàn)的語(yǔ)法如下:

<connector_implementation>:==IMPLEMENTATIONIS

BUILTIN

ENDIMPLEMENTATION 下面是UniCon描述管道的一個(gè)例子,在這個(gè)例子中,兩個(gè)連接由構(gòu)件和連接件實(shí)例分開(kāi)。

USESp1PROTOCOLUnix-pipe

USESsorterINTERFACESort-filter

CONNECTsorter.outputTOp1.source

USESp2PROTOCOLUnix-pipe

USESprinterINTERFACEPrint-filter

CONNECTsorter.inputTOp2.sink 再來(lái)看一個(gè)完整的體系結(jié)構(gòu)描述的例子。假設(shè)一個(gè)實(shí)時(shí)系統(tǒng)采用客戶(hù)/服務(wù)器體系結(jié)構(gòu),在該系統(tǒng)中,有兩個(gè)任務(wù)共享同一個(gè)計(jì)算機(jī)資源,這種共享通過(guò)遠(yuǎn)程過(guò)程調(diào)用(RomoterProcedureCall,RPC)實(shí)現(xiàn)。UniCon對(duì)該體系結(jié)構(gòu)的描述如下:

componentReal_Time_System

interfaceis

typeGeneral

implementationis

usesclientinterfacertclient

PRIORITY(10)

endclient

usesserverinterfacertserver

PRIORITY(10)

endserver

establishRTM-realtime-schedwith

client.application1asload

server.application2asload

server.servicesasload

algorithe(rate_monotonic)

endRTM-realtime-sched

estalbishRTM-remote-proc-callwith

client.timegetascaller

server.timegetasdefiner

IDLTYPE(Mach)

endRTM-remote-proc-call

endimplementation

endReal-Time-System

connectorRTM-realtime-sched

protocolis

typeRTScheduler

roleloadisload

endprotocol

implementationisbuiltin

endimplementation

endRTM-realtime-sched4.3.2C2

C2和其提供的設(shè)計(jì)環(huán)境(Argo)支持采用基于時(shí)間的風(fēng)格來(lái)描述用戶(hù)界面系統(tǒng),并支持使用可替換、可重用的構(gòu)件開(kāi)發(fā)GUI的體系結(jié)構(gòu)。

在C2中,連接件負(fù)責(zé)構(gòu)件之間消息的傳遞,而構(gòu)件負(fù)責(zé)維持狀態(tài)、執(zhí)行操作并通過(guò)兩個(gè)名字分別為“top”和“bottom”的端口和其他的構(gòu)件交換信息。每個(gè)接口包含一組可發(fā)送的消息和一組可接收的消息。構(gòu)件之間的消息要么是請(qǐng)求其他構(gòu)件執(zhí)行某個(gè)操作的請(qǐng)求消息,要么是通知其他構(gòu)件自身執(zhí)行了某個(gè)操作或狀態(tài)發(fā)生改變的通知消息。構(gòu)件之間的消息交換不能直接進(jìn)行,而只能通過(guò)連接件來(lái)完成。每個(gè)構(gòu)件接口最多只能和一個(gè)連接件相連,而連接件可以和任意數(shù)目的構(gòu)件或連接件相連。請(qǐng)求消息只能向上層傳送,而通知消息只能向下層傳送。通知消息的傳遞只對(duì)應(yīng)于構(gòu)件內(nèi)部的操作,而和接收消息的構(gòu)件的需求無(wú)關(guān)。

C2要求通知消息的傳遞只對(duì)應(yīng)于構(gòu)件內(nèi)部的操作,而和接收消息的構(gòu)件的需求無(wú)關(guān)。這種對(duì)通知消息的約束保證了底層獨(dú)立性,即可以在包含不同的底層構(gòu)件(比如不同的窗口系統(tǒng))的體系結(jié)構(gòu)中復(fù)用C2構(gòu)件。C2對(duì)構(gòu)件和連接件的實(shí)現(xiàn)語(yǔ)言、實(shí)現(xiàn)構(gòu)件的線(xiàn)程控制、構(gòu)件的部署以及連接件使用的通信協(xié)議等都不加限制。下面是C2對(duì)構(gòu)件的一個(gè)描述:

Component::=

componentcomponent_nameis

interfacecomponent_message_interface

parameterscomponent_parameters

methodscomponent_methods

[behaviorcomponent_behavior]

[contextcomponent_context]

endcomponent_name;下面是C2對(duì)構(gòu)件接口的描述:

component_message_interface::=

top_domain_interface

bottom_domain_interface

top_domain_interface::=

top_domainis

outinterface_requests

ininterface_notifications bottom_domain_interface::=

bottom_domainis

outinterface_notifications

ininterface_requests

interface_requests::=

{request;}|null;

interface_notifications::=

{notification;}|null;request::=

message_name(request_parameters)

request_parameters::=

[tocomponent_name][parameter_list]

notification::=

message_name[parameter_list]下面以會(huì)議安排系統(tǒng)為例,詳細(xì)討論C2風(fēng)格的描述語(yǔ)言。會(huì)議安排系統(tǒng)的C2風(fēng)格體系結(jié)構(gòu)如圖4-2所示。

系統(tǒng)包含了三種功能構(gòu)件,分別是一個(gè)Meeting-Initiator、若干個(gè)Attendee和Important-Attendee,三個(gè)連接件(MainConn、AttConn和ImportantAttConn)用來(lái)在構(gòu)件之間傳遞消息,某些消息可由MeetingInitiator同時(shí)發(fā)送給Attendee和Important

Attendee,但還有某些消息只能傳遞給ImportantAttendee。因?yàn)橐粋€(gè)C2構(gòu)件在top、bottom端分別只有一個(gè)通信端口,且所有消息路由功能都與連接件相關(guān),所以MainConn必須保證其top端的AttConn和ImportantAttConn分別只接收那些與它們相連的構(gòu)件有關(guān)的消息。圖4-2會(huì)議安排系統(tǒng)的C2風(fēng)格體系結(jié)構(gòu)

MeetingInitiator構(gòu)件通過(guò)發(fā)送會(huì)議請(qǐng)求信息給Attendee和ImprotantAttendee來(lái)進(jìn)行系統(tǒng)初始化。Attendee和Important

Attendee構(gòu)件可以發(fā)送消息給MeetingInitiator,告訴MeetingInitiator自己喜歡的會(huì)議日期、地點(diǎn)等信息。但不能向MeetingInitiator遞交請(qǐng)求,因?yàn)樵贑2體系結(jié)構(gòu)中,它們處在MeetingInitiator的top端。MeetingInitiator構(gòu)件的描述如下:

componentMeetingInitiatoris

interface

top_domainis

out

GetPrefSet();

GetExclSet();

GetEquipReqts();

GetLocPrefs();

RemoveExclSet();

RequestWithdrawal(toAttendee);

RequestWithdrawal(toImportantAttendee);

AddPrefDates();

MarkMtg(d:date;l:lov_type);

in

PrefSet(p:date_mg);

ExclSet(e:data_mg);

EquipReqts(eq:equip_type);

LocPref(l:loc_type);

behavior

startupalways_generateGetPrefSet,GetExclSet,GetEquipReqts,GetLocPrefs;received_messagesPrefSetmay_generateRemoveExclSetxor

RequestWithdrawalxorMarkMtg;

received_messagesExclSetmay_generateAddPrefDatesxorRemoveExclSet

xorRequestWithdrawalxorMarkMtg;

received_messagesEquipReqtsmay_generateAddPrefDatesxor

RemoveExclSetxorRequestWithdrawalxorMarkMtg;

received_messagesLocPrefalways_generatenull;

endMeetingInitiator;

Attendee和ImportantAttendee構(gòu)件接收來(lái)自MeetingInitiator構(gòu)件的會(huì)議安排請(qǐng)求,把自己的有關(guān)信息發(fā)送給MeetingInitiator。這兩種構(gòu)件只能通過(guò)其bottom端與體系結(jié)構(gòu)中的其他元素進(jìn)行通信。Attendee構(gòu)件的描述如下:

componentAttendeeis

interface

bottom_domainis

out

PrefSet(p:date_mg);

ExclSet(e:date_mg);

EquipReqts(eq:equip_type);in

GetPrefSet();

GetExclSet();

GetEquipReqts();

RemoveExclSet();

RequestWithdrawal();

AddPrefDates();

MarkMtg(d:date;l:loc_type);

behavior

received_messagesGetPrefSetalways_generatePrefSet;

received_messagesAddPrefDatesalways_generatePrefSet;

received_messagesGetExclSetalways_generateExclSet;

received_messagesGetEqipReqtsalways_generateEqipReqts;

received_messagesRemoveExclSetalways_generateExclSet;

received_messagesReuestWithdrawalalways_generatenull;

received_messagesMarkMtgalways_generatenull;

endAttendee;

ImportantAttendee構(gòu)件是Attendee構(gòu)件的一個(gè)特例,它具有Attendee構(gòu)件的一切功能,并且還增加了自己特定的功能(可以指定會(huì)議地點(diǎn)),因此ImportantAttendee可以作為Atendee的一個(gè)子類(lèi)型,保留Attendee的接口和行為。ImportantAttendee構(gòu)件的描述如下:componentImportantAttendeeissubtypeAttendee(inandbeh)

interface

bottom_domainis

out

LocPrefs(l:loc_type);

ExclSet(e:date_mg);

EquipReqts(eq:equip_type);

in

GetLocPrefs();

behavior

received_messagesGetLocPrefsalways_generateLocPrefs;

endImportantAttendee; 有了上述3個(gè)構(gòu)件的描述之后,就得到體系結(jié)構(gòu)的描述如下:

architectureMeetingScheduleris

conceptual_components

Attendee;ImportantAttendee;MeetingInitiator;

connectors

connectorMainConnismessage_filterno_filtering;

connectorAttConnismessage_filterno_filtering;

connectorImportantAttConnismessage_filterno_filtering;architectural_topology

connectorAttConnconnections

top_portsAttendee;

bottom_portsMainConn;

connectorImportantAttConnconnections

top_portsImportantAttendee;

bottom_portsMainConn;

connectorMainConnconnections

top_portsAttConn;ImportantAttConn;

bottom_portsMeetingInitiator;

endMeetingScheduler;當(dāng)實(shí)例化構(gòu)件時(shí),可以指定體系結(jié)構(gòu)的一個(gè)實(shí)例。例如,當(dāng)有3個(gè)普通與會(huì)人員和2個(gè)重要與會(huì)人員時(shí),會(huì)議安排應(yīng)用對(duì)應(yīng)的一個(gè)實(shí)例的描述如下:

//C2對(duì)會(huì)議安排系統(tǒng)的描述

systemMeetingScheduler_1is

architectureMeetingSchedulerwith

AttendeeinstanceAtt_1,Att_2,Att_3;

ImportantAttendeeinstanceImpAtt_1,ImpAtt_2;

MeetingInitiatorinstanceMtgInit_1;

endMeetingScheduler_1;4.3.3Wright

Wright的關(guān)鍵思想是把體系結(jié)構(gòu)連接件定義為明確的語(yǔ)義實(shí)體。這些實(shí)體用協(xié)議代表了交互中的各個(gè)參與角色及其相互作用。

Wright支持對(duì)構(gòu)件之間交互的形式化和分析。連接件通過(guò)協(xié)議來(lái)定義,而協(xié)議刻畫(huà)了與連接件相連的構(gòu)件的行為。對(duì)連接件角色的描述表明了對(duì)參與交互的構(gòu)件的“期望”以及實(shí)際的交互進(jìn)行過(guò)程。構(gòu)件通過(guò)其端口和行為來(lái)定義,表明了端口之間是如何通過(guò)構(gòu)件的行為而具有相關(guān)性的。一旦構(gòu)件和連接件的實(shí)例被聲明,系統(tǒng)組合便可以通過(guò)構(gòu)件的端口和連接件的角色之間的連接來(lái)完成。

Wright的主要特點(diǎn)是:對(duì)體系結(jié)構(gòu)和抽象行為的精確描述、定義體系結(jié)構(gòu)風(fēng)格的能力和一組對(duì)體系結(jié)構(gòu)描述進(jìn)行一致性和完整性的檢查。體系結(jié)構(gòu)通過(guò)構(gòu)件、連接件以及它們之間的組合來(lái)描述;抽象行為通過(guò)構(gòu)件的行為和連接件的膠水來(lái)描述。

在Wright中,對(duì)體系結(jié)構(gòu)風(fēng)格的定義通過(guò)描述能在該風(fēng)格中使用的構(gòu)件和連接件以及刻畫(huà)如何將它們組合成一個(gè)系統(tǒng)的一組約束來(lái)完成。因此,Wright能夠支持針對(duì)某一特定體系結(jié)構(gòu)風(fēng)格所進(jìn)行的檢查。但是,它不支持針對(duì)異構(gòu)風(fēng)格組成的系統(tǒng)的檢查。Wright提供一致性和完整性檢查的有:端口-行為一致性、連接件死鎖、角色死鎖、端口-角色相容性、風(fēng)格約束滿(mǎn)足以及膠水完整性等。下面是用Wright對(duì)管道連接件進(jìn)行描述的例子。在這個(gè)例子中,定義了Pipe連接件,該連接件具有兩個(gè)角色,分別為Writer和Reader。其中“→”表示事件變遷,“√”表示過(guò)程成功地終止,“□”表示確定性的選擇。connectorPipe=

roleWriter=write→Writer□close→√

roleReader=

letExitOnly=close→√

inletDoRead=(read→Reader□read-eof→ExitOnly)

inDoRead□ExitOnly

glue=letReadOnly=Reader.read→ReadOnly

□Reader.read-eof→Reader.close→√

□Reader.close→√

InletWrithOnly=Writer.write→

WriteOnly□Writer.close→√

InWriter.write→glue

□Reader.read→glue

□Writer.close→ReadOnly

□Reader.close→WriteOnly4.3.4ACME

ACME是由美國(guó)卡耐基梅隆大學(xué)的Garlan等人創(chuàng)建的一門(mén)體系結(jié)構(gòu)描述語(yǔ)言,其最初目的是為了創(chuàng)建一門(mén)簡(jiǎn)單的、具有一般性的ADL,該ADL能用來(lái)為體系結(jié)構(gòu)設(shè)計(jì)工具轉(zhuǎn)換形式和為開(kāi)發(fā)新的設(shè)計(jì)與分析工具提供基礎(chǔ)。

嚴(yán)格說(shuō)來(lái),ACME并不是一種真正意義上的ADL,而是一種體系結(jié)構(gòu)變換語(yǔ)言,它提供了一種在不同ADL的體系結(jié)構(gòu)規(guī)范描述之間實(shí)現(xiàn)變換的機(jī)制,可以把它作為體系結(jié)構(gòu)設(shè)計(jì)工具的通用交換格式。

ACME提供了描述體系結(jié)構(gòu)的結(jié)構(gòu)特性的方法,此外還提供了一種開(kāi)放式的語(yǔ)義框架,使得可以在結(jié)構(gòu)特性上標(biāo)注一些ADL相關(guān)的屬性。這種方法使得ACME既能表示大多數(shù)ADL都能描述的公共的結(jié)構(gòu)信息,又能使用注解來(lái)表示與特定的ADL相關(guān)的信息。有了這種公共而又靈活的表示方法,再加上ADL之間關(guān)于屬性的語(yǔ)義轉(zhuǎn)換工具,就能順利地實(shí)現(xiàn)ADL之間的變換,從而使ADL之間能夠?qū)崿F(xiàn)分析方法和工具的共享。

ACME支持從四個(gè)不同的方面對(duì)軟件體系結(jié)構(gòu)進(jìn)行描述,分別是結(jié)構(gòu)、屬性、設(shè)計(jì)約束、類(lèi)型和風(fēng)格。

1.結(jié)構(gòu)

在A(yíng)CME中定義了七種體系結(jié)構(gòu)實(shí)體,分別是構(gòu)件、連接件、系統(tǒng)、端口、角色、表述和表述映射,其中前五種如圖4-3所示。圖4-3ACME描述的元素下面是用ACME描述的一個(gè)簡(jiǎn)單的C/S體系結(jié)構(gòu)。?其中,client構(gòu)件只有一個(gè)sendRequest端口;server構(gòu)件也只有一個(gè)receiveRequest端口;連接件rpc有兩個(gè)角色,分別為caller和callee。該系統(tǒng)的布局由構(gòu)件端口和連接件角色綁定的attachments定義,其中client的請(qǐng)求端口綁定到rpc的caller角色,server的請(qǐng)求處理端口綁定到rpc的callee端口。Systemsimple_CS={

ComponentClient={PortsendRequest}

ComponentServer={PortreceiveRequest;}

Connectorrpc={Roles{caller,callee}}

Attachments{

Client.sendRequesttorpc.caller;

Server.receiveRequesttorpc.callee}

}

ACME支持體系結(jié)構(gòu)的分級(jí)描述,特別是每個(gè)構(gòu)件或連接件都能用一個(gè)或多個(gè)更詳細(xì)、更低層的描述來(lái)表示。在A(yíng)CME中,每一個(gè)這樣的描述被稱(chēng)為一個(gè)表述。通過(guò)使用多個(gè)表述,ACME能表達(dá)體系結(jié)構(gòu)實(shí)體的多種視圖,如圖4-4所示。圖4-4構(gòu)件的表述和屬性當(dāng)某個(gè)構(gòu)件或連接件有體系結(jié)構(gòu)表述,那就需要有一種手段來(lái)指出,在這個(gè)表述的系統(tǒng)內(nèi)部和此表述所代表的構(gòu)件或連接件的外部接口之間存在何種相關(guān)性。表述映射定義了這種相關(guān)性。在最簡(jiǎn)單的例子中,構(gòu)件的表述映射僅提供內(nèi)部端口和外部端口之間的聯(lián)系,連接件的表述映射僅提供內(nèi)部角色和外部角色之間的聯(lián)系。

圖4-5說(shuō)明了細(xì)化后的C/S結(jié)構(gòu)的表述的使用。在圖中,server(服務(wù)器)構(gòu)件由一個(gè)更詳細(xì)的體系結(jié)構(gòu)表述所細(xì)化。圖4-5帶有表述的C/S結(jié)構(gòu)使用ACME對(duì)圖4-5中帶有表述的C/S結(jié)構(gòu)的描述如下:

Systemsimple_CS={

Componentclient={…}

Componentserver={

PortreceiveRequest;

RepresentationserverDetails={

SystemserverDetailsSys={

ComponentconnectionManager={

Ports{externalSocket;securityCheckIntf;dbQueryIntf;}}ComponentsecurityManager={

Ports{securityAuthorization;credentialQuery;}}

Componentdatabase={

Ports{securityManagementIntf;credentialQuery;}}

ConnectorSQLQuery={Roles{caller;callee}}

ConnectorclearanceRequest={Role{requestor;grantor}}

ConnectorsecurityQuery={Roles{securityManager;requestor}}

Attachments{ConnectionManager.securityCheckIntftoclearanceRequest.requestor;

SecurityManager.securityAuthorizationtoclearanceRequest.grantor;

ConnectionManager.dbQueryIntftoSQLQuery.caller;

Database.queryIntftoSQLQuery.callee;

securityManager.credentialQuerytosecurityQuery.securityManager;

database.securityManagerIntftosecurityQuery.requestor;}

}

Bindings{connectionManager.externalSockettoserver.receiveRequest;}

}

}

Connectorrpc={…}

Attachments{client.sendRequesttorpc.caller;

Server.receiveRequesttorpc.callee}

2.屬性

ACME定義的七類(lèi)體系結(jié)構(gòu)實(shí)體足以定義一個(gè)體系結(jié)構(gòu)的組織,但為了記錄體系結(jié)構(gòu)的非結(jié)構(gòu)屬性,以及為說(shuō)明輔助信息提供開(kāi)放型需求,ACME支持使用任意的屬性列表對(duì)體系結(jié)構(gòu)的結(jié)構(gòu)進(jìn)行注釋。每個(gè)屬性有名稱(chēng)、可選類(lèi)型和值。ACME定義的七類(lèi)設(shè)計(jì)元素都可以用屬性列表進(jìn)行注釋。屬性可用來(lái)記錄與體系結(jié)構(gòu)相關(guān)分析和設(shè)計(jì)的細(xì)節(jié)。

在圖4-4中,對(duì)三個(gè)屬性進(jìn)行了注釋。下面給出一個(gè)帶注釋的ACME描述例子。Systemsimple_CS={

Componentclient={

PortsendRequest;

Properties{requestRate:float=17.0;

sourceCode:externalFile=“CODE-LIB/client.c”}}

Componentserver={

PortreceiveRequest;

Properties{idempotence:boolean=true;

maxConcurrentClients:integer=1;

sourceCode:externalFile="CODE-LIB/server.c"}}

Connectorrpc={

Rolecaller;

Rolecallee;

Properties{synchronous:boolean=true;

maxRoles:integer=2}}

Attachments{

client.sendRequesttorpc.caller;

server.receiveRequesttorpc.callee}

}

3.設(shè)計(jì)約束

設(shè)計(jì)約束是體系結(jié)構(gòu)描述的關(guān)鍵成分,它們決定體系結(jié)構(gòu)設(shè)計(jì)是如何演化的。設(shè)計(jì)約束可以當(dāng)做一種特殊的屬性。但因?yàn)樵隗w系結(jié)構(gòu)中,設(shè)計(jì)約束起著核心作用,所以ACME提供了特定的語(yǔ)法來(lái)描述設(shè)計(jì)約束。

ACME使用基于一階謂詞邏輯的約束語(yǔ)言來(lái)描述設(shè)計(jì)約束,在體系結(jié)構(gòu)規(guī)格說(shuō)明中,約束被當(dāng)作謂詞。例如,有決定兩個(gè)構(gòu)件是否有連接的謂詞,有決定一個(gè)構(gòu)件是否有特殊的屬性的謂詞等,如表4-4所示。約束可以與ACME描述中的任何設(shè)計(jì)元素相關(guān)聯(lián),約束的范圍取決于關(guān)聯(lián)。例如,如果一個(gè)約束與一個(gè)系統(tǒng)相關(guān)聯(lián),則它可以引用包含在該系統(tǒng)中的任何設(shè)計(jì)元素(構(gòu)件、連接件的全部或部分)。另一方面,與一個(gè)構(gòu)件相關(guān)聯(lián)的約束只能引用該構(gòu)件及其部分(端口、屬性和表述)。例如,下面語(yǔ)句的約束與一個(gè)系統(tǒng)相關(guān)聯(lián):

connected(client,server)如果名字為client的構(gòu)件與名字為server的構(gòu)件直接由一個(gè)連接件連接,則該約束取True。

又如,約束

forallconn:connectorinsystemInstance.Connectors@size(conn.roles)=2

當(dāng)系統(tǒng)中的所有連接件都是二元連接件時(shí)取True。

約束可以定義合法屬性值的范圍,例如:

Self.throughputRate>=3095

約束也可以表明兩個(gè)屬性之間的關(guān)系,例如:

comp.totalLatency=(comp.readLatency+cessingLatency+comp.writeLatency)約束可以通過(guò)兩種方式附加到設(shè)計(jì)元素,分別是invariant和heuristic,其中invariant約束當(dāng)作是不可違反的規(guī)則看待,heuristic約束當(dāng)作應(yīng)該遵守的規(guī)則看待。對(duì)invariant約束的違反會(huì)使體系結(jié)構(gòu)規(guī)格說(shuō)明無(wú)效,而對(duì)heuristic約束的違反會(huì)當(dāng)作一個(gè)警告處理。

下例說(shuō)明了如何在A(yíng)CME中使用約束。其中invariant約束描述合法緩沖的大小范圍,heuristic約束描述了期望的速度最大值。SystemmessagePathSystem={

ConnectorMessagepath={

Roles{source;sink;}

PropertyexpectedThroughput:float=512;

Invariant(queueBufferSize>=512)and(queueBufferSize<=4096);

HeuristicexpectedThroughput<=(queueBufferSize/2);

}

}

4.類(lèi)型和風(fēng)格

體系結(jié)構(gòu)描述的一個(gè)重要能力就是能夠定義系統(tǒng)的風(fēng)格或族。風(fēng)格允許我們定義領(lǐng)域特定或應(yīng)用特定的設(shè)計(jì)詞匯,以及如何使用這些詞匯的約束,支持對(duì)領(lǐng)域特定的設(shè)計(jì)經(jīng)驗(yàn)的打包,特定目的的分析和代碼生成工具的使用,設(shè)計(jì)過(guò)程的簡(jiǎn)化,與體系結(jié)構(gòu)標(biāo)準(zhǔn)一致性的檢查等。

在A(yíng)CME中,定義風(fēng)格的基本構(gòu)造塊是一個(gè)類(lèi)型系統(tǒng),設(shè)計(jì)師可以定義三種類(lèi)型,分別是屬性類(lèi)型、結(jié)構(gòu)類(lèi)型和風(fēng)格。

(1)屬性類(lèi)型。在前面已經(jīng)討論過(guò)屬性類(lèi)型,此處不再贅述。

(2)結(jié)構(gòu)類(lèi)型。結(jié)構(gòu)類(lèi)型使定義構(gòu)件、連接件、端口和角色的類(lèi)型變得可能,每一個(gè)這樣的類(lèi)型提供了一個(gè)類(lèi)型名稱(chēng)和一個(gè)所需要的子結(jié)構(gòu)、屬性和約束的列表。

下面是一個(gè)client構(gòu)件類(lèi)型的描述例子。類(lèi)型定義指明了任何構(gòu)件如果是類(lèi)型client的任何一個(gè)實(shí)例,則必須至少有一個(gè)端口稱(chēng)作Request和一個(gè)浮點(diǎn)型的屬性稱(chēng)作request-rate。而且與類(lèi)型關(guān)聯(lián)的invariant約束要求client構(gòu)件的所有端口都有一個(gè)取值為rpc-client的協(xié)議屬性,每個(gè)client都不得超過(guò)五個(gè)端口,構(gòu)件的請(qǐng)求個(gè)數(shù)必須大于0。最后,還有一個(gè)heuristic約束,要求請(qǐng)求的個(gè)數(shù)應(yīng)該少于100。ComponentTypeClient={

PortRequest={Propertyprotocol:CSProtocolT};

PropertyRequest-rate:Float;

Invariantsize(self.Ports)<=5;

Invariantrequest-rate>=0;

Heuristicrequest-rate<100;

}

(3)風(fēng)格。在A(yíng)CME中,風(fēng)格被稱(chēng)為族,如同結(jié)構(gòu)類(lèi)型代表一組結(jié)構(gòu)元素一樣,族代表一組系統(tǒng)。在A(yíng)CME中,可通過(guò)指定三件事情來(lái)定義一個(gè)族,分別是一組屬性和結(jié)構(gòu)元素、一組約束、默認(rèn)結(jié)構(gòu)。屬性類(lèi)型和結(jié)構(gòu)類(lèi)型為族提供了設(shè)計(jì)詞匯,約束決定了如何使用這些類(lèi)型的實(shí)例,默認(rèn)結(jié)構(gòu)描述了必須出現(xiàn)在族中任何系統(tǒng)中的實(shí)例的最小集合。

下例是一個(gè)定義管道-過(guò)濾器族和使用該族的一個(gè)系統(tǒng)的實(shí)例。在這個(gè)族中,定義了兩個(gè)構(gòu)件類(lèi)型、一個(gè)連接件類(lèi)型和一個(gè)屬性類(lèi)型。該族唯一的invariant約束指定了所有連接件必須使用管道,沒(méi)有默認(rèn)的結(jié)構(gòu)。系統(tǒng)simplePF作為族的一個(gè)實(shí)例來(lái)定義,這種定義允許系統(tǒng)使用族的任何類(lèi)型,且必須滿(mǎn)足族的所有invariant約束。FamilyPipeFilterFam={

ComponetTypeFilterT={

Ports{stdin;stdput};

Propertythroughout:int;

}

CompontTypeUnixFilterTextendsFilterTwith{

Portstderr;

PropertyimplementationFile:String;

}ConnectorTypePipeT={

Roles{source;sink};

PropertybufferSize:int;

}

PropertyTypeStringMsgFormatT=Record[size:int;msg:String];

InvariantForallcinself.Connectors@HasType(c,pipeT);

}SystemsimplePF:PipeFilterFam={

Componentsmooth:FilterT=newFilterT;

ComponentdetectErrors:FilterT;

ComponentshowTracks:UnixFilterT=newUnixFilterTextendedwith{

PropertyimplementationFile:String="IMPL_HOME/

showTracks.c"

}//Declarethesystem’sconnectors

ConnectorfirstPipe:PipeT;

ConnectorsecondPipe:PipeT;

//Definethesystem’stopology

Attachments{

smooth.stdouttofirstPipe.source;

detectErrors.stdintofirstPipe.sink;

detectErrors.stdouttosecondPipe.source;

showTracks.stdintosecondPipe.sink;

}從以上介紹中可以看出,這些ADL的共同目的都是以構(gòu)件和連接件的方式描述軟件體系結(jié)構(gòu),不同的只是底層的語(yǔ)法和語(yǔ)義。目前的ADL基本上都滿(mǎn)足必需的語(yǔ)言標(biāo)準(zhǔn),尤其是重用的重要性。為了更好地使用ADL,通常需要一個(gè)配套的開(kāi)發(fā)環(huán)境。這類(lèi)環(huán)境通常提供以下工具:創(chuàng)建和瀏覽設(shè)計(jì)的圖形化編輯器、體系結(jié)構(gòu)一致性檢查、代碼生成器、模式倉(cāng)儲(chǔ)等。

4.4可擴(kuò)展標(biāo)記語(yǔ)言

體系結(jié)構(gòu)描述語(yǔ)言ADL是一種形式化語(yǔ)言,它在底層語(yǔ)義模型的支持下,為軟件的概念體系結(jié)構(gòu)建模提供了具體語(yǔ)法和框架。使用ADL描述軟件體系結(jié)構(gòu)雖然具有精確、完全的特點(diǎn),但也導(dǎo)致專(zhuān)業(yè)術(shù)語(yǔ)過(guò)多、語(yǔ)義理論過(guò)于復(fù)雜等問(wèn)題,使其不利于向產(chǎn)業(yè)界推廣。而XML(ExtensibleMarkupLanguage,可擴(kuò)展標(biāo)記語(yǔ)言)簡(jiǎn)單和易于實(shí)現(xiàn),并且由于其在工業(yè)界廣泛使用,因此,若能用XML來(lái)表示軟件體系結(jié)構(gòu),必能極大推動(dòng)軟件體系結(jié)構(gòu)領(lǐng)域的研究成果在軟件產(chǎn)業(yè)界的應(yīng)用。4.4.1XML標(biāo)準(zhǔn)

1.SGML和HTML語(yǔ)言

20世紀(jì)60年代產(chǎn)生的通用標(biāo)記語(yǔ)言SGML(StandardGeneralizedMarkupLanguage),是一種用來(lái)創(chuàng)建其他標(biāo)記語(yǔ)言的語(yǔ)言,在1986年它成為定義標(biāo)記語(yǔ)言的國(guó)際標(biāo)準(zhǔn)(ISO8879)。SGML的目的是使作者為語(yǔ)言中的每個(gè)元素和屬性提供正式的定義以描述各種標(biāo)記語(yǔ)言,從而使他們能夠創(chuàng)建與內(nèi)容相聯(lián)系的標(biāo)記。也就是說(shuō)SGML語(yǔ)言是一種元語(yǔ)言。HTML就是用SGML語(yǔ)言寫(xiě)成的。SGML作為一門(mén)語(yǔ)言,雖然功能強(qiáng)大但很復(fù)雜,主要用于大量高度結(jié)構(gòu)化數(shù)據(jù)的場(chǎng)合和其他各種工業(yè)領(lǐng)域。若沒(méi)有保存在文件類(lèi)型定義(DTD)中對(duì)標(biāo)記語(yǔ)言的定義,則解釋一個(gè)SGML文檔就會(huì)十分困難。DTD存放所有語(yǔ)言規(guī)則,如果不限定如何使用,就無(wú)法使用SGML創(chuàng)建自己的標(biāo)記語(yǔ)言。

HTML(HypertextMarkedLanguage,超文本標(biāo)記語(yǔ)言)作為SGML語(yǔ)言的一個(gè)應(yīng)用,構(gòu)成如今因特網(wǎng)世界的絕大部分內(nèi)容。HTML是一種用來(lái)制作超文本文檔的簡(jiǎn)單標(biāo)記語(yǔ)言。用HTML編寫(xiě)的超文本文檔被稱(chēng)為HTML文檔,它能獨(dú)立于各種操作系統(tǒng)平臺(tái)(如UNIX、Windows等)。自1990年以來(lái),HTML一直用于描述網(wǎng)頁(yè)的格式設(shè)計(jì)和WWW上其他網(wǎng)頁(yè)的鏈接信息。HTML的優(yōu)點(diǎn)是簡(jiǎn)單易用,比較適合Web頁(yè)面的開(kāi)發(fā);它的缺點(diǎn)是標(biāo)記相對(duì)較少,只有固定的一些標(biāo)記集,不能支持特定領(lǐng)域的標(biāo)記語(yǔ)言,如對(duì)數(shù)學(xué)、化學(xué)、音樂(lè)等領(lǐng)域的表示支持較少,開(kāi)發(fā)者很難在Web頁(yè)面上表示數(shù)學(xué)公式、化學(xué)分子式和樂(lè)譜。

2.XML語(yǔ)言簡(jiǎn)介

鑒于SGML語(yǔ)言的復(fù)雜性和HTML語(yǔ)言的局限性,人們希望創(chuàng)建一種自己的標(biāo)記符和標(biāo)記符語(yǔ)言,并使之成為自描述性的語(yǔ)言,以便想標(biāo)記什么,怎么標(biāo)記都可以隨心所欲。這種標(biāo)記符語(yǔ)言首先應(yīng)該沒(méi)有SGML語(yǔ)言的復(fù)雜性,其次應(yīng)該具有SGML語(yǔ)言基本的創(chuàng)建標(biāo)記的功能,同時(shí)還應(yīng)該具有HTML語(yǔ)言的表現(xiàn)能力,即SGML語(yǔ)言的簡(jiǎn)化版本或者說(shuō)是其子集。XML語(yǔ)言應(yīng)運(yùn)而生。

XML由XML工作組(原SGML編輯審查委員會(huì))開(kāi)發(fā),大小只有SGML的1/5。它之所以被稱(chēng)為ExtensibleMarkupLanguage,是因?yàn)樗幌馠TML那樣有一個(gè)固定的格式,XML用戶(hù)可以自己創(chuàng)建標(biāo)記或使用其他人創(chuàng)建的標(biāo)記來(lái)描述元素的內(nèi)容。簡(jiǎn)單地說(shuō),XML就是標(biāo)記數(shù)據(jù)的一種方式,使得數(shù)據(jù)能夠自我描述。

XML使用一種可自我描述的簡(jiǎn)單的語(yǔ)法。下面對(duì)XML的語(yǔ)法作簡(jiǎn)單介紹。(1)一個(gè)XML文檔的例子。

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<note>

<to>Tove</to>

<from>Jani</from>

<heading>Reminder</heading>

<body>Don’tforgetmethisweekend!</body>

</note>此文檔中的第一行定義了XML的版本和文檔中使用的字符編碼。在這個(gè)例子中,遵守的是XML1.0規(guī)范,并使用了ISO-8859-1字符集。

接下來(lái)的一行描述了文檔的根元素(就像是在說(shuō):“本文檔是一個(gè)便簽”):

<note>

接下來(lái)的4行描述了根元素的4個(gè)子元素(to、from、heading以及body):

<to>Tove</to>

<from>Jani</from>

<heading>Reminder</heading>

<body>Don’tforgetmethisweekend!</body>最后的一行定義了根元素的結(jié)尾:

</note>

可以看到,這個(gè)XML文檔包含了一個(gè)由Jani留給Tove的便簽。由這個(gè)例子可以看出XML具有較好的自我描述特性。

(2)所有元素都須有關(guān)閉標(biāo)簽。當(dāng)使用XML時(shí),省略關(guān)閉標(biāo)簽是非法的。

在HTML

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論