軟件工程導論第11章_第1頁
軟件工程導論第11章_第2頁
軟件工程導論第11章_第3頁
軟件工程導論第11章_第4頁
軟件工程導論第11章_第5頁
已閱讀5頁,還剩92頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1第第11章章 面向?qū)ο笤O計面向?qū)ο笤O計 面向?qū)ο蟮脑O計原則面向?qū)ο蟮脑O計原則 系統(tǒng)設計系統(tǒng)設計 對象設計對象設計 設計模式設計模式 RUP的設計活動的設計活動 RUP的實現(xiàn)活動的實現(xiàn)活動211.1 面向?qū)ο蟮脑O計概念及原則面向?qū)ο蟮脑O計概念及原則 1、有關(guān)概念、有關(guān)概念 面向?qū)ο笤O計將面向?qū)ο蠓治鰟?chuàng)建的分析面向?qū)ο笤O計將面向?qū)ο蠓治鰟?chuàng)建的分析模型變換為設計模型,它將作為軟件構(gòu)造的藍圖。模型變換為設計模型,它將作為軟件構(gòu)造的藍圖。但由于面向?qū)ο蠓治雠c設計活動是一個迭代與演但由于面向?qū)ο蠓治雠c設計活動是一個迭代與演化的過程,概念與表示方法的一致性使得分析與化的過程,概念與表示方法的一致性使得分析

2、與設計階段平滑過渡。設計階段平滑過渡。 傳統(tǒng)的設計方法將問題域分解成一系列任傳統(tǒng)的設計方法將問題域分解成一系列任務來完成,這些任務形成過程式軟件的基本結(jié)構(gòu)。務來完成,這些任務形成過程式軟件的基本結(jié)構(gòu)。面向?qū)ο蠓椒ò褑栴}域作為一系列相互作用的對面向?qū)ο蠓椒ò褑栴}域作為一系列相互作用的對象,在此基礎上構(gòu)造出基于對象的軟件系統(tǒng)結(jié)構(gòu)。象,在此基礎上構(gòu)造出基于對象的軟件系統(tǒng)結(jié)構(gòu)。 3 面向?qū)ο笤O計包括:面向?qū)ο笤O計包括: (1)系統(tǒng)設計)系統(tǒng)設計 設計系統(tǒng)體系結(jié)構(gòu),實現(xiàn)分布式協(xié)同計設計系統(tǒng)體系結(jié)構(gòu),實現(xiàn)分布式協(xié)同計算和資源利用。算和資源利用。 對象的儲存。對象的儲存。 用戶界面。用戶界面。 (2)對象(

3、類)設計對象(類)設計 對象設計是根據(jù)具體的實現(xiàn)策略,對分對象設計是根據(jù)具體的實現(xiàn)策略,對分析模型進行細化與擴充。析模型進行細化與擴充。 通過系統(tǒng)設計和對象設計產(chǎn)生設計模型,通過系統(tǒng)設計和對象設計產(chǎn)生設計模型,是進一步完成系統(tǒng)實現(xiàn)的基礎。是進一步完成系統(tǒng)實現(xiàn)的基礎。4 2、OO設計原則設計原則 (1)(1)封裝封裝 是將一個完整的概念組成一個獨立的單元,然后通過是將一個完整的概念組成一個獨立的單元,然后通過一個名字來引用它。在一個名字來引用它。在OO系統(tǒng)的較高層次,將一些相關(guān)系統(tǒng)的較高層次,將一些相關(guān)的應用問題封裝在一個子系統(tǒng)中,對子系統(tǒng)的訪問是通過的應用問題封裝在一個子系統(tǒng)中,對子系統(tǒng)的訪問

4、是通過訪問子系統(tǒng)的接口實現(xiàn)的;在較低的層次將具體對象的屬訪問子系統(tǒng)的接口實現(xiàn)的;在較低的層次將具體對象的屬性和操作封裝在一個對象類中,通過類的接口訪問其屬性。性和操作封裝在一個對象類中,通過類的接口訪問其屬性。 (2 2)抽象)抽象 OO方法不僅支持過程抽象還支持數(shù)據(jù)抽象。類封裝方法不僅支持過程抽象還支持數(shù)據(jù)抽象。類封裝了數(shù)據(jù)和操作數(shù)據(jù)的方法,類是一種包含過程抽象的數(shù)據(jù)了數(shù)據(jù)和操作數(shù)據(jù)的方法,類是一種包含過程抽象的數(shù)據(jù)抽象,它對外提供的公共數(shù)據(jù)接口構(gòu)成了類的規(guī)格說明抽象,它對外提供的公共數(shù)據(jù)接口構(gòu)成了類的規(guī)格說明(類的協(xié)議)。使用者無需知道類中的具體操作是如何實(類的協(xié)議)。使用者無需知道類中

5、的具體操作是如何實現(xiàn)的,無需了解內(nèi)部數(shù)據(jù)的具體表現(xiàn)方式,只要搞清它的現(xiàn)的,無需了解內(nèi)部數(shù)據(jù)的具體表現(xiàn)方式,只要搞清它的規(guī)格說明,就可通過接口定義的操作訪問類的數(shù)據(jù)。規(guī)格說明,就可通過接口定義的操作訪問類的數(shù)據(jù)。5 (3)信息隱蔽)信息隱蔽 信息隱蔽是通過對象的封裝實現(xiàn)的。類的結(jié)構(gòu)分離信息隱蔽是通過對象的封裝實現(xiàn)的。類的結(jié)構(gòu)分離了接口和實現(xiàn),對于類的使用者來說,屬性的表示和操了接口和實現(xiàn),對于類的使用者來說,屬性的表示和操作的實現(xiàn)都是隱蔽的。作的實現(xiàn)都是隱蔽的。 (4 4)強內(nèi)聚)強內(nèi)聚 服務內(nèi)聚服務內(nèi)聚: 一個服務完成且僅完成一個功能。一個服務完成且僅完成一個功能。 類內(nèi)聚類內(nèi)聚: 一個類的屬

6、性和操作全部都是完成某個一個類的屬性和操作全部都是完成某個任務所必須的,其中不包括無用的屬性和操作。任務所必須的,其中不包括無用的屬性和操作。 層內(nèi)聚層內(nèi)聚: 把向用戶或高層提供相關(guān)服務的功能放把向用戶或高層提供相關(guān)服務的功能放在一起,而將其他內(nèi)容排除在外。為了保證適當?shù)膶觾?nèi)在一起,而將其他內(nèi)容排除在外。為了保證適當?shù)膶觾?nèi)聚,往往有嚴格的層次結(jié)構(gòu),高層能夠訪問低層的服務,聚,往往有嚴格的層次結(jié)構(gòu),高層能夠訪問低層的服務,而低層卻不能訪問高層的服務(下圖描述了這種關(guān)系)。而低層卻不能訪問高層的服務(下圖描述了這種關(guān)系)。 6用戶界面用戶界面應用邏輯應用邏輯訪問操作訪問操作系統(tǒng)系統(tǒng)訪問數(shù)訪問數(shù)據(jù)庫

7、據(jù)庫網(wǎng)絡通信網(wǎng)絡通信應用程序的典型層次應用程序的典型層次處理應用協(xié)議處理應用協(xié)議處理連接處理連接處理包處理包傳輸和接收傳輸和接收通信系統(tǒng)中的簡化層次通信系統(tǒng)中的簡化層次7 層內(nèi)聚的優(yōu)點如下:層內(nèi)聚的優(yōu)點如下: 替換高層模塊對低層模塊沒有影響。替換高層模塊對低層模塊沒有影響。 可以用等價的層替換低層,但必須復制該層所有可以用等價的層替換低層,但必須復制該層所有的的API,這樣高層才不受影響。,這樣高層才不受影響。 其他有關(guān)傳統(tǒng)方法中的功能內(nèi)聚、通信內(nèi)聚、順其他有關(guān)傳統(tǒng)方法中的功能內(nèi)聚、通信內(nèi)聚、順序內(nèi)聚、時間內(nèi)聚等概念及提高內(nèi)聚的原則在序內(nèi)聚、時間內(nèi)聚等概念及提高內(nèi)聚的原則在OO設計設計中仍然適

