軟件工程講義-第10章-構(gòu)件級設(shè)計建模要點課件_第1頁
軟件工程講義-第10章-構(gòu)件級設(shè)計建模要點課件_第2頁
軟件工程講義-第10章-構(gòu)件級設(shè)計建模要點課件_第3頁
軟件工程講義-第10章-構(gòu)件級設(shè)計建模要點課件_第4頁
軟件工程講義-第10章-構(gòu)件級設(shè)計建模要點課件_第5頁
已閱讀5頁,還剩67頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、現(xiàn)代軟件工程第10章 構(gòu)件級設(shè)計建模主要內(nèi)容什么是構(gòu)件設(shè)計基于類的構(gòu)件實施構(gòu)件級設(shè)計對象約束語言設(shè)計傳統(tǒng)構(gòu)件小結(jié)構(gòu)件級設(shè)計建模一套完整的軟件構(gòu)件是在體系結(jié)構(gòu)設(shè)計過程中定義的。但是沒有在接近代碼的抽象級上表示內(nèi)部數(shù)據(jù)結(jié)構(gòu)和每個構(gòu)件的處理細(xì)節(jié)。構(gòu)件級設(shè)計定義了數(shù)據(jù)結(jié)構(gòu)、算法、接口特征和分配給每個軟件構(gòu)件的通信機(jī)制。構(gòu)件級設(shè)計建模必須能夠在建造軟件之前就確定該軟件是否可以工作。為了保證設(shè)計的正確性,以及與早期設(shè)計表示(即數(shù)據(jù)、體系結(jié)構(gòu)和接口設(shè)計)的一致性,構(gòu)件級設(shè)計需要以一種可以評審設(shè)計細(xì)節(jié)的方式來表示軟件。它提供了一種評估數(shù)據(jù)結(jié)構(gòu)、接口和算法是否能夠工作的方法。構(gòu)件級設(shè)計建模 數(shù)據(jù)、體系結(jié)構(gòu)和接口

2、的設(shè)計表示構(gòu)成了構(gòu)件級設(shè)計的基礎(chǔ)。每個構(gòu)件的類定義或者處理敘述都轉(zhuǎn)化為一種詳細(xì)設(shè)計,該設(shè)計采用圖形或基于文本的形式來詳細(xì)說明內(nèi)部的數(shù)據(jù)結(jié)構(gòu)、局部接口細(xì)節(jié)和處理邏輯。設(shè)計符號包括UML圖和一些輔助表示。通過使用一系列結(jié)構(gòu)化編程結(jié)構(gòu)來說明程序的設(shè)計。構(gòu)件級設(shè)計建模每個軟件的設(shè)計都以圖形的、圖表的或基于文本的方式表示,這是構(gòu)件級設(shè)計階段產(chǎn)生的主要工作產(chǎn)品。采用設(shè)計走查或?qū)彶闄C(jī)制。對設(shè)計執(zhí)行檢查以確定數(shù)據(jù)結(jié)構(gòu)、接口、處理順序和邏輯條件等是否都正確,并且給出早期設(shè)計中與構(gòu)件相關(guān)的數(shù)據(jù)或控制變換。構(gòu)件級設(shè)計建模體系結(jié)構(gòu)設(shè)計第一次迭代完成之后,就應(yīng)該開始構(gòu)件級設(shè)計。在這個階段,全部的數(shù)據(jù)和軟件的程序結(jié)構(gòu)都已

3、經(jīng)建立起來,其目的是把設(shè)計模型轉(zhuǎn)化為運行軟件。但是現(xiàn)有設(shè)計模型的抽象層次相對較高,而可運行程序的抽象層次相對較低。這種轉(zhuǎn)化具有挑戰(zhàn)性,因為可能會在軟件過程后期階段引入難于發(fā)現(xiàn)和改正的微小錯誤。構(gòu)件級設(shè)計建模用編程語言表示構(gòu)件級設(shè)計是可以的。其實,程序的創(chuàng)建是以體系結(jié)構(gòu)設(shè)計模型作為指南的。一種可供考慮的方法是使用某些能夠容易轉(zhuǎn)化為代碼的中間表示來表示構(gòu)件級設(shè)計。無論采用何種機(jī)制來表示構(gòu)件級設(shè)計,定義的數(shù)據(jù)結(jié)構(gòu)、接口和算法應(yīng)該遵守各種已經(jīng)精心規(guī)定好的設(shè)計指導(dǎo)準(zhǔn)則,以避免在過程設(shè)計演化中犯錯誤。什么是構(gòu)件通常來講,構(gòu)件是計算機(jī)軟件中的一個模塊化的構(gòu)造塊。OMG UML規(guī)范將構(gòu)件定義為“系統(tǒng)中某一定型