8、用。中仍然適用。8 (5)弱耦合)弱耦合 OO設計中,耦合主要指不同對象(包括類、包)設計中,耦合主要指不同對象(包括類、包)之間相互關(guān)聯(lián)的程度,如果一個對象過多地依賴于其之間相互關(guān)聯(lián)的程度,如果一個對象過多地依賴于其它對象來完成自己的工作,不僅使系統(tǒng)的可理解性下它對象來完成自己的工作,不僅使系統(tǒng)的可理解性下降,還會增加測試、修改的難度,同時降低了類的可降,還會增加測試、修改的難度,同時降低了類的可復用性和可移植性。但對象不可能完全孤立,當兩個復用性和可移植性。但對象不可能完全孤立,當兩個對象必須相互聯(lián)系時,只通過類的公共接口實現(xiàn)耦合,對象必須相互聯(lián)系時,只通過類的公共接口實現(xiàn)耦合,不應該依賴

9、于類的具體實現(xiàn)細節(jié)。不應該依賴于類的具體實現(xiàn)細節(jié)。 設計時盡量減少對象之間發(fā)送的消息數(shù)(設計時盡量減少對象之間發(fā)送的消息數(shù)(Meyer建議的建議的少接口少接口),減少消息中的參數(shù)個數(shù)(),減少消息中的參數(shù)個數(shù)(小接口小接口),),對象之間以明顯和直接的方式通信,減少通信的復雜對象之間以明顯和直接的方式通信,減少通信的復雜程度(程度(顯式的接口顯式的接口)。傳統(tǒng)方法中有關(guān)降低耦合的原)。傳統(tǒng)方法中有關(guān)降低耦合的原則在則在OO方法中仍然適用。方法中仍然適用。 9 (6)可復用)可復用 為了提高工作效率、減少錯誤、降低成本,就要充分考為了提高工作效率、減少錯誤、降低成本,就要充分考慮軟件的復用性。復

10、用有兩個方面的含義:一是盡量使用已慮軟件的復用性。復用有兩個方面的含義:一是盡量使用已有的類,包括開發(fā)環(huán)境提供的類庫和已有的相似類。二是創(chuàng)有的類,包括開發(fā)環(huán)境提供的類庫和已有的相似類。二是創(chuàng)建新類時考慮將來的可復用性。建新類時考慮將來的可復用性。 類有三種復用方式:類有三種復用方式: 實例復用實例復用 由于類的封裝特性,使用者不需要了解內(nèi)部的實現(xiàn)細節(jié)由于類的封裝特性,使用者不需要了解內(nèi)部的實現(xiàn)細節(jié)就可用適當?shù)臉?gòu)造函數(shù)創(chuàng)建需要的實例,然后向所創(chuàng)建的實就可用適當?shù)臉?gòu)造函數(shù)創(chuàng)建需要的實例,然后向所創(chuàng)建的實例發(fā)送適當?shù)南?,啟動相應的服務,完成需要的任務。例發(fā)送適當?shù)南ⅲ瑔酉鄳姆眨瓿尚枰娜?/p>

11、務。 設計一個可復用性好的類是一件很困難的事情,因為,設計一個可復用性好的類是一件很困難的事情,因為,類提供的服務太多,會增加接口的復雜度,降低類的可理解類提供的服務太多,會增加接口的復雜度,降低類的可理解性;提供的服務太少,則可能會降低復用性。在設計時,需性;提供的服務太少,則可能會降低復用性。在設計時,需要根據(jù)具體的應用環(huán)境和以往的經(jīng)驗來綜合考慮,設計出合要根據(jù)具體的應用環(huán)境和以往的經(jīng)驗來綜合考慮,設計出合適的類構(gòu)件。適的類構(gòu)件。 10 繼承復用繼承復用 當已有的類構(gòu)件不能通過實例復用滿足要求時,可當已有的類構(gòu)件不能通過實例復用滿足要求時,可以通過繼承復用對已有的類構(gòu)件進行修改,使它滿足要

12、以通過繼承復用對已有的類構(gòu)件進行修改,使它滿足要求。在設計時,關(guān)鍵是要設計一個合理的、具有一定深求。在設計時,關(guān)鍵是要設計一個合理的、具有一定深度的類構(gòu)件的繼承層次結(jié)構(gòu)。每個子類在繼承父類的屬度的類構(gòu)件的繼承層次結(jié)構(gòu)。每個子類在繼承父類的屬性和服務的基礎上,加入少量的新屬性和新服務,這樣性和服務的基礎上,加入少量的新屬性和新服務,這樣做的好處是父子類的耦合度比較適當,接口簡單,易于做的好處是父子類的耦合度比較適當,接口簡單,易于理解。理解。 多態(tài)復用多態(tài)復用 多態(tài)是一種特性,這種特性使得一個屬性或變量在多態(tài)是一種特性,這種特性使得一個屬性或變量在不同的時期可以表示不同的對象。利用多態(tài)性可以使對

13、不同的時期可以表示不同的對象。利用多態(tài)性可以使對象的對外接口更加一般化,系統(tǒng)運行時,根據(jù)接收消息象的對外接口更加一般化,系統(tǒng)運行時,根據(jù)接收消息的對象類型,由多態(tài)機制啟動正確的方法,響應一個一的對象類型,由多態(tài)機制啟動正確的方法,響應一個一般化的消息。般化的消息。11 例如出現(xiàn)下列情況:例如出現(xiàn)下列情況: 操作與數(shù)據(jù)結(jié)構(gòu)大小有關(guān)。操作與數(shù)據(jù)結(jié)構(gòu)大小有關(guān)。 操作與外部設備特性有關(guān)。操作與外部設備特性有關(guān)。 實現(xiàn)算法將來可能會改進。實現(xiàn)算法將來可能會改進。 為了克服與表示方法、數(shù)據(jù)結(jié)構(gòu)或硬件特點相關(guān)的操為了克服與表示方法、數(shù)據(jù)結(jié)構(gòu)或硬件特點相關(guān)的操作給復用帶來的困難,可以設計一個基類把與上述操作有

14、作給復用帶來的困難,可以設計一個基類把與上述操作有關(guān)的服務定義為純虛函數(shù),然后在復用時先派生出一個新關(guān)的服務定義為純虛函數(shù),然后在復用時先派生出一個新類,在新類中重新定義上述操作的算法。類,在新類中重新定義上述操作的算法。 設計一個可復用的軟件比設計一個普通軟件的代價要設計一個可復用的軟件比設計一個普通軟件的代價要高,但隨著這些軟件被復用的次數(shù)的增加,分攤到它的設高,但隨著這些軟件被復用的次數(shù)的增加,分攤到它的設計和實現(xiàn)成本就會降低。計和實現(xiàn)成本就會降低。 12 (7)簡潔化設計)簡潔化設計 一個軟件一個軟件60的工作量是維護工作。為了便于維護,的工作量是維護工作。為了便于維護,現(xiàn)代軟件工程越

15、來越重視軟件的簡潔和易于理解。做好現(xiàn)代軟件工程越來越重視軟件的簡潔和易于理解。做好以下幾點:以下幾點: 設計簡單的類。避免定義太多的屬性和服務。一個設計簡單的類。避免定義太多的屬性和服務。一個類的職責要清晰,易于理解也有助于復用。類的職責要清晰,易于理解也有助于復用。 使用簡單的協(xié)議。對象之間的關(guān)聯(lián)是通過消息觸發(fā)使用簡單的協(xié)議。對象之間的關(guān)聯(lián)是通過消息觸發(fā)的,消息過于復雜,說明對象之間的耦合程度太緊,不的,消息過于復雜,說明對象之間的耦合程度太緊,不利于維護。利于維護。 設計結(jié)果簡潔明了。設計結(jié)果(如文檔)描述用詞設計結(jié)果簡潔明了。設計結(jié)果(如文檔)描述用詞準確、清晰、容易理解。準確、清晰、容