4、化的、可配置的和可替換的部件,該部件封裝了實現(xiàn)并暴露一系列接口”。構(gòu)件存在于軟件體系結(jié)構(gòu)中,因而構(gòu)件在完成所建系統(tǒng)的需求和目標(biāo)中起重要作用。由于構(gòu)件駐留于軟件體系結(jié)構(gòu)的內(nèi)部,它們必須與其他的構(gòu)件和存在于軟件邊界以外的實體進(jìn)行通信和合作。面向?qū)ο蟮挠^點在面向?qū)ο筌浖こ汰h(huán)境中,構(gòu)件包括一個協(xié)作類集合。構(gòu)件中的每一個類都被詳細(xì)闡述,包括所有的屬性和與其實現(xiàn)相關(guān)的操作。作為細(xì)節(jié)設(shè)計的一部分,所有與其他設(shè)計類相互通信協(xié)作的接口必須予以定義。為了完成這些,設(shè)計師從分析模型開始,詳細(xì)描述分析類和基礎(chǔ)類。面向?qū)ο蟮挠^點考慮為一個高級印刷車間構(gòu)建軟件。軟件的目的是為了收集前臺的客戶需求,對印刷業(yè)務(wù)進(jìn)行定價,然

5、后把印刷任務(wù)交給自動生產(chǎn)設(shè)備。在需求工程中得到了一個被稱為PrintJob的分析類,如圖10-1所示。PrintJob有兩個接口:computeJob具有對任務(wù)進(jìn)行定價的功能,initiateJob能夠把任務(wù)傳給生產(chǎn)設(shè)備。面向?qū)ο蟮挠^點圖10-1設(shè)計構(gòu)件的細(xì)化面向?qū)ο蟮挠^點構(gòu)件級設(shè)計將由此開始。必須對PrintJob構(gòu)件的細(xì)節(jié)進(jìn)行細(xì)化,以提供指導(dǎo)實現(xiàn)的充分信息。通過不斷補充作為構(gòu)件PrintJob的類的全部屬性和操作,來逐步細(xì)化最初的分析類。定義為體系結(jié)構(gòu)設(shè)計組成部分的每一個構(gòu)件都要實施細(xì)化。細(xì)化一旦完成,要對每一個屬性、每一個操作和每一個接口進(jìn)行更進(jìn)一步的細(xì)化。適合每個屬性的數(shù)據(jù)結(jié)構(gòu)必須予以

6、詳細(xì)說明。另外還要說明實現(xiàn)與操作相關(guān)的處理邏輯的算法細(xì)節(jié)。最后是實現(xiàn)接口所需機(jī)制的設(shè)計。對于面向?qū)ο筌浖€包含對實現(xiàn)系統(tǒng)內(nèi)部對象間消息通信機(jī)制的描述。傳統(tǒng)觀點在傳統(tǒng)軟件工程環(huán)境中,一個構(gòu)件就是程序的一個功能要素,程序由處理邏輯及實現(xiàn)處理邏輯所需的內(nèi)部數(shù)據(jù)結(jié)構(gòu)以及能夠保證構(gòu)件被調(diào)用和實現(xiàn)數(shù)據(jù)傳遞的接口構(gòu)成。傳統(tǒng)構(gòu)件也被稱為模塊,作為軟件體系結(jié)構(gòu)的一部分,它承擔(dān)如下三個重要角色之一:(1)控制構(gòu)件,協(xié)調(diào)問題域中所有其他構(gòu)件的調(diào)用;(2)問題域構(gòu)件,完成部分或全部用戶的需求;(3)基礎(chǔ)設(shè)施構(gòu)件,負(fù)責(zé)完成問題域中所需相關(guān)處理的功能。傳統(tǒng)觀點與面向?qū)ο蟮臉?gòu)件相類似,傳統(tǒng)的軟件構(gòu)件也來自于分析模型。不同