16、易理解。1311.2 系統(tǒng)設計系統(tǒng)設計 和傳統(tǒng)設計的目的相同,是為實現(xiàn)系統(tǒng)需求而對軟和傳統(tǒng)設計的目的相同,是為實現(xiàn)系統(tǒng)需求而對軟件體系結(jié)構(gòu)進行的設計。系統(tǒng)設計過程包括以下活動:件體系結(jié)構(gòu)進行的設計。系統(tǒng)設計過程包括以下活動: 劃分分析模型為子系統(tǒng)。劃分分析模型為子系統(tǒng)。 標識問題的并發(fā)性。標識問題的并發(fā)性。 選擇軟件體系結(jié)構(gòu)的風格并分配子系統(tǒng)到處理器。選擇軟件體系結(jié)構(gòu)的風格并分配子系統(tǒng)到處理器。 設計用戶界面。設計用戶界面。 選擇實現(xiàn)數(shù)據(jù)管理(對象儲存)的基本策略。選擇實現(xiàn)數(shù)據(jù)管理(對象儲存)的基本策略。 標識全局資源及訪問它們所需的控制機制。標識全局資源及訪問它們所需的控制機制。 為系統(tǒng)定義

17、合適的控制流機制。為系統(tǒng)定義合適的控制流機制。 考慮邊界條件??紤]邊界條件。 評審并考慮權(quán)衡。評審并考慮權(quán)衡。14 1、劃分分析模型、劃分分析模型 以定義類、關(guān)系和行為的內(nèi)聚集合,將這些設計元以定義類、關(guān)系和行為的內(nèi)聚集合,將這些設計元素包裝為子系統(tǒng)。素包裝為子系統(tǒng)。 定義子系統(tǒng)時應該遵循以下標準:定義子系統(tǒng)時應該遵循以下標準: 子系統(tǒng)應該具有定義良好的接口,通過接口和系統(tǒng)子系統(tǒng)應該具有定義良好的接口,通過接口和系統(tǒng)的其余部分通信。的其余部分通信。 除了少數(shù)的除了少數(shù)的“通信類通信類”,在子系統(tǒng)中的類只和該子,在子系統(tǒng)中的類只和該子系統(tǒng)中的其他類協(xié)作。系統(tǒng)中的其他類協(xié)作。 子系統(tǒng)的數(shù)量不應太多

18、。子系統(tǒng)的數(shù)量不應太多。 子系統(tǒng)可以內(nèi)部劃分以降低復雜性。子系統(tǒng)可以內(nèi)部劃分以降低復雜性。 15 當兩個子系統(tǒng)互相通信時,可建立客戶當兩個子系統(tǒng)互相通信時,可建立客戶/服務器服務器(C/S)結(jié)構(gòu)或?qū)Φ冉Y(jié)構(gòu)結(jié)構(gòu)或?qū)Φ冉Y(jié)構(gòu)(P2P)。在。在C/S結(jié)構(gòu)中,每個子結(jié)構(gòu)中,每個子系統(tǒng)只承擔一個由客戶端或服務器端隱含的角色,服務系統(tǒng)只承擔一個由客戶端或服務器端隱含的角色,服務只是單向地從服務器端流向客戶端;在只是單向地從服務器端流向客戶端;在P2P結(jié)構(gòu)中,服結(jié)構(gòu)中,服務可以雙向流動。務可以雙向流動。 在劃分子系統(tǒng)時,往往進行分層設計。系統(tǒng)的每在劃分子系統(tǒng)時,往往進行分層設計。系統(tǒng)的每一層包含一個或多個子系

19、統(tǒng),表示了完成系統(tǒng)功能所需一層包含一個或多個子系統(tǒng),表示了完成系統(tǒng)功能所需的功能性的不同抽象層次。抽象級別由與其相關(guān)的處理的功能性的不同抽象層次。抽象級別由與其相關(guān)的處理對用戶的可見程度來確定。(如對用戶的可見程度來確定。(如PPt第第6頁應用程序的頁應用程序的典型層次結(jié)構(gòu))。典型層次結(jié)構(gòu))。 16 Buschmann及其同事提出以下分層設計方法:及其同事提出以下分層設計方法: 建立分層的標準。即決定子系統(tǒng)將如何被組合成層次的建立分層的標準。即決定子系統(tǒng)將如何被組合成層次的體系結(jié)構(gòu)。體系結(jié)構(gòu)。 確定層的數(shù)量。太多使系統(tǒng)復雜,太少降低子系統(tǒng)的功確定層的數(shù)量。太多使系統(tǒng)復雜,太少降低子系統(tǒng)的功能獨

20、立性。能獨立性。 命名層并將子系統(tǒng)分配到某個層。確信同層的子系統(tǒng)間命名層并將子系統(tǒng)分配到某個層。確信同層的子系統(tǒng)間的通信以及和其他層的子系統(tǒng)間的通信遵循軟件體系結(jié)的通信以及和其他層的子系統(tǒng)間的通信遵循軟件體系結(jié)構(gòu)設計思想。構(gòu)設計思想。 定義每個層的接口。定義每個層的接口。 精化子系統(tǒng)以建立每個層的類結(jié)構(gòu)。精化子系統(tǒng)以建立每個層的類結(jié)構(gòu)。 定義層間通信的消息模型。定義層間通信的消息模型。 評審層設計以保證層間的耦合度最小。評審層設計以保證層間的耦合度最小。 迭代以精化分層設計。迭代以精化分層設計。17 2、并發(fā)性與基于體系結(jié)構(gòu)風格的子系統(tǒng)分配、并發(fā)性與基于體系結(jié)構(gòu)風格的子系統(tǒng)分配 當系統(tǒng)有許多并

21、發(fā)行為時,要劃分任務,以便簡化當系統(tǒng)有許多并發(fā)行為時,要劃分任務,以便簡化并發(fā)行為的設計與編碼。在這里,任務就是進程的同義并發(fā)行為的設計與編碼。在這里,任務就是進程的同義詞。詞。 并發(fā)任務可通過檢查每個對象的狀態(tài)圖而定義,如并發(fā)任務可通過檢查每個對象的狀態(tài)圖而定義,如果事件和轉(zhuǎn)換流指明在任意時刻只有單個對象是活躍的,果事件和轉(zhuǎn)換流指明在任意時刻只有單個對象是活躍的,則是一個控制線程(則是一個控制線程(thread of control)。即使一個對)。即使一個對象向另一個對象發(fā)送消息,只要第一個對象等待響應,象向另一個對象發(fā)送消息,只要第一個對象等待響應,控制線程就繼續(xù)。如果第一個對象不等待,

22、則控制線程控制線程就繼續(xù)。如果第一個對象不等待,則控制線程分叉。因此控制線程是一個進程中的并發(fā)代碼部分的執(zhí)分叉。因此控制線程是一個進程中的并發(fā)代碼部分的執(zhí)行。行。 OO系統(tǒng)中的任務是通過孤立控制線程而設計的。系統(tǒng)中的任務是通過孤立控制線程而設計的。例如當例如當SafeHome系統(tǒng)正在監(jiān)控其傳感器時,它也可以系統(tǒng)正在監(jiān)控其傳感器時,它也可以撥號到監(jiān)控站以檢驗連接。涉及這兩個行為的對象(傳撥號到監(jiān)控站以檢驗連接。涉及這兩個行為的對象(傳感器、監(jiān)控站)是同時活躍的,每個對象參與一個獨立感器、監(jiān)控站)是同時活躍的,每個對象參與一個獨立的控制線程并被定義為獨立的任務。如果監(jiān)控和撥號活的控制線程并被定義為