7、的是在該種情況下,是以分析模型中的數(shù)據(jù)流要素作為導(dǎo)出構(gòu)件的基礎(chǔ)。數(shù)據(jù)流圖最低層的每個變換都被映射為某一層次上的模塊。一般來講,控制構(gòu)件位于層次結(jié)構(gòu)頂層附近,而問題域構(gòu)件則傾向位于層次結(jié)構(gòu)的底層。為了獲得有效的模塊化,在構(gòu)件細(xì)化過程中采用了功能獨立性的設(shè)計概念。傳統(tǒng)觀點再來考慮為一個高級影印中心構(gòu)建軟件。在分析模型建立過程中導(dǎo)出一組數(shù)據(jù)流圖。假設(shè)這些數(shù)據(jù)流圖已經(jīng)被映射到圖10-2中所顯示的體系結(jié)構(gòu)中。圖中每個方框都表示一個軟件構(gòu)件。傳統(tǒng)觀點圖10-2 一個傳統(tǒng)系統(tǒng)的結(jié)構(gòu)圖傳統(tǒng)觀點考慮ComputePageCost模塊。該模塊的目的在于根據(jù)用戶提供的規(guī)格說明來計算每頁的印刷費用。為了實現(xiàn)該功能需要

8、以下數(shù)據(jù):文檔的頁數(shù),文檔的印刷份數(shù),單面或者雙面印刷,顏色,紙張大小。這些數(shù)據(jù)通過該模塊的接口傳遞給ComputePageCost。ComputePageCost根據(jù)任務(wù)量和復(fù)雜度,使用這些數(shù)據(jù)來決定一頁的費用這是一個通過接口將所有數(shù)據(jù)傳遞給模塊的功能。每一頁的費用與任務(wù)的大小成反比,與任務(wù)的復(fù)雜度成正比。傳統(tǒng)觀點圖10-3給出了使用UML建模符號描述的構(gòu)件級設(shè)計。其中ComputePageCost模塊通過調(diào)用getJobData模塊和數(shù)據(jù)庫接口accessCostDB來訪問數(shù)據(jù)。接著,對ComputePageCost模塊進(jìn)一步細(xì)化,給出算法和接口的細(xì)節(jié)描述。其中算法的細(xì)節(jié)可以由圖中顯示的偽

9、代碼或者UML活動圖來表示。接口被表示為一組輸入和輸出的數(shù)據(jù)對象或者數(shù)據(jù)項的集合。設(shè)計細(xì)化的過程需要一直進(jìn)行到獲得構(gòu)件的導(dǎo)向結(jié)構(gòu)為止。傳統(tǒng)觀點圖10-3 ComputePageCost的構(gòu)件級設(shè)計過程相關(guān)的觀點上面提及的關(guān)于構(gòu)件級設(shè)計的面向?qū)ο笥^點和傳統(tǒng)觀點,都假定從頭開始設(shè)計構(gòu)件。即設(shè)計者必須根據(jù)從分析模型中導(dǎo)出的規(guī)格說明創(chuàng)建新構(gòu)件。當(dāng)然,還存在另外一種方法。在過去的10年間,軟件工程已經(jīng)開始強(qiáng)調(diào)使用已有構(gòu)件來構(gòu)造系統(tǒng)的必要性。實際上,軟件工程師在設(shè)計過程中可以使用已經(jīng)過驗證的設(shè)計或代碼構(gòu)件的目錄。當(dāng)軟件體系結(jié)構(gòu)設(shè)計完后,就可以從目錄中選出構(gòu)件或者設(shè)計模式,并用于組裝體系結(jié)構(gòu)。由于這些構(gòu)件是

10、根據(jù)復(fù)用思想來創(chuàng)建的,所以其接口的完整描述、要實現(xiàn)的功能和需要的通信與協(xié)作等對于設(shè)計者來說都是可以得到的。設(shè)計基于類的構(gòu)件構(gòu)件級設(shè)計利用了分析模型開發(fā)的信息和體系結(jié)構(gòu)模型表示的信息。當(dāng)選擇了面向?qū)ο筌浖こ谭椒ê?,?gòu)件級設(shè)計主要關(guān)注分析類的細(xì)化和基礎(chǔ)類的定義和精化。這些類的屬性、操作和接口的詳細(xì)描述是開始構(gòu)建活動之前所需的設(shè)計細(xì)節(jié)?;驹O(shè)計原則有四種適用于構(gòu)件級設(shè)計的基本設(shè)計原則,這些原則在使用面向?qū)ο筌浖こ谭椒〞r被廣泛采用。使用這些原則的根本動機(jī)在于,使得產(chǎn)生的設(shè)計在發(fā)生變更時能夠適應(yīng)變更并且減少副作用的傳播。開關(guān)原則(OCP):模塊應(yīng)該對外延具有開放性,對修改具有封閉性。簡單地說,設(shè)計者