23、獨立的任務。如果監(jiān)控和撥號活動順序地發(fā)生,則只設計單個任務。動順序地發(fā)生,則只設計單個任務。 18 對象對象-行為模型對分析類間或子系統(tǒng)間的并發(fā)性提行為模型對分析類間或子系統(tǒng)間的并發(fā)性提供了支持。如果類和子系統(tǒng)不是同時活動的,則不需供了支持。如果類和子系統(tǒng)不是同時活動的,則不需要并發(fā)處理,它們可以實現(xiàn)在同一個處理器硬件上;要并發(fā)處理,它們可以實現(xiàn)在同一個處理器硬件上;如果類和子系統(tǒng)必須異步地或同時作用于事件,則被如果類和子系統(tǒng)必須異步地或同時作用于事件,則被視為并發(fā)的。這時有兩種選擇:分配每個子系統(tǒng)到各視為并發(fā)的。這時有兩種選擇:分配每個子系統(tǒng)到各自獨立的處理器;分配子系統(tǒng)到同一處理器并通過操

24、自獨立的處理器;分配子系統(tǒng)到同一處理器并通過操作系統(tǒng)特性提供并發(fā)支持作系統(tǒng)特性提供并發(fā)支持。 分布式系統(tǒng)中,分布式系統(tǒng)中, 軟件體系結(jié)構(gòu)風格對系統(tǒng)分布方軟件體系結(jié)構(gòu)風格對系統(tǒng)分布方案具有決定性的影響。選擇體系結(jié)構(gòu)風格應考慮以下案具有決定性的影響。選擇體系結(jié)構(gòu)風格應考慮以下因素:因素:19 根據(jù)被開發(fā)系統(tǒng)的特點:如系統(tǒng)類型、用戶需求、根據(jù)被開發(fā)系統(tǒng)的特點:如系統(tǒng)類型、用戶需求、系統(tǒng)規(guī)模、使用方式等;系統(tǒng)規(guī)模、使用方式等; 網(wǎng)絡協(xié)議:不同的網(wǎng)絡協(xié)議支持不同的體系結(jié)構(gòu)風網(wǎng)絡協(xié)議:不同的網(wǎng)絡協(xié)議支持不同的體系結(jié)構(gòu)風格;格; 可用的軟件產(chǎn)品:包括網(wǎng)絡軟件、可用的軟件產(chǎn)品:包括網(wǎng)絡軟件、OS、DBMS、現(xiàn)

25、、現(xiàn)有的數(shù)據(jù)服務器等;有的數(shù)據(jù)服務器等; 成本及其他:購置硬件及軟件成本、新開發(fā)軟件成成本及其他:購置硬件及軟件成本、新開發(fā)軟件成本、系統(tǒng)的安裝與維護成本。此外,如開發(fā)人員對所選本、系統(tǒng)的安裝與維護成本。此外,如開發(fā)人員對所選擇體系結(jié)構(gòu)風格下實現(xiàn)技術(shù)的熟練程度及開發(fā)期限等。擇體系結(jié)構(gòu)風格下實現(xiàn)技術(shù)的熟練程度及開發(fā)期限等。 根據(jù)以上因素選擇合適的體系結(jié)構(gòu),然后將子系統(tǒng)根據(jù)以上因素選擇合適的體系結(jié)構(gòu),然后將子系統(tǒng)分配到體系結(jié)構(gòu)的節(jié)點上。通過使用分配到體系結(jié)構(gòu)的節(jié)點上。通過使用UML的配置圖為系的配置圖為系統(tǒng)建立多進程的分布式的體系結(jié)構(gòu)統(tǒng)建立多進程的分布式的體系結(jié)構(gòu)。 20 3、任務管理設計、任務管

26、理設計 當一個節(jié)點上有多個控制流存在時,需要設計一個對當一個節(jié)點上有多個控制流存在時,需要設計一個對這些控制流進行協(xié)調(diào)和管理的控制流(即進程或任務)。這些控制流進行協(xié)調(diào)和管理的控制流(即進程或任務)。如設計一個進程,由它負責系統(tǒng)的啟動和初始化、其他進如設計一個進程,由它負責系統(tǒng)的啟動和初始化、其他進程的創(chuàng)建與撤銷、資源的分配、優(yōu)先級的授予等工作。程的創(chuàng)建與撤銷、資源的分配、優(yōu)先級的授予等工作。 用以下幾步完成任務管理的設計:用以下幾步完成任務管理的設計: 確定要執(zhí)行的任務并識別它的特征。確定要執(zhí)行的任務并識別它的特征。 確定任務的優(yōu)先級。確定任務的優(yōu)先級。 創(chuàng)建協(xié)調(diào)任務來協(xié)調(diào)所有其他任務。創(chuàng)建

27、協(xié)調(diào)任務來協(xié)調(diào)所有其他任務。 為每個任務設計對象,并定義它們之間的關(guān)系。為每個任務設計對象,并定義它們之間的關(guān)系。 任務應該用模版詳細描述,包括任務名、描述、優(yōu)先任務應該用模版詳細描述,包括任務名、描述、優(yōu)先級、服務、由誰管理、如何通信以及在層次中的位置,便級、服務、由誰管理、如何通信以及在層次中的位置,便于編程人員實現(xiàn)。于編程人員實現(xiàn)。 21 4、全局資源管理、全局資源管理 全局資源包括物理資源(磁盤驅(qū)動器、處理器、通全局資源包括物理資源(磁盤驅(qū)動器、處理器、通信線路)或邏輯資源(文件、數(shù)據(jù)庫、顯示窗口)。不信線路)或邏輯資源(文件、數(shù)據(jù)庫、顯示窗口)。不但有訪問權(quán)限的問題,還有訪問沖突的問

28、題。所以,應但有訪問權(quán)限的問題,還有訪問沖突的問題。所以,應該標識全局資源,并制定訪問它們的策略。一般的情況該標識全局資源,并制定訪問它們的策略。一般的情況下,如果資源是物理對象,則通過建立協(xié)議實現(xiàn)并發(fā)系下,如果資源是物理對象,則通過建立協(xié)議實現(xiàn)并發(fā)系統(tǒng)的訪問;如果資源是邏輯對象,統(tǒng)的訪問;如果資源是邏輯對象, Rumbaugh建議對建議對每個資源可創(chuàng)建一個每個資源可創(chuàng)建一個“保護者保護者”對象,控制對該資源的對象,控制對該資源的訪問(鑒別身份、協(xié)調(diào)沖突等訪問(鑒別身份、協(xié)調(diào)沖突等)。)。 22 5、選擇全局控制流機制、選擇全局控制流機制 即系統(tǒng)如何執(zhí)行??刂屏魇且粋€在處理機上順序執(zhí)行即系統(tǒng)如

29、何執(zhí)行。控制流是一個在處理機上順序執(zhí)行的動作序列。在分析過程中,一般不考慮控制流問題,因的動作序列。在分析過程中,一般不考慮控制流問題,因為假定所有的對象都能同時運行并在任何需要的時候就能為假定所有的對象都能同時運行并在任何需要的時候就能執(zhí)行它們的操作。系統(tǒng)設計的時候,就要考慮不是每個對執(zhí)行它們的操作。系統(tǒng)設計的時候,就要考慮不是每個對象隨時都能在自己的處理器上運行。有象隨時都能在自己的處理器上運行。有3種可能的控制流種可能的控制流機制:機制: 過程驅(qū)動控制:過程驅(qū)動控制: 控制來自程序代碼中,如程序等待控制來自程序代碼中,如程序等待輸入。這種控制流大多用于遺留系統(tǒng)并且使用過程化語言輸入。這種