11、應(yīng)該采用一種無需對構(gòu)件自身內(nèi)部做修改就可以進(jìn)行擴(kuò)展的方式來說明構(gòu)件。SAFEHOME實例500SAFEHOME實例51圖10-4 遵循OCP原則基本設(shè)計原則Liskov替換原則(LSP):“子類可以替換它們的基類”。最早提出該原則的LIS88建議,將子類傳遞給構(gòu)件來代替基類時,使用基類的構(gòu)件應(yīng)該仍然能夠正確完成其功能。LSP原則要求源自基類的任何子類必須遵守基類與使用該基類的構(gòu)件之間的隱含約定。基本設(shè)計原則依賴倒置原則(DIP):“依賴于抽象,而非具體實現(xiàn)”。抽象可以比較容易地對設(shè)計進(jìn)行擴(kuò)展,又不會導(dǎo)致大的混亂。構(gòu)件依賴的具體構(gòu)件越多,其擴(kuò)展起來就越困難。接口分離原則(ISP):“多個用戶專用

12、接口比一個通用接口要好”。多個客戶構(gòu)件使用一個服務(wù)器類提供的操作的實例很多。ISP原則建議設(shè)計者應(yīng)該為每一個主要的客戶類型都設(shè)計一個特定的接口。只有那些與特定客戶類型相關(guān)的操作,才應(yīng)該出現(xiàn)在該客戶的接口說明中。如果多個客戶要求相同的操作,則這些操作應(yīng)該在每一個特定的接口中都加以說明。基本設(shè)計原則發(fā)布復(fù)用等價性原則:”復(fù)用的粒度就是發(fā)布的粒度”。當(dāng)類或構(gòu)件被設(shè)計用以復(fù)用時,在可復(fù)用實體的開發(fā)者和使用者之間就建立了一種隱含的約定關(guān)系。開發(fā)者承諾建立一個發(fā)布控制系統(tǒng),用來支持和維護(hù)實體的各種老版本,同時用戶緩慢地將其升級到最新版本。明智的方法是將可復(fù)用的類分組打包成能夠管理和控制的包作為一個更新的版

13、本,而不是對每個類分別進(jìn)行升級。基本設(shè)計原則共同封裝原則:”一同變更的類應(yīng)該合在一起”。類應(yīng)該根據(jù)其內(nèi)聚性進(jìn)行打包。即當(dāng)類被打包成設(shè)計的一部分時,它們應(yīng)該處理相同的功能或者行為域。當(dāng)域的一些特征必須變更時,只有那些包中的類才有可能需要修改。這樣可以進(jìn)行更加有效的變更控制和發(fā)布管理。基本設(shè)計原則共同復(fù)用原則:”不能一起復(fù)用的類不能被分到一組”。當(dāng)包中的一個或者多個類變更時,包的發(fā)布版本數(shù)量也會發(fā)生。所有那些依賴于已經(jīng)發(fā)生變更的包的類或者包,都必須升級到最新的版本,并且都需要進(jìn)行測試以保證新發(fā)布的版本能夠無故障運轉(zhuǎn)。如果類沒有根據(jù)內(nèi)聚性進(jìn)行分組,那么這個包中與其他類無關(guān)聯(lián)的類有可能會發(fā)生變更,而這

14、往往會導(dǎo)致進(jìn)行沒有必要的集成和測試。因此,只有那些一起被復(fù)用的類才應(yīng)該包含在一個包中。構(gòu)件級設(shè)計指導(dǎo)方針構(gòu)件。對那些已經(jīng)被確定為體系結(jié)構(gòu)模型一部分的構(gòu)件應(yīng)該建立命名約定,并對其做進(jìn)一步的細(xì)化和精化,使其成為構(gòu)件級模型的一部分。體系結(jié)構(gòu)構(gòu)件的名字來源于問題域,并且應(yīng)該能夠被查看體系結(jié)構(gòu)模型的所有共利益者理解。在詳細(xì)設(shè)計層面使用構(gòu)造型幫助識別構(gòu)件的特性也很有價值。構(gòu)件級設(shè)計指導(dǎo)方針接口。接口提供關(guān)于通信和協(xié)作的重要信息。然而接口表示的隨意性會使構(gòu)件圖趨于復(fù)雜化。AMB02建議:(1)當(dāng)構(gòu)件圖變得復(fù)雜時,在較正式的UML框和虛箭頭記號方法中使用接口的棒棒糖式記號;(2)為了保持一致,接口都放在構(gòu)件框

15、的左邊;(3)即使其他的接口也適用,也只表示出那些與構(gòu)件相關(guān)的接口。依賴與繼承。為了提高可讀性,依賴關(guān)系是自左向右,繼承關(guān)系是自下而上。另外,構(gòu)件之間的依賴關(guān)系通過接口來表示,而不是采用“構(gòu)件到構(gòu)件”的方法來表示。遵照OCP的思想,這種方法使得系統(tǒng)更易于維護(hù)。內(nèi)聚性內(nèi)聚性意味著構(gòu)件或者類只封裝那些相互關(guān)聯(lián)密切,以及與構(gòu)件或類自身有密切關(guān)系的屬性和操作。LET01定義了許多不同類型的內(nèi)聚性。內(nèi)聚性功能內(nèi)聚分層內(nèi)聚通信內(nèi)聚順序內(nèi)聚過程內(nèi)聚暫時內(nèi)聚實用內(nèi)聚耦合性耦合性是類之間彼此聯(lián)系程度的一種定性度量。隨著類相互依賴越來越多。類之間的耦合程度亦會增加。在構(gòu)件級設(shè)計中,一個重要的目標(biāo)就是盡可能保持低耦

16、合。LET01定義了如下耦合分類:耦合性內(nèi)容耦合共用耦合控制耦合印記耦合數(shù)據(jù)耦合例程調(diào)用耦合類型使用耦合包含或者導(dǎo)入耦合外部耦合實施構(gòu)件級設(shè)計構(gòu)件級設(shè)計本質(zhì)上是細(xì)化的。設(shè)計者必須將分析模型和架構(gòu)模型中的信息轉(zhuǎn)化為一種設(shè)計表示,這種表示提供了用來指導(dǎo)構(gòu)建活動的充分信息。實施構(gòu)件級設(shè)計步驟1:標(biāo)識出所有與問題域相對應(yīng)的類。使用分析模型和架構(gòu)模型,每個分析類和體系結(jié)構(gòu)構(gòu)件都要細(xì)化。步驟2:確定所有與基礎(chǔ)設(shè)施域相對應(yīng)的設(shè)計類。在分析模型中并沒有描述這些類,并且在體系結(jié)構(gòu)設(shè)計中也經(jīng)常忽略這些類,但是此時必須對它們進(jìn)行描述。這種類型的類和構(gòu)件包括GUI構(gòu)件、操作系統(tǒng)構(gòu)件、對象和數(shù)據(jù)管理構(gòu)件等。實施構(gòu)件級設(shè)

17、計步驟3:細(xì)化所有不能作為復(fù)用構(gòu)件的設(shè)計類。詳細(xì)描述實現(xiàn)類需要的所有接口、屬性和操作。在實現(xiàn)這個任務(wù)時,必須考慮采用設(shè)計試探法。步驟3a:在類或構(gòu)件的協(xié)作時說明消息的細(xì)節(jié)。分析模型中用協(xié)作圖來顯示分析類之間的相互協(xié)作。在構(gòu)件級設(shè)計過程中,某些情況下通過對系統(tǒng)中對象間傳遞消息的結(jié)構(gòu)進(jìn)行說明,來表現(xiàn)協(xié)作細(xì)節(jié)是必要的。這可作為接口規(guī)格說明的前提,這些接口顯示了系統(tǒng)中構(gòu)件通信和協(xié)作的方式。實施構(gòu)件級設(shè)計圖10-6給出了前述印刷系統(tǒng)的一個簡單協(xié)作圖。ProductionJob、WorkOrder和JobQueue三個對象相互協(xié)作為生產(chǎn)線準(zhǔn)備印刷作業(yè)。圖中的箭頭表示對象間傳遞的消息。隨著設(shè)計的進(jìn)行,消息通