30、控制流大多用于遺留系統(tǒng)并且使用過程化語言編寫。當使用面向?qū)ο笳Z言,操作的先后順序分散在許多編寫。當使用面向?qū)ο笳Z言,操作的先后順序分散在許多對象中,通過觀察代碼來決定輸入的順序?qū)⒑芾щy。對象中,通過觀察代碼來決定輸入的順序?qū)⒑芾щy。 事件驅(qū)動控制:事件驅(qū)動控制: 主循環(huán)等待外部事件,一旦事件到主循環(huán)等待外部事件,一旦事件到達就把與事件相關(guān)的信息分配給適當?shù)膶ο?,激活相應的達就把與事件相關(guān)的信息分配給適當?shù)膶ο?,激活相應的控制流。缺陷是錯誤過程會阻塞整個應用??刂屏?。缺陷是錯誤過程會阻塞整個應用。 23 線程線程: 系統(tǒng)可以創(chuàng)建任意數(shù)量個線程,每個線程系統(tǒng)可以創(chuàng)建任意數(shù)量個線程,每個線程對應于不

31、同的事件,還能共享一個進程內(nèi)的數(shù)據(jù)資源。對應于不同的事件,還能共享一個進程內(nèi)的數(shù)據(jù)資源。如果某個線程需要更多的數(shù)據(jù),就等待來自操作者的輸如果某個線程需要更多的數(shù)據(jù),就等待來自操作者的輸入。這種控制流機制最直接,但需要比較成熟的支持線入。這種控制流機制最直接,但需要比較成熟的支持線程的開發(fā)工具,特別是調(diào)試和測試工具。程的開發(fā)工具,特別是調(diào)試和測試工具。 一旦選定了控制流機制,就可用一組控制對象(主一旦選定了控制流機制,就可用一組控制對象(主動對象)來實現(xiàn)它(主動操作的一次執(zhí)行就是一個控制動對象)來實現(xiàn)它(主動操作的一次執(zhí)行就是一個控制流)。控制對象的職責就是記錄外部事件,存儲它們的流)??刂茖ο?/p>

32、的職責就是記錄外部事件,存儲它們的臨時狀態(tài),并給出與外部事件相關(guān)的邊界對象和實體對臨時狀態(tài),并給出與外部事件相關(guān)的邊界對象和實體對象的正確的操作次序象的正確的操作次序。 6、數(shù)據(jù)管理設計、數(shù)據(jù)管理設計 如何存儲那些持久的、需要經(jīng)常重新計算的對象?如何存儲那些持久的、需要經(jīng)常重新計算的對象? 選擇什么樣的存儲管理模式?選擇什么樣的存儲管理模式? 24 3種存儲管理機制:種存儲管理機制: (1)普通文件)普通文件 由操作系統(tǒng)提供的存儲機制,數(shù)據(jù)按字節(jié)流存儲,由操作系統(tǒng)提供的存儲機制,數(shù)據(jù)按字節(jié)流存儲,數(shù)據(jù)操縱功能簡單,適合于存儲大容量的圖形、圖像、數(shù)據(jù)操縱功能簡單,適合于存儲大容量的圖形、圖像、視

33、頻、音頻等多媒體數(shù)據(jù)。數(shù)據(jù)存儲時,每個類對應于視頻、音頻等多媒體數(shù)據(jù)。數(shù)據(jù)存儲時,每個類對應于一個文件,每個對象實例對應文件的一個紀錄。一個文件,每個對象實例對應文件的一個紀錄。 對對象象對對象象對對象象應用系統(tǒng)應用系統(tǒng)數(shù)據(jù)接口數(shù)據(jù)接口 文件文件用文件存儲對象用文件存儲對象記錄記錄1記錄記錄2記錄記錄n25 數(shù)據(jù)接口部分如何設計?主要設計為其他對象提數(shù)據(jù)接口部分如何設計?主要設計為其他對象提供基本保存與恢復功能的對象類。供基本保存與恢復功能的對象類。對象存取器對象存取器類類-文件對照表文件對照表 對象保存()對象保存()對象恢復()對象恢復()換算型對象換算型對象存取器存取器*對象保存對象保存

34、() *對象恢復對象恢復()索引表索引表文件記錄索引文件記錄索引 查找記錄指針查找記錄指針 ()查找型對象查找型對象存取器存取器*對象保存對象保存() *對象恢復對象恢復()索引型對象索引型對象存取器存取器*對象保存對象保存() *對象恢復對象恢復()文件系統(tǒng)數(shù)據(jù)接口的設計文件系統(tǒng)數(shù)據(jù)接口的設計從關(guān)鍵字換從關(guān)鍵字換算出記錄位算出記錄位置再保存或置再保存或存取存取以某種快速以某種快速算法查找與算法查找與關(guān)鍵字相符關(guān)鍵字相符的記錄的記錄用于某些類的用于某些類的對象實例不便對象實例不便于按關(guān)鍵字的于按關(guān)鍵字的值排序值排序26 問題域部分的對象通過請求數(shù)據(jù)接口部分提供的服問題域部分的對象通過請求數(shù)據(jù)接

35、口部分提供的服務實現(xiàn)對象的存取,這些永久性對象需要增加一些屬性務實現(xiàn)對象的存取,這些永久性對象需要增加一些屬性(如類名、關(guān)鍵字)和請求保存與恢復的操作,往往需(如類名、關(guān)鍵字)和請求保存與恢復的操作,往往需定義一個在較高層次上的作為存儲協(xié)議的抽象類。因此定義一個在較高層次上的作為存儲協(xié)議的抽象類。因此對原有的對象模型要作一些修改與調(diào)整。對原有的對象模型要作一些修改與調(diào)整。 (2)關(guān)系數(shù)據(jù)庫關(guān)系數(shù)據(jù)庫 提供了對數(shù)據(jù)存取、數(shù)據(jù)共享、數(shù)據(jù)完整性維護、提供了對數(shù)據(jù)存取、數(shù)據(jù)共享、數(shù)據(jù)完整性維護、故障恢復、事務處理等功能實現(xiàn)的數(shù)據(jù)操縱語言。數(shù)據(jù)故障恢復、事務處理等功能實現(xiàn)的數(shù)據(jù)操縱語言。數(shù)據(jù)以表的形式存

36、儲,表的每一列標識一個屬性,每行把一以表的形式存儲,表的每一列標識一個屬性,每行把一個數(shù)據(jù)項標識成一個屬性值的元組。不同表中的多個元個數(shù)據(jù)項標識成一個屬性值的元組。不同表中的多個元組用來表示單個對象的屬性。關(guān)系型數(shù)據(jù)庫技術(shù)成熟,組用來表示單個對象的屬性。關(guān)系型數(shù)據(jù)庫技術(shù)成熟,適合于大的數(shù)據(jù)集以及對屬性數(shù)據(jù)的復雜查詢適合于大的數(shù)據(jù)集以及對屬性數(shù)據(jù)的復雜查詢。但關(guān)系但關(guān)系數(shù)據(jù)庫不適合儲存多媒體數(shù)據(jù)和經(jīng)過壓縮處理過的數(shù)據(jù)數(shù)據(jù)庫不適合儲存多媒體數(shù)據(jù)和經(jīng)過壓縮處理過的數(shù)據(jù)(因為要求至少滿足第一范式(因為要求至少滿足第一范式每個屬性必須是原子的,每個屬性必須是原子的,不再含有內(nèi)部結(jié)構(gòu))不再含有內(nèi)部結(jié)構(gòu))2