18、過下列方式的擴(kuò)展語法來細(xì)化:guard condition sequence expression(return value):=message name(argument list)實施構(gòu)件級設(shè)計圖10-6 帶消息的協(xié)作圖實施構(gòu)件級設(shè)計guard condition采用對象約束語言O(shè)CL來書寫,并且說明了在消息發(fā)出之前應(yīng)該滿足什么樣的條件集合;Sequence expression是一個表明消息發(fā)送序號的整數(shù)或其他樣式的表明發(fā)送順序的指示符;(return value)是由消息喚醒操作返回的信息名;message name表示喚醒的操作,(argument list)是傳遞給操作的屬性列表。

19、實施構(gòu)件級設(shè)計步驟3b:為每一個構(gòu)件確定適當(dāng)?shù)慕涌?。在?gòu)件級設(shè)計中,一個UML接口是“一組外部可見的(即公共的)操作。接口不包括內(nèi)部結(jié)構(gòu),沒有屬性,沒有關(guān)聯(lián)。接口是某個抽象類的等價物,該抽象類提供了設(shè)計類之間的可控連接。實際上,為設(shè)計類定義的操作可以歸結(jié)為一個或者更多的抽象類。抽象類內(nèi)的每個操作應(yīng)該是內(nèi)聚的,即它應(yīng)該展示那些關(guān)注于一個有限功能或者子功能的處理。實施構(gòu)件級設(shè)計參照圖10-1,由于initiateJob接口沒有展現(xiàn)出足夠的內(nèi)聚性而受到爭議。實際上,它完成三個不同的子功能:建立工作單,檢查任務(wù)的優(yōu)先級,并將任務(wù)傳遞給生產(chǎn)線。接口設(shè)計應(yīng)該重構(gòu)。一種方法是重新檢查設(shè)計類并定義一個新類Wo

20、rkOrder,該類用來處理與裝配工作單相關(guān)的所有活動。buildWorkOrder()操作成為該類的一部分。另外可能要定義一個合并了操作checkPriority()的JobQueue類。ProductionJob類包括傳遞給生產(chǎn)線的生產(chǎn)任務(wù)的所有相關(guān)信息。initiateJob接口將采用圖10-7所示的形式。initiateJob現(xiàn)在是內(nèi)聚的,集中在一個功能上。與ProductionJob、WorkOrder和JobQueue相關(guān)的接口都是近乎專誠的。實施構(gòu)件級設(shè)計圖10-7 為PrintJob重構(gòu)接口和類定義實施構(gòu)件級設(shè)計步驟3c:細(xì)化屬性并且定義相應(yīng)的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)。UML采用下面

21、的語法來定義屬性的數(shù)據(jù)類型:name:type-expression=initial-valueproperty string其中name是屬性名,type expression是數(shù)據(jù)類型;initial-value是創(chuàng)建對象時屬性的初始值;property string用于定義屬性的特征或特性。實施構(gòu)件級設(shè)計在構(gòu)件級設(shè)計的第一輪迭代中,屬性通常用名字來描述。隨著設(shè)計的進(jìn)一步細(xì)化,使用UML的屬性格式注釋來定義每一個屬性。如可以下列方式來定義paperType-weight:paperType-weight:string=“A”contains 1 of 4 values A,B,C or D

22、如果某一屬性在多個設(shè)計類中重復(fù)出現(xiàn),并且其自身具有比較復(fù)雜的結(jié)構(gòu),最好是為這個屬性創(chuàng)建一個單獨的類。實施構(gòu)件級設(shè)計步驟3d:詳細(xì)描述每個操作中的處理流??梢杂昧鞒虉D、偽代碼或者UML活動圖來完成。每個軟件構(gòu)件都需要應(yīng)用逐步求精概念通過大量的迭代進(jìn)行細(xì)化。第一輪迭代中,將每個操作都定義為設(shè)計類的一部分。任何情況下,操作應(yīng)該采用確保高內(nèi)聚性的方式來刻畫;即,一個操作應(yīng)該完成單一的目標(biāo)功能或者子功能。接下來的一輪迭代,只是完成對操作名的詳細(xì)擴(kuò)展。如對圖10-1中的操作computePaperCost()可以采用如下方式進(jìn)行擴(kuò)展:computePaperCost(weight,size,color):

23、numeric實施構(gòu)件級設(shè)計如果實現(xiàn)computePaperCost()的算法簡單而且易于理解,則沒有必要開展進(jìn)一步的設(shè)計細(xì)化。軟件編碼人員將會提供實現(xiàn)這些操作的必要細(xì)節(jié)。如果算法比較復(fù)雜或者難于理解,則需要進(jìn)行設(shè)計細(xì)化。圖10-8給出了操作computePaperCost()的一個UML活動圖。當(dāng)活動圖用于構(gòu)件級設(shè)計的規(guī)格說明時,通常都在比源碼更高的抽象級上表示。另外,還可以在設(shè)計規(guī)格說明中使用偽代碼。實施構(gòu)件級設(shè)計圖10-8 computePaperCost()操作的UML活動圖實施構(gòu)件級設(shè)計步驟4:說明持久數(shù)據(jù)源(數(shù)據(jù)庫和文件)并確定管理數(shù)據(jù)源所需要的類。數(shù)據(jù)庫和文件通常都凌架于單獨的構(gòu)

24、件設(shè)計描述之上。在多數(shù)情況下,這些持久數(shù)據(jù)存儲起初都被指定為體系結(jié)構(gòu)設(shè)計的一部分,然而,隨著設(shè)計細(xì)化過程的不斷深入,提供關(guān)于這些持久數(shù)據(jù)源的結(jié)構(gòu)和組織等額外細(xì)節(jié)常常是有用的。實施構(gòu)件級設(shè)計步驟5:開發(fā)并且細(xì)化類或構(gòu)件的行為表示。UML狀態(tài)圖被用作分析模型的一部分,以表示系統(tǒng)的外部可觀察的行為和更多的分析類個體的局部行為。在構(gòu)件級設(shè)計過程中,有些時候?qū)υO(shè)計類的行為進(jìn)行建模是必要的。對象(程序執(zhí)行時的設(shè)計類實例)的動態(tài)行為受到外部事件和對象當(dāng)前狀態(tài)(行為方式)的影響。為了理解對象的動態(tài)行為,設(shè)計者必須檢查設(shè)計類生命周期中所有相關(guān)的用例,這些用例提供的信息可以幫助設(shè)計者描繪影響對象的事件,以及隨著時

25、間流逝和事件的發(fā)生對象所處的狀態(tài)。圖10-9描述了使用UML狀態(tài)圖表示的狀態(tài)之間的轉(zhuǎn)換。實施構(gòu)件級設(shè)計圖10-9 PrintJob類的狀態(tài)圖實施構(gòu)件級設(shè)計從一種狀態(tài)到另一種狀態(tài)的轉(zhuǎn)換,都表示為如下形式的事件序列:event-name(parameter-list)guard-conditon/action expression其中event-name表示事件;parameter-list包含了與事件相關(guān)的數(shù)據(jù);guard-condition采用對象約束語言書寫,并描述了一個在事件發(fā)生前必須滿足的條件,action expression定義了一個狀態(tài)轉(zhuǎn)換時發(fā)生的動作。針對狀態(tài)的進(jìn)入和離開兩種情形

26、,每個狀態(tài)都可以定義entry/和exit/兩個動作。多數(shù)情況下,這些動作與正在建模的類的相關(guān)操作相對應(yīng)。do/指示符提供了一種機(jī)制,用來顯示伴隨此種狀態(tài)的相關(guān)活動;而include/指示符則提供了通過在狀態(tài)定義中嵌入更多狀態(tài)圖細(xì)節(jié)的方式細(xì)化的手段。實施構(gòu)件級設(shè)計行為模型經(jīng)常包含一些在其他設(shè)計模型中不明顯的信息。例如,通過仔細(xì)查看圖10-9中的狀態(tài)圖可以知道,當(dāng)?shù)贸鲇∷⑷蝿?wù)的價錢和進(jìn)度數(shù)據(jù)時,PrintJob類的動態(tài)行為取決于用戶對此是否認(rèn)可。如果沒有同意,印刷工作就不能提交,因為不可能到達(dá)submittingJob狀態(tài)。實施構(gòu)件級設(shè)計步驟6:細(xì)化部署圖以提供額外的實現(xiàn)細(xì)節(jié)。部署圖用作體系結(jié)構(gòu)