37、7 對對象象對對象象對對象象應用系統(tǒng)應用系統(tǒng)數(shù)據(jù)接口數(shù)據(jù)接口RDBMS表表1表表2表表n關(guān)系數(shù)據(jù)庫關(guān)系數(shù)據(jù)庫用關(guān)系數(shù)據(jù)庫存儲對象用關(guān)系數(shù)據(jù)庫存儲對象 由于關(guān)系數(shù)據(jù)庫要求存由于關(guān)系數(shù)據(jù)庫要求存入其中的數(shù)據(jù)符合一定的規(guī)入其中的數(shù)據(jù)符合一定的規(guī)范,因此需要對永久類的數(shù)范,因此需要對永久類的數(shù)據(jù)進行規(guī)范化(要花費代據(jù)進行規(guī)范化(要花費代價),以消除關(guān)系中的函數(shù)價),以消除關(guān)系中的函數(shù)依賴所帶來的數(shù)據(jù)更新異常依賴所帶來的數(shù)據(jù)更新異常并減少數(shù)據(jù)冗余。并減少數(shù)據(jù)冗余。 為了給數(shù)據(jù)查詢、更新為了給數(shù)據(jù)查詢、更新等操作帶來方便,需要對永等操作帶來方便,需要對永久類確定關(guān)鍵字,使能夠唯久類確定關(guān)鍵字,使能夠唯一的

38、確定該類的每個對象實一的確定該類的每個對象實例(該表的每個元組)的屬例(該表的每個元組)的屬性。性。28 數(shù)據(jù)接口的實現(xiàn)類似文件系統(tǒng),也需要提供數(shù)據(jù)接口的實現(xiàn)類似文件系統(tǒng),也需要提供“對象對象保存保存”和和“對象恢復對象恢復”的服務。執(zhí)行這些服務需要知道的服務。執(zhí)行這些服務需要知道被保存或恢復的對象的下述信息:被保存或恢復的對象的下述信息: 它在內(nèi)存中是哪個對象(以便知道從何處取得被保它在內(nèi)存中是哪個對象(以便知道從何處取得被保存的對象,或者把數(shù)據(jù)恢復到何處);存的對象,或者把數(shù)據(jù)恢復到何處); 它屬于哪個類(以便知道該對象應保存在哪個數(shù)據(jù)它屬于哪個類(以便知道該對象應保存在哪個數(shù)據(jù)庫表中);

39、庫表中); 它的關(guān)鍵字(以便知道該對象對應數(shù)據(jù)庫表的哪個它的關(guān)鍵字(以便知道該對象對應數(shù)據(jù)庫表的哪個元組)。元組)。 (3)OO數(shù)據(jù)庫數(shù)據(jù)庫 將對象和關(guān)系作為數(shù)據(jù)儲存。提供了繼承和抽象數(shù)將對象和關(guān)系作為數(shù)據(jù)儲存。提供了繼承和抽象數(shù)據(jù)類型,不需要對象和存儲實體之間的格式轉(zhuǎn)換,不需據(jù)類型,不需要對象和存儲實體之間的格式轉(zhuǎn)換,不需要另外設計數(shù)據(jù)接口。需熟悉要另外設計數(shù)據(jù)接口。需熟悉OODBMS提供的提供的ODL、DML,實現(xiàn)對類和對象的定義以及對數(shù)據(jù)庫的訪問。,實現(xiàn)對類和對象的定義以及對數(shù)據(jù)庫的訪問。 下圖顯示了使用關(guān)系數(shù)據(jù)庫對類的實例的存儲下圖顯示了使用關(guān)系數(shù)據(jù)庫對類的實例的存儲。29 兩個多對多

40、關(guān)系的類映射為兩個多對多關(guān)系的類映射為3個表(維護表、個表(維護表、車輛零件車輛零件表表、零件表)。、零件表)。30 7、確定邊界條件、確定邊界條件 設計中的大部分工作都與系統(tǒng)穩(wěn)定的狀態(tài)行為有關(guān)。設計中的大部分工作都與系統(tǒng)穩(wěn)定的狀態(tài)行為有關(guān)。但必須考慮邊界條件:系統(tǒng)如何啟動、初始化、關(guān)閉以及但必須考慮邊界條件:系統(tǒng)如何啟動、初始化、關(guān)閉以及故障處理。故障處理。 初始化包括:常量、參數(shù)、全局變量、任務及保護獨初始化包括:常量、參數(shù)、全局變量、任務及保護獨享的處置設置。系統(tǒng)關(guān)閉時,應該釋放所擁有的全部資源。享的處置設置。系統(tǒng)關(guān)閉時,應該釋放所擁有的全部資源。并發(fā)系統(tǒng)中必須通知其他任務,系統(tǒng)要關(guān)閉。

41、并發(fā)系統(tǒng)中必須通知其他任務,系統(tǒng)要關(guān)閉。 運行中出現(xiàn)故障的原因可能是:運行中出現(xiàn)故障的原因可能是: 用戶錯誤,系統(tǒng)應幫助用戶糾正錯誤。用戶錯誤,系統(tǒng)應幫助用戶糾正錯誤。 硬件錯誤,網(wǎng)絡連接故障等情況需要保存臨時狀態(tài)。硬件錯誤,網(wǎng)絡連接故障等情況需要保存臨時狀態(tài)。 軟件故障,在程序中多設計出現(xiàn)故障后的出口。軟件故障,在程序中多設計出現(xiàn)故障后的出口。 系統(tǒng)設計是不斷迭代和演化的過程,要保證設計模型系統(tǒng)設計是不斷迭代和演化的過程,要保證設計模型是正確的、完整的、一致的、現(xiàn)實的、易讀的。是正確的、完整的、一致的、現(xiàn)實的、易讀的。31 8、評審、評審 如果分析模型與設計模型映射(如:每個子系統(tǒng)都如果分析

42、模型與設計模型映射(如:每個子系統(tǒng)都能追溯到一個用例或一個非功能需求),則設計模型是能追溯到一個用例或一個非功能需求),則設計模型是正確的;正確的; 如果每個需求和每個系統(tǒng)設計問題都提到了,則模如果每個需求和每個系統(tǒng)設計問題都提到了,則模型是完整的;型是完整的; 如果一個模型不包括任何沖突,則它是一致的;如果一個模型不包括任何沖突,則它是一致的; 如果模型能夠?qū)崿F(xiàn),則它是現(xiàn)實的;如果模型能夠?qū)崿F(xiàn),則它是現(xiàn)實的; 由非系統(tǒng)設計人員能夠看懂模型,則模型是易讀的。由非系統(tǒng)設計人員能夠看懂模型,則模型是易讀的。3211.3 對象設計對象設計 系統(tǒng)設計相當于大樓的建筑平面圖,規(guī)定了每個房系統(tǒng)設計相當于大

43、樓的建筑平面圖,規(guī)定了每個房間的用途,以及房間與房間之間、房間與外部環(huán)境之間間的用途,以及房間與房間之間、房間與外部環(huán)境之間的連接機制。對象設計著重于每個房間的內(nèi)部細節(jié)。的連接機制。對象設計著重于每個房間的內(nèi)部細節(jié)。 對象設計的主要任務是:對象設計的主要任務是: 定義對象完整的接口定義對象完整的接口 設計對象內(nèi)部結(jié)構(gòu)設計對象內(nèi)部結(jié)構(gòu) 構(gòu)件選擇構(gòu)件選擇 重組及優(yōu)化重組及優(yōu)化 系統(tǒng)分析確定了問題域?qū)ο?,以及它們之間的關(guān)系、系統(tǒng)分析確定了問題域?qū)ο?,以及它們之間的關(guān)系、相關(guān)的屬性、操作。系統(tǒng)設計確定了子系統(tǒng)和大多數(shù)重相關(guān)的屬性、操作。系統(tǒng)設計確定了子系統(tǒng)和大多數(shù)重要的求解域?qū)ο?。對象設計要精細這些對