27、設(shè)計的一部分,并且部署圖采用描述符形式來表示。在這種表示形式中,主要的系統(tǒng)功能都表示在容納這些功能的計算環(huán)境中。在構(gòu)件級設(shè)計過程中,部署圖應(yīng)該被細(xì)化以表示主要構(gòu)件包的位置。然而,構(gòu)件一般在構(gòu)件圖中不被單獨表示,目的在于避免圖的復(fù)雜性。某些情況下,部署圖在這個時候被細(xì)化成實例形式。這意味著指定的硬件和要使用的操作系統(tǒng)環(huán)境應(yīng)加以說明,而構(gòu)件包在這個環(huán)境中的位置等也需要指出。實施構(gòu)件級設(shè)計步驟7:考慮每一個構(gòu)件級設(shè)計表示,并且時刻考慮其他選擇。設(shè)計是一個迭代過程。創(chuàng)建的第一個構(gòu)件級模型總沒有迭代N次之后得到的模型那么全面、一致或精確。在進(jìn)行設(shè)計工作時,重構(gòu)是十分必要的。設(shè)計中經(jīng)常存在其他的設(shè)計方案,

28、在沒有決定最終設(shè)計模型之前,最好的設(shè)計師會考慮所有(或大部分)的方案,并且仔細(xì)考慮和分析這些方案。對象約束語言作為UML一部分的各種圖為設(shè)計得提供了豐富的設(shè)計模型表示形式。然而,圖形表示往往是不夠的,設(shè)計者還需要一種機(jī)制,以明確和規(guī)范地表示那些可以約束設(shè)計模型元素的信息。對象約束語言O(shè)CL通過允許軟件工程師使用形式化的語法和文法構(gòu)建各種設(shè)計模型元素(如類和對象、事件、消息、接口),利用這些無歧義描述語句作為UML的補充。對象約束語言最簡單的OCL語言語句由四個部分組成:(1)語境(context)定義了哪些情況語句是正確的;(2)特性(property)描述語境的一些特征(如,如果語境是一個類

29、,那么特性可能就是一個屬性);(3)操作(operation)用來操縱和限定一個特性(如,算術(shù)運算、集合運算等);(4)關(guān)鍵字(keyword)用于說明條件表達(dá)式。對象約束語言作為OCL表達(dá)式的一個例子,假設(shè)在PrintJob類的狀態(tài)圖中,在一個能夠引起computingJobCost與formingJob之間狀態(tài)轉(zhuǎn)換的jobCostAccepted事件上有一個警戒條件。在圖中,警戒條件以自然語言的形式表達(dá),并且意味著只有當(dāng)客戶有權(quán)批準(zhǔn)任務(wù)的報價時這個授權(quán)才會發(fā)生。在OCL中,可以采用如下方式來描述這個表達(dá)式:customer self.authorizationAuthority=yesCu

30、stomer類(實際是類的一個特定實例)的一個布爾屬性authorizationAuthority必須被設(shè)為yes,才滿足警戒條件。對象約束語言在創(chuàng)建設(shè)計模型時,經(jīng)常有一些實例在完成設(shè)計規(guī)定的動作之前必須滿足它們的前置條件或后置條件。OCL提供了一個強(qiáng)有力的工具,以形式化的方式說明前置和后置條件。例如,假設(shè)印刷車間系統(tǒng)要進(jìn)行擴(kuò)展,在說明其他印刷任務(wù)特性的同時,客戶提供了印刷任務(wù)價格上限和交付的最后期限。如果印刷價格與交付時間超過其上限,任務(wù)就不能被提交并且必須通知客戶。在OCL中,可以采用如下方式來說明一系列前置條件和后置條件:對象約束語言對象約束語言該OCL語句定義一個不變量也就是必須在一些行為之前(pre)和之后(post)存在的條件。開始的時候,前置條件建立了一個由客戶指定的價格上限和交付期限,并且任務(wù)授權(quán)必須設(shè)置為”no”。確定價格上限和交付期限之后,將應(yīng)用后置條件。還需要注意的是,表達(dá)式self.jobAuthorization=yes并不是用來設(shè)置”yes”值,而是聲明在操作結(jié)束時必須將jobAuthorization設(shè)置為”yes”。設(shè)計傳統(tǒng)構(gòu)件傳統(tǒng)軟件構(gòu)件的構(gòu)件級設(shè)計基礎(chǔ)在20世紀(jì)60年代已經(jīng)形成,Dijkstra

溫馨提示

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

評論

0/150

提交評論