44、象(這里的對要的求解域?qū)ο?。對象設計要精細這些對象(這里的對象包括子系統(tǒng)),并可能定義其他的求解域?qū)ο蟆O蟀ㄗ酉到y(tǒng)),并可能定義其他的求解域?qū)ο蟆?3 1、定義對象的接口、定義對象的接口 對象的接口也稱為對象的協(xié)議、對象的界面。它通對象的接口也稱為對象的協(xié)議、對象的界面。它通過定義對象可以接收的每個消息和當對象接收到該消息過定義對象可以接收的每個消息和當對象接收到該消息后完成的相關(guān)服務來描述。接口提供了一種方法,把對后完成的相關(guān)服務來描述。接口提供了一種方法,把對象基于操作的功能說明與具體實現(xiàn)區(qū)分開來,使得任何象基于操作的功能說明與具體實現(xiàn)區(qū)分開來,使得任何依賴和使用接口的客戶不必依賴于接口

45、的具體實現(xiàn),有依賴和使用接口的客戶不必依賴于接口的具體實現(xiàn),有利于接口實現(xiàn)的替換。利于接口實現(xiàn)的替換。 接口描述可以用接口描述可以用UML中類圖一樣的符號,省略屬性中類圖一樣的符號,省略屬性部分,部分,interface要包含在類名部分中。比較多的人要包含在類名部分中。比較多的人喜歡用程序設計語言來定義接口,以便用編譯器來發(fā)現(xiàn)喜歡用程序設計語言來定義接口,以便用編譯器來發(fā)現(xiàn)接口描述中的錯誤和不一致。接口描述中的錯誤和不一致。 下圖給出了下圖給出了“轉(zhuǎn)賬轉(zhuǎn)賬” 的的Java接口描述接口描述。34/provided interfaces:Public interface Transfers pub

46、lic Account create (Customer owner, Money balance, AccountNumber account_id); public void Deposit (Money amount ,String reason); public void Withdraw (Money amount, String reason); 要確定某個對象完整的接口,必須考察與它有關(guān)要確定某個對象完整的接口,必須考察與它有關(guān)的所有用例,將與它有關(guān)的所有消息抽取出來,形成的所有用例,將與它有關(guān)的所有消息抽取出來,形成該對象完整的界面。該對象完整的界面。 對于包或構(gòu)件,當有依賴關(guān)

47、系指向它的時候,就對于包或構(gòu)件,當有依賴關(guān)系指向它的時候,就有可能表示該包或構(gòu)件需要提供一個接口。有可能表示該包或構(gòu)件需要提供一個接口。352、設計對象內(nèi)部結(jié)構(gòu)、設計對象內(nèi)部結(jié)構(gòu) 確定遺漏的屬性和操作:確定遺漏的屬性和操作: 系統(tǒng)分析和設計時集中考慮應用域,忽略與實現(xiàn)相系統(tǒng)分析和設計時集中考慮應用域,忽略與實現(xiàn)相關(guān)的細節(jié),這時就應該增加上。關(guān)的細節(jié),這時就應該增加上。 指定類型,聲明可見性:指定類型,聲明可見性: 屬性屬性:確定類型、數(shù)據(jù)結(jié)構(gòu)。除了分析活動中確定:確定類型、數(shù)據(jù)結(jié)構(gòu)。除了分析活動中確定的屬性,還包括一些其他屬性,這些屬性用來表示和其的屬性,還包括一些其他屬性,這些屬性用來表示和

48、其他類的對象關(guān)聯(lián)的對象引用(關(guān)聯(lián)的實現(xiàn))。他類的對象關(guān)聯(lián)的對象引用(關(guān)聯(lián)的實現(xiàn))。 操作操作:確定參數(shù)、返回值及類型。:確定參數(shù)、返回值及類型。 為了確定每個屬性和操作的訪問權(quán)限,為了確定每個屬性和操作的訪問權(quán)限,UML定義了定義了3種可見性符號,即在屬性和操作的說明前加上前綴:種可見性符號,即在屬性和操作的說明前加上前綴:36 -:私有的,:私有的, 只能由定義它的類訪問,子類和其他類只能由定義它的類訪問,子類和其他類 都不能訪問。都不能訪問。 +:公有的,:公有的, 任何類都可以訪問。公有的操作確定了任何類都可以訪問。公有的操作確定了 對象的接口。對象的接口。 #:保護的,:保護的, 可以

49、由定義它的類以及該類的子類訪問??梢杂啥x它的類以及該類的子類訪問。 設計關(guān)聯(lián):設計關(guān)聯(lián): OOPL一般不提供一般不提供“關(guān)聯(lián)關(guān)聯(lián)”的直接實現(xiàn),一般用指針的直接實現(xiàn),一般用指針或?qū)ο笠脕韺崿F(xiàn)關(guān)聯(lián)。(有或?qū)ο笠脕韺崿F(xiàn)關(guān)聯(lián)。(有UML建模工具自動完成關(guān)聯(lián)建模工具自動完成關(guān)聯(lián)到引用的轉(zhuǎn)換)。到引用的轉(zhuǎn)換)。 一對一關(guān)聯(lián)一對一關(guān)聯(lián):ZoomInMapAreaZoomIn1 1MapArea-Target: MapArea也可在也可在MapArea中設置一個引用中設置一個引用ZoomIn的屬性,并增加相應的屬性,并增加相應的操作。的操作。37 一對多關(guān)聯(lián)一對多關(guān)聯(lián): LayerElement1 *L

50、ayerElement-LayerEle: Set-Containe: Layer Layer的的Set取決關(guān)系的約束條件。如層中的元素要取決關(guān)系的約束條件。如層中的元素要排序,則用排序,則用Array或或Vector代替代替Set。一對多關(guān)聯(lián)的實現(xiàn)一對多關(guān)聯(lián)的實現(xiàn)38 多對多關(guān)聯(lián)多對多關(guān)聯(lián):RecordElement* *RecordElement-RecordEle: Set-Containe: Set多對多關(guān)聯(lián)的實現(xiàn)多對多關(guān)聯(lián)的實現(xiàn) 對于多對多關(guān)聯(lián),可以將對于多對多關(guān)聯(lián),可以將 “關(guān)聯(lián)關(guān)聯(lián)” 作為一個獨立作為一個獨立的類,形成兩個二元關(guān)系,可降低重數(shù),方便實現(xiàn)。的類,形成兩個二元關(guān)系,可

51、降低重數(shù),方便實現(xiàn)。39 設計操作的算法設計操作的算法 分析類的狀態(tài)圖,從每個狀態(tài)轉(zhuǎn)移前后的動作說明分析類的狀態(tài)圖,從每個狀態(tài)轉(zhuǎn)移前后的動作說明獲取每個方法體的邏輯結(jié)構(gòu)。而順序圖中的消息一般對獲取每個方法體的邏輯結(jié)構(gòu)。而順序圖中的消息一般對應狀態(tài)圖中引起狀態(tài)轉(zhuǎn)移的事件或動作。應狀態(tài)圖中引起狀態(tài)轉(zhuǎn)移的事件或動作。 類名類名可見性:屬性列表可見性:屬性列表可見性:操作可見性:操作1(參數(shù)表參數(shù)表)可見性:操作可見性:操作2(參數(shù)表參數(shù)表) 方法方法1方法方法1過程體過程體 方法方法2方法方法2過程體過程體 方法方法n方法方法n過程體過程體消息消息消息消息消息消息403、構(gòu)件選擇、構(gòu)件選擇 選擇系統(tǒng)

52、運行的軟、硬件平臺,包括商品構(gòu)件(更可選擇系統(tǒng)運行的軟、硬件平臺,包括商品構(gòu)件(更可靠、有效、健壯)、靠、有效、健壯)、DBMS、中間件、企業(yè)應用程序框架、中間件、企業(yè)應用程序框架(特定的應用)等,目的是盡可能多地減少需要開發(fā)的自(特定的應用)等,目的是盡可能多地減少需要開發(fā)的自定義對象的數(shù)量。由于商品構(gòu)件支持大多數(shù)系統(tǒng),較為復定義對象的數(shù)量。由于商品構(gòu)件支持大多數(shù)系統(tǒng),較為復雜,需要學習的投入,可能還要作適應性修改。雜,需要學習的投入,可能還要作適應性修改。4、重組與優(yōu)化、重組與優(yōu)化 (1)提高可復用性)提高可復用性 對象設計給出了開發(fā)階段中再次檢查應用程序和求解對象設計給出了開發(fā)階段中再次

53、檢查應用程序和求解對象間繼承層次的機會。對象間繼承層次的機會。 設計完善的繼承層次的主要優(yōu)點是:設計完善的繼承層次的主要優(yōu)點是: 可以復用更多的代碼,產(chǎn)生較少的冗余。可以復用更多的代碼,產(chǎn)生較少的冗余。 代碼是可擴展的,可用來創(chuàng)建更特別的類。代碼是可擴展的,可用來創(chuàng)建更特別的類。41 但是通過繼承復用是有代價的,開發(fā)人員需要正但是通過繼承復用是有代價的,開發(fā)人員需要正確的預見所創(chuàng)建的類的哪些行為需要共享、哪些行為確的預見所創(chuàng)建的類的哪些行為需要共享、哪些行為需要由以后的新類細化,通常還不會知道以后所有可需要由以后的新類細化,通常還不會知道以后所有可能的新類。另外,一旦開發(fā)人員為共享代碼定義了繼

54、能的新類。另外,一旦開發(fā)人員為共享代碼定義了繼承層次,抽象類的接口難以改變,因為許多子類和客承層次,抽象類的接口難以改變,因為許多子類和客戶類都依賴它們。戶類都依賴它們。 設計通過繼承層次復用的方法是:設計通過繼承層次復用的方法是: 檢查大量相似的類,抽取出它們的共同行為。檢查大量相似的類,抽取出它們的共同行為。 給出一層抽象概念,并從預期的變化中抽取出一給出一層抽象概念,并從預期的變化中抽取出一個具體類。如個具體類。如AbstractFactory等設計模式都使用了繼等設計模式都使用了繼承來防止預期的變化。承來防止預期的變化。 42 (2)優(yōu)化訪問路徑)優(yōu)化訪問路徑 效率低的系統(tǒng)性能的常見原

55、因是訪問必須的信息時效率低的系統(tǒng)性能的常見原因是訪問必須的信息時對多個關(guān)系的重復遍歷。為了識別較低的訪問路徑,對多個關(guān)系的重復遍歷。為了識別較低的訪問路徑,Rumbaugh建議對象設計者應該考慮下列問題:建議對象設計者應該考慮下列問題: 對于每個操作對于每個操作:需要多少次遍歷?遍歷哪些關(guān)系?:需要多少次遍歷?遍歷哪些關(guān)系?常用的操作不應該有許多遍歷,應該直接通信。如果缺少常用的操作不應該有許多遍歷,應該直接通信。如果缺少直接通信,應該在兩個對象間增加另外的關(guān)系。有一個直接通信,應該在兩個對象間增加另外的關(guān)系。有一個Demeter法則,稱法則,稱“只同你的直接朋友對話只同你的直接朋友對話”,指

56、在軟件,指在軟件設計中,一個方法只與由關(guān)聯(lián)連接的相鄰對象通信。好處:設計中,一個方法只與由關(guān)聯(lián)連接的相鄰對象通信。好處:易理解、易修改、效率高。易理解、易修改、效率高。 對于每個關(guān)系對于每個關(guān)系:有:有“多重多重”關(guān)系?重數(shù)是必需的嗎?關(guān)系?重數(shù)是必需的嗎?檢索過程中,關(guān)系中的檢索過程中,關(guān)系中的“多多”端是否經(jīng)常出現(xiàn)?如果有,端是否經(jīng)常出現(xiàn)?如果有,應該試著將應該試著將“多多”減少為減少為“1”。否則,應為。否則,應為“多多”端排序端排序或建立索引以改進訪問時間。或建立索引以改進訪問時間。43 效率低的另一個原因是過多的建模。分析時確效率低的另一個原因是過多的建模。分析時確定了許多類結(jié)構(gòu),但

57、設計時發(fā)現(xiàn)沒有任何意義的信定了許多類結(jié)構(gòu),但設計時發(fā)現(xiàn)沒有任何意義的信息。因此對象設計者應該問:息。因此對象設計者應該問: 對于每個屬性對于每個屬性:哪些操作用到了這個屬性?只:哪些操作用到了這個屬性?只有有 set()、get()操作嗎?如果是,能否移到調(diào)用它的對操作嗎?如果是,能否移到調(diào)用它的對象中去?如果某些類有很少的屬性和行為,并且與象中去?如果某些類有很少的屬性和行為,并且與其它類相關(guān),可將這些類退化成屬性(減少了類的其它類相關(guān),可將這些類退化成屬性(減少了類的數(shù)目)。這樣做的目的是使模型變得簡單、直接。數(shù)目)。這樣做的目的是使模型變得簡單、直接。4411.4 設計模式設計模式1 1

58、、概述、概述 模式模式 (Pattern) 是解決特定領(lǐng)域問題的經(jīng)驗,可以幫是解決特定領(lǐng)域問題的經(jīng)驗,可以幫助人們在軟件開發(fā)過程中對于經(jīng)常重復出現(xiàn)的問題制定成助人們在軟件開發(fā)過程中對于經(jīng)常重復出現(xiàn)的問題制定成功解決的方案。功解決的方案。 模式的概念最初來自于建筑學領(lǐng)域,用模式描述建筑模式的概念最初來自于建筑學領(lǐng)域,用模式描述建筑物的建筑元素(物的建筑元素(Alexander,1979),),概括概括了被認為是好了被認為是好的設計的實踐經(jīng)驗。的設計的實踐經(jīng)驗。94年年Gamma等等4 4人(簡稱人(簡稱“Gang of Four”)合著的合著的設計模式:可復用面向?qū)ο筌浖幕A設計模式:可復用面

59、向?qū)ο筌浖幕A提出了用設計模式解決重復出現(xiàn)的軟件設計問題提出了用設計模式解決重復出現(xiàn)的軟件設計問題,并對設并對設計模式進行了分類描述和解釋。計模式進行了分類描述和解釋。96年由年由Buschmann等等5 5人人合著的合著的面向模式的軟件體系結(jié)構(gòu)面向模式的軟件體系結(jié)構(gòu)將模式跨越不同的抽將模式跨越不同的抽象層次,提出了高層的體系結(jié)構(gòu)模式、中層的設計模式和象層次,提出了高層的體系結(jié)構(gòu)模式、中層的設計模式和低層的習慣用法。本章主要針對設計模式進行討論。低層的習慣用法。本章主要針對設計模式進行討論。45 Gamma提出:提出:設計模式解決特定的設計問題,并設計模式解決特定的設計問題,并使得面向?qū)ο笤O

60、計更靈活、優(yōu)美和可復用。它們通過使得面向?qū)ο笤O計更靈活、優(yōu)美和可復用。它們通過將新的設計基于以前的經(jīng)驗之上而幫助設計者復用成將新的設計基于以前的經(jīng)驗之上而幫助設計者復用成功的設計。熟悉這樣的模式的設計者可以立即應用它功的設計。熟悉這樣的模式的設計者可以立即應用它們到設計問題中,而不需要重新去發(fā)現(xiàn)它們。們到設計問題中,而不需要重新去發(fā)現(xiàn)它們。 因此,在因此,在OOD過程中,開發(fā)人員應積極去選擇并過程中,開發(fā)人員應積極去選擇并應用現(xiàn)存的可復用的設計模式。應用現(xiàn)存的可復用的設計模式。 每個模式都有伴隨定義的語境和強度。語境解釋每個模式都有伴隨定義的語境和強度。語境解釋了模式適用的情況。強度指語境中的

溫馨提示

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

評論

0/150

提交評論