第10章-面向?qū)ο笤O(shè)計(jì)-普通高等院校計(jì)算機(jī)類專業(yè)系列教材-軟件工程教學(xué)課件_第1頁
第10章-面向?qū)ο笤O(shè)計(jì)-普通高等院校計(jì)算機(jī)類專業(yè)系列教材-軟件工程教學(xué)課件_第2頁
第10章-面向?qū)ο笤O(shè)計(jì)-普通高等院校計(jì)算機(jī)類專業(yè)系列教材-軟件工程教學(xué)課件_第3頁
第10章-面向?qū)ο笤O(shè)計(jì)-普通高等院校計(jì)算機(jī)類專業(yè)系列教材-軟件工程教學(xué)課件_第4頁
第10章-面向?qū)ο笤O(shè)計(jì)-普通高等院校計(jì)算機(jī)類專業(yè)系列教材-軟件工程教學(xué)課件_第5頁
已閱讀5頁,還剩225頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第10章面向?qū)ο笤O(shè)計(jì)10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則

10.2問題域子系統(tǒng)設(shè)計(jì)

10.3人機(jī)交互子系統(tǒng)設(shè)計(jì)10.4任務(wù)管理子系統(tǒng)設(shè)計(jì)10.5數(shù)據(jù)管理子系統(tǒng)設(shè)計(jì)10.6服務(wù)與關(guān)聯(lián)的設(shè)計(jì)10.7面向?qū)ο笤O(shè)計(jì)的優(yōu)化第10章面向?qū)ο笤O(shè)計(jì)10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則110.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則10.1.1設(shè)計(jì)準(zhǔn)則1.模塊化模塊化是軟件設(shè)計(jì)的重要準(zhǔn)則。在面向?qū)ο箝_發(fā)方法中,將對象定義為模塊。對象把數(shù)據(jù)結(jié)構(gòu)和作用在數(shù)據(jù)上的操作封裝起來構(gòu)成模塊。對象是組成系統(tǒng)的基本模塊。10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則10.1.1設(shè)計(jì)準(zhǔn)則2

2.抽象類是一種抽象數(shù)據(jù)類型,在該數(shù)據(jù)類型之上,可以創(chuàng)建對象(類的成員)。類包含相似對象的共同屬性和服務(wù),它對外定義了公共接口,構(gòu)成了類的規(guī)格說明(即協(xié)議),供外界合法訪問。通過這種接口訪問類實(shí)例中的數(shù)據(jù)。通常把這類抽象稱為規(guī)格說明抽象。

3.信息隱藏在面向?qū)ο蠓椒ㄖ?,對象是屬性和服?wù)的封裝體,這就實(shí)現(xiàn)了信息隱藏。類結(jié)構(gòu)分離了接口與實(shí)現(xiàn),類的屬性的表示方法和操作的實(shí)現(xiàn)算法,對于類的用戶來說,都應(yīng)該是隱藏的,用戶只能通過公共接口訪問類中的屬性。2.抽象3

4.弱耦合所謂耦合,是指一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的依賴關(guān)系。依賴關(guān)系越多耦合度越強(qiáng),依賴關(guān)系越少耦合度越弱。在面向?qū)ο蠓椒ㄖ?,對象是最基本的模塊,不同對象之間相互關(guān)聯(lián)的依賴關(guān)系表示了耦合度。衡量設(shè)計(jì)優(yōu)良的一個(gè)重要標(biāo)準(zhǔn)就是弱耦合,弱耦合的設(shè)計(jì)中某個(gè)對象的改變不會(huì)或很少影響到其他對象。這樣給理解、測試或修改帶來很大的方便。反之,強(qiáng)耦合會(huì)給理解、測試或修改帶來很大的難度,并且還降低了該類的可重用性和可移植性。不同對象之間耦合是不可避免的。兩個(gè)對象必須相互聯(lián)系相互依賴時(shí),應(yīng)該通過類的協(xié)議(即公共接口)實(shí)現(xiàn)兩個(gè)對象相互依賴(耦合),而不是通過類的具體實(shí)現(xiàn)細(xì)節(jié)來描述。4.弱耦合4

5.強(qiáng)內(nèi)聚所謂內(nèi)聚,是一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度。結(jié)合得越緊密內(nèi)聚越強(qiáng),結(jié)合得越不緊密內(nèi)聚越弱。強(qiáng)內(nèi)聚也是衡量設(shè)計(jì)優(yōu)良的一個(gè)重要標(biāo)準(zhǔn)。在面向?qū)ο笤O(shè)計(jì)中,內(nèi)聚可分為下述三類:(1)服務(wù)內(nèi)聚。一個(gè)服務(wù)應(yīng)該是單一的,即只完成一個(gè)任務(wù)。(2)類內(nèi)聚。類內(nèi)聚要求類的屬性和服務(wù)應(yīng)該是高內(nèi)聚的,而且它們應(yīng)該是系統(tǒng)任務(wù)所必需的。一個(gè)類應(yīng)該只有一個(gè)功能,如果某個(gè)類有多個(gè)功能,通常應(yīng)該把它分解成多個(gè)專用的類。5.強(qiáng)內(nèi)聚5(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:一般-特殊結(jié)構(gòu)符合領(lǐng)域知識的表示形式,也就是說,特殊類應(yīng)該盡量地繼承一般類的屬性和服務(wù)。這樣的一般-特殊結(jié)構(gòu)是高內(nèi)聚的。例如,雖然表面看來飛機(jī)與汽車有相似的地方(都用發(fā)動(dòng)機(jī)驅(qū)動(dòng),都有輪子,……),但是,如果把飛機(jī)和汽車都作為“機(jī)動(dòng)車”類的子類,則不符合領(lǐng)域知識的表示形式,這樣的一般-特殊結(jié)構(gòu)是低內(nèi)聚的。高內(nèi)聚的一般-特殊結(jié)構(gòu)應(yīng)該是,設(shè)置一個(gè)抽象類“交通工具”,把飛機(jī)和機(jī)動(dòng)車作為交通工具類的子類,而汽車又是機(jī)動(dòng)車類的子類。(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:66.可重用在面向?qū)ο笤O(shè)計(jì)中,一個(gè)類的設(shè)計(jì)應(yīng)該具有通用性,為開發(fā)相似的系統(tǒng)提供軟件重用可能。軟件重用可以提高軟件開發(fā)生產(chǎn)率,確保目標(biāo)系統(tǒng)質(zhì)量??芍赜檬敲嫦?qū)ο箝_發(fā)方法的一個(gè)重要特性,也就是說,用面向?qū)ο蟮母拍詈头椒ū容^容易實(shí)現(xiàn)重用。因此,在軟件開發(fā)過程中,為了實(shí)現(xiàn)重用,既要盡量重用已有的類,又要?jiǎng)?chuàng)建可重用的新類。6.可重用710.1.2設(shè)計(jì)策略在使用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件的實(shí)踐中,得出了下面一些基于經(jīng)驗(yàn)的啟發(fā)規(guī)則,這些規(guī)則往往能幫助軟件開發(fā)人員設(shè)計(jì)出好的方案來,以保證軟件的質(zhì)量。1.設(shè)計(jì)結(jié)果應(yīng)該清晰易懂良好的設(shè)計(jì)結(jié)果應(yīng)該是清晰易懂的,它能提高軟件的可維護(hù)性和可重用性。如果一個(gè)設(shè)計(jì)結(jié)構(gòu)不清楚,并且難以理解,是不會(huì)被人們接受的。設(shè)計(jì)時(shí)采用以下幾個(gè)策略能使結(jié)果清晰易懂。(1)命名一致。命名應(yīng)該與專業(yè)領(lǐng)域中的名字一致,并且要是符合人們習(xí)慣的名字。不同類中相似服務(wù)的名字應(yīng)該相同。10.1.2設(shè)計(jì)策略8(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建立了類的協(xié)議,避免重復(fù)勞動(dòng)或重復(fù)定義帶來的差異(不統(tǒng)一)。這些協(xié)議可能是其他設(shè)計(jì)人員已經(jīng)建立了類的協(xié)議,或是在類庫中已有的協(xié)議。(3)減少消息連接。盡量采用已有標(biāo)準(zhǔn)的消息連接,去掉不必要的消息連接。采用統(tǒng)一模式建立自己需要的消息連接,以便理解和使用,增強(qiáng)可理解性和可使用性。(4)避免模糊的定義。應(yīng)該定義具有明確、有限用途的類,避免那些模糊的、不準(zhǔn)確的類定義。(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建9

2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)從基類派生子類,再從子類派生下一層子類,這樣的一般-特殊結(jié)構(gòu)的類層次數(shù)應(yīng)該適當(dāng),不必過于細(xì)化,層次的深度應(yīng)該是有限的。一般來說,在一個(gè)中等規(guī)模(大約包含100個(gè)類)的系統(tǒng)中,類層次數(shù)應(yīng)保持為7±2。2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)103.設(shè)計(jì)簡單的類類設(shè)計(jì)應(yīng)該盡量小而簡單,便于開發(fā)和管理。定義很大的類,它所包含的屬性和服務(wù)相對就多,會(huì)給開發(fā)和使用帶來困難。實(shí)踐表明,簡單類一個(gè)類的定義在50行左右(或兩屏)。簡單類可按照下列的策略定義。(1)避免包含太多的屬性。一個(gè)類包含的屬性多少將決定類的復(fù)雜程度。一個(gè)類包含太多的屬性表明該類過于復(fù)雜了,因此,就可能有過多的作用在這些屬性上的服務(wù)。(2)避免提供太多服務(wù)。一個(gè)類包含的服務(wù)多少也是決定類的復(fù)雜程度的一個(gè)重要因素。太復(fù)雜的類所提供的服務(wù)肯定太多。一般來說,一個(gè)類提供的公共服務(wù)不要超過七個(gè)。3.設(shè)計(jì)簡單的類11(3)明確精練的定義。如果一個(gè)類的任務(wù)簡單了,則它的定義就明確精練了,通常任務(wù)簡單的類可用幾個(gè)簡單語句描述。(4)簡化對象間的通信。每個(gè)對象應(yīng)該獨(dú)立完成任務(wù)。也就是說,對象在完成任務(wù)時(shí),盡量不要依賴于其他對象的配合(幫助),對象之間過多的依賴會(huì)破壞類的簡明性和清晰性。雖然,遵循上述設(shè)計(jì)策略能設(shè)計(jì)出明確精練的較小的類,但在開發(fā)大型軟件系統(tǒng)中,必定會(huì)有大量較小的類設(shè)計(jì)出來,這將會(huì)導(dǎo)致類間的通信變復(fù)雜。采用劃分“主題”的方法,可以解決這個(gè)問題。(3)明確精練的定義。如果一個(gè)類的任務(wù)簡單了,則它12

4.設(shè)計(jì)簡單的協(xié)議消息中的參數(shù)越多表示對象之間傳遞的消息越復(fù)雜,同樣表明對象之間的依賴關(guān)系越復(fù)雜,即對象間的耦合度越高。一般來說,簡單消息中的參數(shù)不要超過三個(gè)。過多的參數(shù)會(huì)導(dǎo)致對象的修改較復(fù)雜,因?yàn)閷σ粋€(gè)對象的修改往往導(dǎo)致其他對象的修改。4.設(shè)計(jì)簡單的協(xié)議13

5.設(shè)計(jì)簡單的服務(wù)類中的服務(wù)應(yīng)該設(shè)計(jì)得既簡單又小,用3~5行源程序代碼比較適合。服務(wù)的源程序中不要包含過多的語句行,或者復(fù)雜的語句控制結(jié)構(gòu),如分支嵌套、循環(huán)嵌套和函數(shù)調(diào)用等。如果一個(gè)服務(wù)非常復(fù)雜,則應(yīng)該檢查該服務(wù)的控制結(jié)構(gòu),并進(jìn)行分解和簡化,盡量避免設(shè)計(jì)復(fù)雜的服務(wù)。5.設(shè)計(jì)簡單的服務(wù)146.減少設(shè)計(jì)變動(dòng)隨著設(shè)計(jì)方案逐漸成熟,改動(dòng)也應(yīng)該越來越小,這樣才能設(shè)計(jì)出優(yōu)良的結(jié)果。優(yōu)良的設(shè)計(jì)能保證軟件質(zhì)量,并能提高軟件的可重用性。因此,在設(shè)計(jì)中盡可能少改動(dòng),或者盡可能縮小修改的范圍。6.減少設(shè)計(jì)變動(dòng)1510.1.3系統(tǒng)分解與組織面向?qū)ο笤O(shè)計(jì)同過程設(shè)計(jì)一樣,自頂向下進(jìn)行功能分解。在設(shè)計(jì)比較復(fù)雜的應(yīng)用系統(tǒng)時(shí),將系統(tǒng)分解成若干個(gè)比較小的部分,再分別設(shè)計(jì)每個(gè)部分。這樣既簡化了應(yīng)用系統(tǒng),又降低了設(shè)計(jì)的難度,并有利于實(shí)現(xiàn)和維護(hù)。10.1.3系統(tǒng)分解與組織16系統(tǒng)是根據(jù)功能來分解的,我們將系統(tǒng)分解的各個(gè)部分(即系統(tǒng)的主要組成部分)稱為子系統(tǒng)。例如,編譯系統(tǒng)可劃分成詞法分析、語法分析、中間代碼生成、優(yōu)化、目標(biāo)代碼生成和出錯(cuò)處理等子系統(tǒng)。子系統(tǒng)不是單一的對象或功能,而是面向?qū)ο蠓治瞿P偷奈鍌€(gè)層次的集合。子系統(tǒng)的劃分不能太多,要與系統(tǒng)規(guī)模相匹配,最底層的子系統(tǒng)成為模塊。子系統(tǒng)間交互的形式和交互的信息由接口確定,因此,接口應(yīng)該簡單、明確,以便設(shè)計(jì)出相對獨(dú)立的子系統(tǒng),減少子系統(tǒng)的依賴性。系統(tǒng)是根據(jù)功能來分解的,我們將系統(tǒng)分解的各個(gè)部分(即17

1.面向?qū)ο笤O(shè)計(jì)的五個(gè)層次、四個(gè)部分面向?qū)ο笤O(shè)計(jì)是在面向?qū)ο蠓治瞿P偷幕A(chǔ)上建立對象模型的過程。兩個(gè)階段同樣是建立對象模型,只是面向?qū)ο蠓治鼋⒘藛栴}域的對象模型,而面向?qū)ο笤O(shè)計(jì)建立的是求解域的對象模型。因此,面向?qū)ο笤O(shè)計(jì)模型同樣由主題、類-&-對象、結(jié)構(gòu)、屬性和服務(wù)等五個(gè)層次組成,并且又?jǐn)U充了問題域(PDC)、人機(jī)交互(HIC)、任務(wù)管理(TMC)和數(shù)據(jù)管理(DMC)四個(gè)部分。1.面向?qū)ο笤O(shè)計(jì)的五個(gè)層次、四個(gè)部分18這五個(gè)層次就像五個(gè)透明的圖層,而整個(gè)模型像是由五個(gè)圖層(水平切片)合并而成的,五個(gè)層次一層比一層描述得更具體、更明確;四大組成部分又可想象成為整個(gè)模型的四個(gè)垂直切片。不同的應(yīng)用系統(tǒng)中,這四個(gè)子系統(tǒng)的側(cè)重程度和規(guī)模都不同,應(yīng)該根據(jù)系統(tǒng)規(guī)模的大小確定子系統(tǒng)的數(shù)目。在復(fù)雜的系統(tǒng)中,子系統(tǒng)可能要繼續(xù)分解;對于小系統(tǒng)來說,可能要合并小的子系統(tǒng)。典型的面向?qū)ο笤O(shè)計(jì)模型如圖10.1所示。這五個(gè)層次就像五個(gè)透明的圖層,而整個(gè)模型像是由五個(gè)圖19圖10.1典型的面向?qū)ο笤O(shè)計(jì)模型圖10.1典型的面向?qū)ο笤O(shè)計(jì)模型20

2.子系統(tǒng)間的交互方式在應(yīng)用系統(tǒng)中,子系統(tǒng)之間的關(guān)系可分為客戶/服務(wù)器關(guān)系和同等伙伴關(guān)系兩種。這兩種關(guān)系對應(yīng)兩種交互的方式,即客戶/服務(wù)器交互方式和同等伙伴交互方式。(1)客戶/服務(wù)器交互方式??蛻?服務(wù)器交互方式也稱單向交互方式。在客戶/服務(wù)器關(guān)系中,作為“客戶”的子系統(tǒng)調(diào)用作為“服務(wù)器”的子系統(tǒng),執(zhí)行某些服務(wù)后并返回結(jié)果。在該交互方式中,任何交互行為都是由客戶驅(qū)動(dòng)的,因此,作為客戶的子系統(tǒng)必須了解作為服務(wù)器的子系統(tǒng)的接口,而服務(wù)器不必了解客戶的接口。2.子系統(tǒng)間的交互方式21(2)同等伙伴交互方式。同等伙伴交互方式也稱雙向交互方式。在該交互方式中,每個(gè)子系統(tǒng)都可能調(diào)用其他子系統(tǒng),因此,每個(gè)子系統(tǒng)都必須了解其他子系統(tǒng)的接口,子系統(tǒng)間必須相互了解接口。與客戶/服務(wù)器關(guān)系比較,同等伙伴交互關(guān)系中子系統(tǒng)之間的交互更復(fù)雜,而且這種交互方式還可能構(gòu)成通信環(huán)路,會(huì)給設(shè)計(jì)帶來難度,并容易出現(xiàn)設(shè)計(jì)錯(cuò)誤。通常,系統(tǒng)使用客戶/服務(wù)器關(guān)系,因?yàn)閱蜗蚪换ジ菀桌斫?,也更容易設(shè)計(jì)和修改,而雙向交互相對困難些。(2)同等伙伴交互方式。同等伙伴交互方式也稱雙向交22

3.系統(tǒng)組織將子系統(tǒng)組織成完整的系統(tǒng)有兩種方式,即水平層次組織和垂直塊組織。1)層次組織層次組織是將子系統(tǒng)按層組織成為一個(gè)層次軟件系統(tǒng),每層是一個(gè)子系統(tǒng)。上層建立在下層的基礎(chǔ)上,下層為上層提供必要的服務(wù)。各層內(nèi)所包含的對象是相互獨(dú)立的,而不同層次上的對象,相互間有關(guān)聯(lián)。低層子系統(tǒng)提供服務(wù),相當(dāng)于服務(wù)器,上層子系統(tǒng)使用下層提供的服務(wù),相當(dāng)于客戶。這樣構(gòu)成上、下層之間的客戶/服務(wù)器關(guān)系。這種組織方式使軟件系統(tǒng)形成層次結(jié)構(gòu)。3.系統(tǒng)組織23層次結(jié)構(gòu)又可分為封閉式和開放式兩種。在封閉式結(jié)構(gòu)中,每層子系統(tǒng)只根據(jù)相鄰下層建立,且僅使用相鄰下層提供的服務(wù)。這種方式降低了各層次之間的相互依賴性,更容易理解和修改,因?yàn)橐粋€(gè)層次的接口只影響與其相鄰的上一層。在開放式結(jié)構(gòu)中,某層子系統(tǒng)可以使用其下面的任何一層子系統(tǒng)所提供的服務(wù)。該方式減少了各層上重新定義的服務(wù)的需求,使得整個(gè)系統(tǒng)更高效、更緊湊。但是,該方式?jīng)]有遵守信息隱藏的原則,對任何一個(gè)子系統(tǒng)的變更都會(huì)影響到更高層次的那些子系統(tǒng)。設(shè)計(jì)軟件系統(tǒng)時(shí)應(yīng)該權(quán)衡設(shè)計(jì)準(zhǔn)則的各因素而決定組織系統(tǒng)結(jié)構(gòu)的方式。層次結(jié)構(gòu)又可分為封閉式和開放式兩種。在封閉式結(jié)構(gòu)中,24通常,在需求陳述中只描述了系統(tǒng)的頂層和底層的內(nèi)容,頂層就是用戶看到的目標(biāo)系統(tǒng),底層則是可以使用的資源(如硬件、操作系統(tǒng)、數(shù)據(jù)庫等)。這兩層間差異很大,為了減少不同層次之間的概念差異,設(shè)計(jì)者必須引入一些中間層次來彌補(bǔ)。通常,在需求陳述中只描述了系統(tǒng)的頂層和底層的內(nèi)容,頂252)塊組織塊組織將系統(tǒng)垂直地分解成若干個(gè)相對獨(dú)立的、弱耦合的子系統(tǒng),一個(gè)子系統(tǒng)相當(dāng)于一塊,每塊提供一種類型的服務(wù)。在一個(gè)系統(tǒng)中,可利用層次和塊的混合組織方式。各種可能的組合結(jié)構(gòu),可以成功地把多個(gè)子系統(tǒng)組成一個(gè)完整的、混合結(jié)構(gòu)的軟件系統(tǒng)。在混合結(jié)構(gòu)組織中,同一層次可以由若干塊組成,而同一塊也可以分為若干層。大多數(shù)復(fù)雜系統(tǒng)組織采用層次與塊的混合結(jié)構(gòu)。例如,圖10.2表示一個(gè)典型應(yīng)用系統(tǒng)的組織結(jié)構(gòu)。2)塊組織26圖10.2典型應(yīng)用系統(tǒng)的組織結(jié)構(gòu)圖10.2典型應(yīng)用系統(tǒng)的組織結(jié)構(gòu)27

4.設(shè)計(jì)系統(tǒng)的拓?fù)浣Y(jié)構(gòu)構(gòu)成完整系統(tǒng)的拓?fù)浣Y(jié)構(gòu)有:管道型、樹型、星型等。為了減少子系統(tǒng)之間的交互次數(shù),設(shè)計(jì)時(shí)應(yīng)該采用與問題結(jié)構(gòu)相適應(yīng)的、盡可能簡單的拓?fù)浣Y(jié)構(gòu)。4.設(shè)計(jì)系統(tǒng)的拓?fù)浣Y(jié)構(gòu)2810.2問題域子系統(tǒng)設(shè)計(jì)問題域子系統(tǒng)也稱問題域部分(PDC,ProblemDomainComponent)。面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計(jì)是一個(gè)平滑的過渡,即沒有間斷沒有明確的分界線。面向?qū)ο蠓治鼋⑾到y(tǒng)的問題域?qū)ο竽P停嫦驅(qū)ο笤O(shè)計(jì)是建立求解域的對象模型。都是建模,但兩者必定性質(zhì)不同,分析建模可以與系統(tǒng)的具體實(shí)現(xiàn)無關(guān),設(shè)計(jì)建模則要考慮系統(tǒng)的具體實(shí)現(xiàn)環(huán)境的約束,如要考慮系統(tǒng)準(zhǔn)備使用的編程語言,可用的軟構(gòu)件庫(主要是類庫)以及程序員的編程經(jīng)驗(yàn)等約束問題。10.2問題域子系統(tǒng)設(shè)計(jì)問題域子系統(tǒng)也稱問題域部分29面向?qū)ο蠓椒ㄖ械囊粋€(gè)主要目標(biāo)是保持問題域組織框架的完整性、穩(wěn)定性,這樣可提高分析、設(shè)計(jì)到實(shí)現(xiàn)的追蹤性。因?yàn)橄到y(tǒng)的總體框架都是建立在問題域基礎(chǔ)上的,所以,在設(shè)計(jì)與實(shí)現(xiàn)過程中無論做怎樣的修改,例如增加具體類、屬性或服務(wù)等,都不會(huì)影響開發(fā)結(jié)果的穩(wěn)定性。穩(wěn)定性是在類似系統(tǒng)中實(shí)現(xiàn)重用分析、設(shè)計(jì)和編程結(jié)果的關(guān)鍵因素。為更好地支持系統(tǒng)的擴(kuò)充,也同樣需要穩(wěn)定性。面向?qū)ο蠓椒ㄖ械囊粋€(gè)主要目標(biāo)是保持問題域組織框架的完30問題域子系統(tǒng)可以直接引用面向?qū)ο蠓治鏊贸龅膯栴}域精確對象模型,該模型提供了完整的框架,面向?qū)ο笤O(shè)計(jì)就應(yīng)該保持該框架結(jié)構(gòu)。面向?qū)ο笤O(shè)計(jì)在分析模型的基礎(chǔ)上,從實(shí)現(xiàn)角度對問題域模型作一些補(bǔ)充或修改,修改包括增添、合并或分解類-&-對象、屬性及服務(wù),調(diào)整繼承關(guān)系等。如果問題域子系統(tǒng)相當(dāng)復(fù)雜龐大時(shí),則應(yīng)把它進(jìn)一步分解成若干個(gè)更小的子系統(tǒng)。下面講述在面向?qū)ο笤O(shè)計(jì)過程中,對問題域?qū)ο竽P妥鞯脑鲅a(bǔ)或修改的方法。問題域子系統(tǒng)可以直接引用面向?qū)ο蠓治鏊贸龅膯栴}域精31

1.調(diào)整需求當(dāng)用戶需求或外部環(huán)境發(fā)生了變化,或者分析員對問題域理解不透徹或缺乏領(lǐng)域?qū)<規(guī)椭?,以致建立了不能完整、?zhǔn)確地反映用戶真實(shí)需求的面向?qū)ο蠓治瞿P蜁r(shí),需要對面向?qū)ο蠓治鏊_定的系統(tǒng)需求進(jìn)行修改。一般來說,首先對面向?qū)ο蠓治瞿P妥骱唵蔚男薷模缓笤賹⑿薷暮蟮哪P鸵玫絾栴}域子系統(tǒng)中。1.調(diào)整需求32

2.重用現(xiàn)有的類設(shè)計(jì)時(shí)應(yīng)該在面向?qū)ο蠓治鼋Y(jié)果的基礎(chǔ)上實(shí)現(xiàn)現(xiàn)有類的重用,現(xiàn)有類是指面向?qū)ο蟪绦蛟O(shè)計(jì)語言所提供的類庫中的類。因此,在設(shè)計(jì)階段就要開始考慮重用,為代碼重用奠定基礎(chǔ)。如果確實(shí)需要?jiǎng)?chuàng)建新的類時(shí),則在設(shè)計(jì)新類時(shí),必須考慮它的可重用性。2.重用現(xiàn)有的類33下面介紹重用已有的類的過程。(1)選擇類庫中可重用的現(xiàn)有類,加入到問題域子系統(tǒng)中,并標(biāo)出現(xiàn)有類中對本系統(tǒng)無用的屬性和服務(wù),以致將無用的屬性和服務(wù)降到最低程度。(2)將問題域類中從現(xiàn)有類繼承來的屬性和服務(wù)標(biāo)出來,它們再?zèng)]有必要定義在問題域類內(nèi)了。(3)確定被重用的現(xiàn)有類和問題域類之間的一般-特殊關(guān)系,也就是說,以重用現(xiàn)有類為基類,派生出問題域類。(4)修改問題域類相關(guān)的關(guān)聯(lián),必要時(shí)用與重用現(xiàn)有類相關(guān)的關(guān)聯(lián)替換與問題域類相關(guān)的關(guān)聯(lián)。下面介紹重用已有的類的過程。34

3.組合問題域類通常,為了把問題域類組合在一個(gè)類庫中,需要引入一個(gè)根類(抽象類)將問題域類作為從屬類組織在一起。當(dāng)沒有更先進(jìn)的、更好的組合機(jī)制時(shí),才采用該種組合方法。另外,可通過建立協(xié)議來完成這種組織。3.組合問題域類35

4.增添一般化類以便建立協(xié)議在設(shè)計(jì)過程中,經(jīng)常發(fā)現(xiàn)許多具體類需要有一個(gè)相似的協(xié)議,即它們都需要定義一組相似的服務(wù)。這時(shí)可以引入一個(gè)附加的根類,以便建立這個(gè)協(xié)議。也就是說,定義公共服務(wù)集合,在特殊類中詳細(xì)定義這些服務(wù)。4.增添一般化類以便建立協(xié)議36

5.簡化繼承當(dāng)面向?qū)ο竽P椭械囊话?特殊結(jié)構(gòu)包括多繼承,而使用一種只有單繼承和無繼承的編程語言時(shí),需要對面向?qū)ο竽P妥饕恍┬薷?,即將多繼承化為單繼承,單繼承化為無繼承,用單繼承和無繼承編程語言來表達(dá)多繼承功能。5.簡化繼承37

6.實(shí)例設(shè)計(jì)在面向?qū)ο笤O(shè)計(jì)過程中,ATM系統(tǒng)的問題域子系統(tǒng)的結(jié)構(gòu)如圖10.3所示。把ATM系統(tǒng)的問題域子系統(tǒng),進(jìn)一步分解成更小的ATM站子系統(tǒng),中央計(jì)算機(jī)子系統(tǒng)和分行計(jì)算機(jī)子系統(tǒng),構(gòu)成星型拓?fù)浣Y(jié)構(gòu)。以中央計(jì)算機(jī)為中心向外連接(用專用電話線),與所有ATM站和分行計(jì)算機(jī)通信。區(qū)分每個(gè)ATM站和每臺分行計(jì)算機(jī)連向中央計(jì)算機(jī)的電話線,分別用ATM站號和分行代碼來實(shí)現(xiàn)。這里假設(shè)面向?qū)ο蠓治瞿P褪峭暾模诿嫦驅(qū)ο笤O(shè)計(jì)過程中對問題域模型不必作實(shí)質(zhì)性的修改或擴(kuò)充了。6.實(shí)例設(shè)計(jì)38圖10.3ATM系統(tǒng)問題域子系統(tǒng)的結(jié)構(gòu)圖10.3ATM系統(tǒng)問題域子系統(tǒng)的結(jié)構(gòu)3910.3人機(jī)交互子系統(tǒng)設(shè)計(jì)人機(jī)交互子系統(tǒng)也稱人機(jī)交互部分(HIC,HumanInteractionComponent)。人機(jī)交互部分的設(shè)計(jì)結(jié)果,將對用戶使用系統(tǒng)帶來很大影響。人機(jī)界面設(shè)計(jì)得好,則會(huì)使系統(tǒng)產(chǎn)生魅力,吸引用戶經(jīng)常使用系統(tǒng),并覺得與系統(tǒng)的交互是友好的、興奮的,還能提高工作效率;反之不然。為了得到良好的人機(jī)界面,在分析階段要對用戶進(jìn)行分析,在設(shè)計(jì)階段要延續(xù)該分析,包括對用戶、交互時(shí)間、交互技術(shù)等進(jìn)行分析。10.3人機(jī)交互子系統(tǒng)設(shè)計(jì)人機(jī)交互子系統(tǒng)也稱人機(jī)交40在人機(jī)交互子系統(tǒng)設(shè)計(jì)中,在初步分析用戶界面需求的基礎(chǔ)上,對人機(jī)交互的細(xì)節(jié)進(jìn)行詳細(xì)設(shè)計(jì),包括對窗口、對話框和報(bào)表的形式,設(shè)計(jì)命令層次組織等內(nèi)容的設(shè)計(jì)。設(shè)計(jì)人機(jī)交互子系統(tǒng)的關(guān)鍵,是使用原型技術(shù)。建立人機(jī)界面的原型,征求用戶的意見,獲取用戶的評價(jià),也是設(shè)計(jì)人機(jī)界面的一種有效途徑。在人機(jī)交互子系統(tǒng)設(shè)計(jì)中,在初步分析用戶界面需求的基礎(chǔ)41

1.設(shè)計(jì)人機(jī)交互界面的準(zhǔn)則要把人機(jī)交互界面設(shè)計(jì)得友好,讓用戶滿意,應(yīng)該遵循下列準(zhǔn)則:(1)一致性。在人機(jī)交互界面中,術(shù)語、步驟、動(dòng)作的使用都要一致。(2)減少步驟。人機(jī)交互界面設(shè)計(jì)時(shí),應(yīng)盡量減少為完成某個(gè)操作而敲擊鍵盤、點(diǎn)擊鼠標(biāo)、點(diǎn)擊下拉菜單的次數(shù),并且適應(yīng)不同技術(shù)水平的用戶,還得有極小的響應(yīng)時(shí)間,特別應(yīng)該為熟練用戶提供簡捷的操作方法(例如熱鍵)。1.設(shè)計(jì)人機(jī)交互界面的準(zhǔn)則42(3)及時(shí)提供反饋信息。在運(yùn)行時(shí)間較長時(shí),應(yīng)該有提示使得用戶不感到寂寞。每當(dāng)要用戶等待系統(tǒng)完成一個(gè)活動(dòng)時(shí),系統(tǒng)都應(yīng)該向用戶提供有意義的、及時(shí)的反饋信息,以便能夠讓用戶知道系統(tǒng)當(dāng)前已經(jīng)完成該活動(dòng)的進(jìn)度如何,是否正常等信息,不要“啞播放”。(4)提供撤消命令。人與系統(tǒng)交互時(shí)難免會(huì)出錯(cuò)誤,系統(tǒng)應(yīng)該提供“撤消(Undo)”命令,以便用戶發(fā)現(xiàn)錯(cuò)誤時(shí)能及時(shí)撤消錯(cuò)誤操作,進(jìn)行補(bǔ)救處理。(3)及時(shí)提供反饋信息。在運(yùn)行時(shí)間較長時(shí),應(yīng)該有提43(5)減少記憶。好的界面不需要用戶記憶使用步驟,操作比較簡單。(6)易學(xué)易用。界面應(yīng)該易學(xué)易用,應(yīng)該有聯(lián)機(jī)學(xué)習(xí)、操作手冊以及其他參考資料,以便用戶在需要時(shí)可隨時(shí)參閱。(7)富有吸引力。給用戶設(shè)計(jì)友好的、趣味的、具有吸引力的人機(jī)交互界面,從而吸引用戶使用。(5)減少記憶。好的界面不需要用戶記憶使用步驟,操44

2.設(shè)計(jì)人機(jī)交互子系統(tǒng)的策略1)分類用戶人機(jī)交互界面的兩個(gè)要點(diǎn)是人如何命令系統(tǒng)及系統(tǒng)如何向用戶提交信息。因此,設(shè)計(jì)好人機(jī)交互界面的首要任務(wù)是認(rèn)真研究使用系統(tǒng)的用戶,深入到用戶的工作現(xiàn)場,仔細(xì)觀察用戶的工作流程。觀察用戶必須完成哪些工作,如何工作的,思考完成這些工作在系統(tǒng)中應(yīng)該提供哪些工具以及如何實(shí)現(xiàn),如何使工具使用起來更方便、更有效。為了設(shè)計(jì)出符合用戶需要的界面,應(yīng)該深入了解用戶的需要與愛好,可將用戶按照不同角度進(jìn)行分類。2.設(shè)計(jì)人機(jī)交互子系統(tǒng)的策略45①按技能分類(初級/中級/高級)。②按職務(wù)分類(總經(jīng)理/部門經(jīng)理/職員)。③按工作性質(zhì)分類(行政人員/技術(shù)人員)。④按專業(yè)知識分類(外專業(yè)/專業(yè)/系統(tǒng)員/程序員)。①按技能分類(初級/中級/高級)。462)描述用戶及其任務(wù)腳本對以上定義的每類用戶的情況,就下述問題進(jìn)行考慮并制表,如表10.1所示。表10.1描述用戶及其任務(wù)的腳本內(nèi)容①用戶類型②使用系統(tǒng)的目的③特征(年齡、性別、受教育程度、限制因素等)④關(guān)鍵的成功因素(需求、愛好、習(xí)慣等)⑤技能水平⑥完成本職工作的腳2)描述用戶及其任務(wù)腳本表10.1描述用戶及其473)設(shè)計(jì)命令層設(shè)計(jì)命令層是界面設(shè)計(jì)的重要部分,一般包含下列工作。(1)研究現(xiàn)有的人機(jī)交互的準(zhǔn)則。命令層設(shè)計(jì)有許多方式,但目前最受用戶喜愛的是Windows界面,Windows已經(jīng)成了微機(jī)上圖形用戶界面事實(shí)上的工業(yè)標(biāo)準(zhǔn)。所有Windows應(yīng)用程序的界面是一致的,窗口布局、菜單、術(shù)語等使用,以及界面的風(fēng)格、習(xí)慣等都是一致的,Windows的命令層設(shè)計(jì)采用了下拉式菜單和彈出式菜單,而且各菜單的組織方式也類似。設(shè)計(jì)圖形用戶界面時(shí),應(yīng)該保持與普通Windows應(yīng)用程序界面一致,并遵守廣大用戶習(xí)慣的約定,這樣才會(huì)被用戶接受和喜愛。3)設(shè)計(jì)命令層48(2)設(shè)計(jì)初始命令層。所謂命令層,是將系統(tǒng)中的可用服務(wù)用過程抽象機(jī)制組織起來的一種體現(xiàn)。設(shè)計(jì)時(shí)首先從服務(wù)的基本過程抽象開始,確定系統(tǒng)中最上層(如大的操作,相近小命令的總稱,多層命令的最上層等),然后再修改它們,以符合目標(biāo)系統(tǒng)的特定需要。(2)設(shè)計(jì)初始命令層。所謂命令層,是將系統(tǒng)中的可用49(3)優(yōu)化命令層。為使命令層完善、合理以及使用方便,應(yīng)該考慮下列一些因素,作進(jìn)一步修改。●排列:檢查每個(gè)服務(wù)的名字,并將服務(wù)排在命令層中的合適位置??砂聪到y(tǒng)功能(服務(wù))順序排列,也可以按用戶習(xí)慣的工作順序排序?!裾w-部分組合:通過服務(wù)本身發(fā)現(xiàn)整體-部分關(guān)系,來幫助在命令層中對服務(wù)組織和分組。(3)優(yōu)化命令層。為使命令層完善、合理以及使用方便,50●寬度和深度:通常,命令層中同一層顯示命令的個(gè)數(shù)(寬度),設(shè)計(jì)為(7±2)個(gè)比較合適;命令層中層數(shù)(深度)設(shè)計(jì)為3層比較合適。這樣符合人的短期記憶能力?!駵p少操作步驟:做同樣的工作,按鍵或拖動(dòng)鼠標(biāo)越少越好。并為高級用戶提供簡捷的操作方法?!駥挾群蜕疃龋和ǔ#顚又型粚语@示命令的個(gè)數(shù)(514)設(shè)計(jì)人機(jī)交互類人機(jī)交互類設(shè)計(jì),可在操作系統(tǒng)及編程語言的基礎(chǔ)上,利用類庫中現(xiàn)有的、適用的類來派生出符合目標(biāo)系統(tǒng)需要的類,作為人機(jī)交互類。4)設(shè)計(jì)人機(jī)交互類5210.4任務(wù)管理子系統(tǒng)設(shè)計(jì)

1.分析并發(fā)性不僅在系統(tǒng)軟件中有并發(fā)行為,而且在應(yīng)用軟件中也有并發(fā)行為,因此,實(shí)現(xiàn)中存在并發(fā)行為。在程序的執(zhí)行時(shí)間上與其他程序有交疊的現(xiàn)象,這種時(shí)間交疊現(xiàn)象稱為“并發(fā)性”。因此,任務(wù)管理子系統(tǒng)在設(shè)計(jì)時(shí),應(yīng)找出并分析系統(tǒng)中任務(wù)的并發(fā)性。10.4任務(wù)管理子系統(tǒng)設(shè)計(jì)1.分析并發(fā)性53分析并發(fā)性的主要依據(jù)是系統(tǒng)的動(dòng)態(tài)模型。如果對象間不存在交互,或者說它們能同時(shí)接收事件,那么這兩個(gè)對象是并發(fā)的。通過檢查各個(gè)對象的狀態(tài)圖及它們之間交換的事件,把若干個(gè)非并發(fā)的對象歸并到一起。獨(dú)立的任務(wù)把必須并發(fā)進(jìn)行的行為分離開來。這種并發(fā)行為既可以在不同的處理器上實(shí)現(xiàn),也可以在單個(gè)處理器上利用多任務(wù)操作系統(tǒng)仿真實(shí)現(xiàn)。一般來說,劃分任務(wù),是為了簡化系統(tǒng)中必須的并發(fā)行為的設(shè)計(jì)和編碼。分析并發(fā)性的主要依據(jù)是系統(tǒng)的動(dòng)態(tài)模型。如果對象間不存54

2.設(shè)計(jì)任務(wù)管理子系統(tǒng)1)確定事件驅(qū)動(dòng)任務(wù)由某個(gè)事件觸發(fā)而引起的任務(wù)稱事件驅(qū)動(dòng)任務(wù)。事件通常表明一個(gè)設(shè)備傳輸過來的一個(gè)信息,事件是由設(shè)備引起的。任務(wù)是對事件的處理。一個(gè)任務(wù)可以設(shè)計(jì)成由一個(gè)事件來觸發(fā)(驅(qū)動(dòng)),該事件常常是對一些數(shù)據(jù)的到達(dá)發(fā)信號,而這些數(shù)據(jù)可能來自輸入數(shù)據(jù)行,或者另一個(gè)任務(wù)寫入的數(shù)據(jù)緩沖區(qū)。這類任務(wù)可能主要完成通信工作,例如,與設(shè)備、屏幕窗口、其他任務(wù)、子系統(tǒng)、另一個(gè)處理器或其他系統(tǒng)通信。2.設(shè)計(jì)任務(wù)管理子系統(tǒng)55事件驅(qū)動(dòng)任務(wù)的工作過程為:①任務(wù)處于睡眠狀態(tài)(不消耗處理器時(shí)間),等待來自數(shù)據(jù)行或其他數(shù)據(jù)源的中斷;②接收到中斷就喚醒了該任務(wù);③閱讀數(shù)據(jù)并把數(shù)據(jù)放入內(nèi)存緩沖區(qū)或其他目的地;④向需要知道此事件的對象發(fā)出通知,然后該任務(wù)又回到睡眠狀態(tài)。事件驅(qū)動(dòng)任務(wù)的工作過程為:562)確定時(shí)鐘驅(qū)動(dòng)任務(wù)按特定的時(shí)間間隔被觸發(fā)后執(zhí)行某些處理的任務(wù)稱時(shí)鐘驅(qū)動(dòng)任務(wù)。例如,某些設(shè)備需要周期性地獲得數(shù)據(jù);某些人機(jī)接口、子系統(tǒng)、任務(wù)、處理器或其他系統(tǒng)也可能需要周期性地通信。時(shí)鐘驅(qū)動(dòng)型任務(wù)的工作過程為:①任務(wù)設(shè)置了喚醒時(shí)間后進(jìn)入睡眠狀態(tài);②等待來自系統(tǒng)的中斷;③接收到中斷,任務(wù)被喚醒;④進(jìn)行處理,通知有關(guān)的對象;⑤該任務(wù)又回到睡眠狀態(tài)。2)確定時(shí)鐘驅(qū)動(dòng)任務(wù)573)確定優(yōu)先任務(wù)根據(jù)事件的優(yōu)先級高低來做處理的任務(wù)稱優(yōu)先級任務(wù)。它可以滿足高優(yōu)先級或低優(yōu)先級的處理需求。(1)高優(yōu)先級:有些服務(wù)可能是高優(yōu)先級的,需要把這類服務(wù)劃分成獨(dú)立的任務(wù),使該類服務(wù)在一個(gè)嚴(yán)格限定的時(shí)間內(nèi)完成。(2)低優(yōu)先級:有些服務(wù)是低優(yōu)先級的,屬于低優(yōu)先級處理(通常指那些后臺處理)。設(shè)計(jì)時(shí)可能用附加的任務(wù)把這種服務(wù)分離出來。任務(wù)的劃分是根據(jù)時(shí)間決定優(yōu)先級,根據(jù)優(yōu)先級的高低劃分出輕重緩急的任務(wù)。3)確定優(yōu)先任務(wù)584)確定關(guān)鍵任務(wù)設(shè)計(jì)時(shí)應(yīng)該分離出那些對于系統(tǒng)的成敗特別關(guān)鍵的任務(wù),該類任務(wù)通常都有嚴(yán)格的可靠性、安全性要求。設(shè)計(jì)時(shí)可用附加的任務(wù)來分離出關(guān)鍵的任務(wù),應(yīng)該進(jìn)行深入細(xì)致的設(shè)計(jì)、編碼和測試,以滿足高可靠性、安全性處理的要求。也就是說,根據(jù)需求決定任務(wù)的主次,保證關(guān)鍵任務(wù)。4)確定關(guān)鍵任務(wù)595)確定協(xié)調(diào)任務(wù)當(dāng)系統(tǒng)中有三個(gè)以上任務(wù)時(shí),就應(yīng)該考慮增加一個(gè)任務(wù),用來協(xié)調(diào)任務(wù)之間的關(guān)系,該任務(wù)稱為協(xié)調(diào)任務(wù)。從一個(gè)任務(wù)到另一個(gè)任務(wù)的轉(zhuǎn)換時(shí)間叫現(xiàn)場轉(zhuǎn)換時(shí)間。協(xié)調(diào)任務(wù)用來控制現(xiàn)場轉(zhuǎn)換時(shí)間時(shí),將會(huì)給系統(tǒng)設(shè)計(jì)帶來困難,但是引入?yún)f(xié)調(diào)任務(wù)可為封裝不同任務(wù)之間的協(xié)調(diào)控制帶來好處。該任務(wù)的行為可用狀態(tài)轉(zhuǎn)換矩陣來描述。這樣的任務(wù)應(yīng)該只做協(xié)調(diào)工作,不必分配它其他的工作。5)確定協(xié)調(diào)任務(wù)606)審查每個(gè)任務(wù)對任務(wù)的性質(zhì)進(jìn)行審查,去掉人為的、不必要的任務(wù),要使任務(wù)數(shù)保持到最少。設(shè)計(jì)多任務(wù)系統(tǒng)的主要問題是,設(shè)計(jì)者常常為了自己設(shè)計(jì)和編程的方便而增加任務(wù)。這樣既增加了總體設(shè)計(jì)的技術(shù)復(fù)雜度,又降低了系統(tǒng)的可理解性,從而也加大了系統(tǒng)維護(hù)的難度。6)審查每個(gè)任務(wù)617)定義每個(gè)任務(wù)任務(wù)定義包括以下內(nèi)容:(1)任務(wù)的內(nèi)容。首先給任務(wù)命名,然后簡要地描述任務(wù)。如果一個(gè)任務(wù)可以分解成多個(gè)任務(wù),則修改該服務(wù)的名稱以及描述,使每個(gè)服務(wù)映射到一個(gè)任務(wù)。(2)如何協(xié)調(diào)。定義每個(gè)任務(wù)怎樣協(xié)調(diào)工作。指出它是任務(wù)事件驅(qū)動(dòng)的還是時(shí)鐘驅(qū)動(dòng)的。對于事件驅(qū)動(dòng)的任務(wù),描述觸發(fā)該任務(wù)的事件;對時(shí)鐘驅(qū)動(dòng)的任務(wù),描述在觸發(fā)之前所經(jīng)過的時(shí)間間隔,同時(shí)指出是一次性的還是重復(fù)的時(shí)間間隔。7)定義每個(gè)任務(wù)62(3)如何通信。定義每個(gè)任務(wù)如何通信。指出任務(wù)從哪里取得數(shù)據(jù)值,往哪里送數(shù)據(jù)。任務(wù)定義模板如下:TaskNameTaskDescriptionTaskProridyTaskServicesincluded CoordinatesByCommunicatesByEndTask(3)如何通信。定義每個(gè)任務(wù)如何通信。指出任務(wù)從哪6310.5數(shù)據(jù)管理子系統(tǒng)設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)也稱數(shù)據(jù)管理部分(DMC,DataManagementComponent)。數(shù)據(jù)管理子系統(tǒng)為面向?qū)ο笤O(shè)計(jì)模型提供了在特定的數(shù)據(jù)管理系統(tǒng)之上,存儲(chǔ)或檢索對象的基本結(jié)構(gòu)。設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)的目的是,將目標(biāo)軟件系統(tǒng)中依賴開發(fā)平臺的數(shù)據(jù)存取部分與其他功能分離,數(shù)據(jù)存取通過一般的數(shù)據(jù)存儲(chǔ)管理模式(文件、關(guān)系數(shù)據(jù)庫或面向?qū)ο髷?shù)據(jù)庫)實(shí)現(xiàn),但實(shí)現(xiàn)細(xì)節(jié)集中在數(shù)據(jù)管理子系統(tǒng)中。這樣既有利于軟件的擴(kuò)充、移植和維護(hù),又簡化了軟件設(shè)計(jì)、編碼和測試的過程。10.5數(shù)據(jù)管理子系統(tǒng)設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)也稱數(shù)據(jù)管6410.5.1選擇數(shù)據(jù)存儲(chǔ)管理模式選擇數(shù)據(jù)存儲(chǔ)管理模式是數(shù)據(jù)管理子系統(tǒng)設(shè)計(jì)的首要任務(wù)??晒┻x擇的數(shù)據(jù)存儲(chǔ)管理模式有三種:文件管理系統(tǒng)、關(guān)系數(shù)據(jù)庫系統(tǒng)和面向?qū)ο蠊芾硐到y(tǒng)。設(shè)計(jì)者應(yīng)該根據(jù)應(yīng)用系統(tǒng)的特點(diǎn),選擇一種合適的數(shù)據(jù)存儲(chǔ)管理模式。1.文件管理系統(tǒng)文件管理系統(tǒng)提供了基本的文件處理和分類能力。它的特點(diǎn)是長期保存數(shù)據(jù),成本低而且簡單。但文件操作繁瑣,實(shí)現(xiàn)比較困難,必須編寫大量的代碼。此外,文件管理系統(tǒng)是操作系統(tǒng)的一個(gè)組成部分,不同操作系統(tǒng)的文件管理系統(tǒng)往往有明顯的差異。10.5.1選擇數(shù)據(jù)存儲(chǔ)管理模式65

2.關(guān)系數(shù)據(jù)庫管理系統(tǒng)關(guān)系數(shù)據(jù)庫管理系統(tǒng)建立在關(guān)系理論基礎(chǔ)上。它用若干個(gè)表來管理數(shù)據(jù),表中的每一行表示表中的一組值,每一列有一個(gè)單一的(原子)值在其中。它具有以下優(yōu)點(diǎn):(1)提供了各種最基本的數(shù)據(jù)管理功能。例如,中斷恢復(fù)、多用戶共享、多應(yīng)用共享、完整性和事務(wù)支持等。(2)為多種應(yīng)用提供了一致的接口。(3)支持標(biāo)準(zhǔn)化的SQL語言。2.關(guān)系數(shù)據(jù)庫管理系統(tǒng)66關(guān)系數(shù)據(jù)庫管理系統(tǒng)為了做到通用和一致性,實(shí)現(xiàn)相當(dāng)復(fù)雜且存在一定不足,以致限制了它的普遍使用。缺點(diǎn)如下:(1)運(yùn)行開銷大。即使只完成簡單的事務(wù)(例如,只修改表中的一行)也需要較長的時(shí)間。(2)不能滿足高級應(yīng)用的需求。關(guān)系數(shù)據(jù)庫管理系統(tǒng)是為商務(wù)應(yīng)用服務(wù)的,商務(wù)應(yīng)用中數(shù)據(jù)量雖大,但數(shù)據(jù)結(jié)構(gòu)卻比較簡單。一般來說,在數(shù)據(jù)類型豐富或操作不標(biāo)準(zhǔn)的應(yīng)用中,很難用關(guān)系數(shù)據(jù)庫管理系統(tǒng)實(shí)現(xiàn)。(3)與程序設(shè)計(jì)語言的連接不自然。大多數(shù)程序設(shè)計(jì)語言本質(zhì)上是過程性的,每次只能處理一個(gè)記錄。而SQL語言支持面向集合的操作,是一種非過程性語言,兩者之間存在差異,連接不方便。關(guān)系數(shù)據(jù)庫管理系統(tǒng)為了做到通用和一致性,實(shí)現(xiàn)相當(dāng)復(fù)雜67

3.面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)(OODB,ObjectOrientedDataBase)是一種新技術(shù),它擴(kuò)展設(shè)計(jì)途徑如下:(1)在關(guān)系數(shù)據(jù)庫的基礎(chǔ)上,加強(qiáng)了一些操作功能。例如,增加了抽象數(shù)據(jù)類型和繼承性,以及創(chuàng)建及管理類和對象的通用服務(wù)。這種OODB稱為擴(kuò)充的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。(2)面向?qū)ο蟪绦蛟O(shè)計(jì)語言中擴(kuò)充了數(shù)據(jù)庫的功能。例如,擴(kuò)充了存儲(chǔ)和管理對象的語法和功能。這種OODB稱為擴(kuò)充的面向?qū)ο蟪绦蛟O(shè)計(jì)語言。3.面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)68(3)從面向?qū)ο蠓椒ū旧沓霭l(fā)來設(shè)計(jì)數(shù)據(jù)庫。開發(fā)人員可以用統(tǒng)一的面向?qū)ο笥^點(diǎn)進(jìn)行設(shè)計(jì),不再需要區(qū)分存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)和程序數(shù)據(jù)結(jié)構(gòu)。首先保留對象值,然后在需要時(shí)創(chuàng)建該對象的一個(gè)副本。這是大多數(shù)對象數(shù)據(jù)管理模式都采用的“復(fù)制對象”的方法。擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語言則支持了“永久對象”方法:確切地存儲(chǔ)同樣的對象,包括對象的內(nèi)部標(biāo)識,而不是僅僅存儲(chǔ)一個(gè)對象的副本。使用這種方法,當(dāng)一個(gè)對象從存儲(chǔ)庫檢索到時(shí),它與先前存在的那個(gè)對象是完全相同的?!坝谰脤ο蟆狈椒?,為在多用戶環(huán)境下從對象服務(wù)器中共享對象奠定了基礎(chǔ)。(3)從面向?qū)ο蠓椒ū旧沓霭l(fā)來設(shè)計(jì)數(shù)據(jù)庫。開發(fā)人員6910.5.2設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)無論基于哪種數(shù)據(jù)管理模式,設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)都包括設(shè)計(jì)數(shù)據(jù)格式和設(shè)計(jì)相應(yīng)的服務(wù)兩部分。

1.設(shè)計(jì)數(shù)據(jù)格式不同的數(shù)據(jù)存儲(chǔ)管理模式,其設(shè)計(jì)數(shù)據(jù)格式的方法也不同。下面分別介紹每種數(shù)據(jù)存儲(chǔ)管理模式的數(shù)據(jù)格式設(shè)計(jì)方法。10.5.2設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)701)文件系統(tǒng)文件系統(tǒng)設(shè)計(jì)數(shù)據(jù)格式的步驟包括:(1)列表給出每個(gè)類的屬性(既包括類本身的定義屬性又包括繼承下來的類屬性);(2)將所有屬性表格規(guī)范為第一范式;(3)為每個(gè)類定義一個(gè)文件;(4)測量性能和需要的存儲(chǔ)容量能否滿足實(shí)際性能要求;1)文件系統(tǒng)71(5)若文件太多時(shí),則把一般-特殊結(jié)構(gòu)的對象文件合并成一個(gè)文件,以減少文件數(shù)量。必要時(shí)把某些屬性組合起來,并用某種編碼值表示這些屬性,而不再分別使用獨(dú)立的域表示每個(gè)屬性。這樣做可以減少所需要的存儲(chǔ)空間,但是增加了處理時(shí)間。(5)若文件太多時(shí),則把一般-特殊結(jié)構(gòu)的對象文722)關(guān)系數(shù)據(jù)庫管理系統(tǒng)關(guān)系數(shù)據(jù)庫管理系統(tǒng)設(shè)計(jì)數(shù)據(jù)格式的步驟為:(1)列出每個(gè)類的屬性表;(2)將所有屬性表格規(guī)范為第三范式;(3)為每個(gè)類定義一個(gè)數(shù)據(jù)庫表。(4)測量性能和需要的存儲(chǔ)容量能否滿足實(shí)際性能要求;(5)若不滿足再返回第二步設(shè)計(jì)規(guī)范,修改原來設(shè)計(jì)的第三范式,以滿足性能和存儲(chǔ)需求。2)關(guān)系數(shù)據(jù)庫管理系統(tǒng)733)面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)設(shè)計(jì)數(shù)據(jù)格式的步驟為:(1)對于在關(guān)系數(shù)據(jù)庫上擴(kuò)充的面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng),其處理步驟與基于關(guān)系數(shù)據(jù)庫的處理步驟類似。(2)對于由面向?qū)ο蟪绦蛟O(shè)計(jì)語言擴(kuò)充而來的面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng),則不需要對屬性進(jìn)行規(guī)范化,因?yàn)閿?shù)據(jù)庫管理系統(tǒng)本身具有把對象值映射成存儲(chǔ)值的功能。3)面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)74

2.設(shè)計(jì)相應(yīng)的服務(wù)如果某個(gè)類的對象需要存儲(chǔ)起來,則在該類中應(yīng)該增加一個(gè)屬性和服務(wù),用于完成存儲(chǔ)對象自身的操作。通常把增加的屬性和服務(wù)與對象中其他的屬性和服務(wù)分離,作為“隱含”的屬性和服務(wù),在類-&-對象的定義中描述,不在面向?qū)ο笤O(shè)計(jì)模型的屬性和服務(wù)層中顯式地表示出來?!按鎯?chǔ)自己”的屬性和服務(wù)形成了問題域子系統(tǒng)與數(shù)據(jù)管理子系統(tǒng)之間必要的橋梁。若系統(tǒng)支持多繼承,那么用于“存儲(chǔ)自己”的屬性和服務(wù)應(yīng)該專門定義在一個(gè)基類“ObjectServer(對象服務(wù)器)”中,通過繼承關(guān)系使那些需要存儲(chǔ)對象的類從基類中獲得該屬性和服務(wù)。2.設(shè)計(jì)相應(yīng)的服務(wù)75同設(shè)計(jì)數(shù)據(jù)格式一樣,不同的數(shù)據(jù)存儲(chǔ)管理模式,其設(shè)計(jì)相應(yīng)的服務(wù)的方法也不同。下面分別介紹每種數(shù)據(jù)存儲(chǔ)管理模式的相應(yīng)服務(wù)的設(shè)計(jì)方法。1)文件系統(tǒng)采用文件系統(tǒng)設(shè)計(jì)時(shí),對象需要確定打開哪個(gè)文件,在文件中如何定位,如何檢索出舊值(如果存在)以及如何更新值。因此,需要定義一個(gè)“ObjectServer類”,該類應(yīng)該提供兩個(gè)服務(wù):(1)告知對象如何存儲(chǔ)自身;(2)檢索已存儲(chǔ)的對象(查找、取值、創(chuàng)建或初始化對象),以便把這些對象提供給其他子系統(tǒng)使用。同設(shè)計(jì)數(shù)據(jù)格式一樣,不同的數(shù)據(jù)存儲(chǔ)管理模式,其設(shè)計(jì)相762)關(guān)系數(shù)據(jù)庫管理系統(tǒng)采用關(guān)系數(shù)據(jù)庫管理系統(tǒng)設(shè)計(jì)時(shí),對象需確定訪問哪些數(shù)據(jù)庫表,如何檢索到所需要的行(元組),如何檢索出舊值(如果存在)以及如何更新值。因此,還應(yīng)該專門定義一個(gè)“ObjectServer”類,并聲明它的對象。該類應(yīng)提供下列服務(wù):(1)告知對象如何存儲(chǔ)自身;(2)檢索已存儲(chǔ)的對象(查找,取值,創(chuàng)建或初始化對象),以便由其他子系統(tǒng)使用這些對象。2)關(guān)系數(shù)據(jù)庫管理系統(tǒng)773)面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)(1)對于在關(guān)系數(shù)據(jù)庫上擴(kuò)充的面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng),與使用關(guān)系數(shù)據(jù)庫管理系統(tǒng)時(shí)方法相同。(2)對于由面向?qū)ο蟪绦蛟O(shè)計(jì)語言擴(kuò)充而來的面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng),沒有必要定義專門的類,因該系統(tǒng)已經(jīng)提供了為每個(gè)對象“存儲(chǔ)自己”的行為。只需給需要長期保存的對象加個(gè)標(biāo)記,這類對象的存儲(chǔ)和恢復(fù)由面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)負(fù)責(zé)完成。3)面向?qū)ο髷?shù)據(jù)庫管理系統(tǒng)783.實(shí)例設(shè)計(jì)用圖10.3所示的ATM系統(tǒng)為例,具體說明數(shù)據(jù)管理子系統(tǒng)的設(shè)計(jì)方法。假設(shè)采用關(guān)系數(shù)據(jù)庫管理系統(tǒng)存儲(chǔ)數(shù)據(jù)。從系統(tǒng)可知,在分行計(jì)算機(jī)中存放的是惟一的永久性數(shù)據(jù)。因?yàn)橛卸鄠€(gè)并發(fā)事務(wù)同時(shí)訪問這些數(shù)據(jù),而且必須保持?jǐn)?shù)據(jù)的一致性和完整性。因此,應(yīng)該把每個(gè)事務(wù)作為一個(gè)不可分割的批操作來處理,由事務(wù)封鎖賬戶直到該事務(wù)結(jié)束為止。需要存儲(chǔ)的對象在該例中主要是賬戶類的對象。為了支持?jǐn)?shù)據(jù)管理子系統(tǒng)的實(shí)現(xiàn),賬戶類對象必須知道自己是怎樣存儲(chǔ)的,下面介紹兩種方法可完成這個(gè)任務(wù)。3.實(shí)例設(shè)計(jì)79須知道自己是怎樣存儲(chǔ)的,下面介紹兩種方法可完成這個(gè)任務(wù)。(1)由每個(gè)對象自身存儲(chǔ)。賬戶類對象在接到“存儲(chǔ)自己”的消息后,需要增加一個(gè)屬性和一個(gè)服務(wù)來定義存儲(chǔ)自己的行為,以便知道怎樣把自身存儲(chǔ)起來。(2)由數(shù)據(jù)管理子系統(tǒng)負(fù)責(zé)存儲(chǔ)對象。賬戶類對象在接到“存儲(chǔ)自己”的消息后,知道應(yīng)該發(fā)送什么消息到數(shù)據(jù)管理子系統(tǒng),以便把它的狀態(tài)由數(shù)據(jù)管理子系統(tǒng)保存起來,因此也需要增加屬性和服務(wù)來定義這些行為。使用這種方法的優(yōu)點(diǎn)是沒有必要修改問題域子系統(tǒng)。須知道自己是怎樣存儲(chǔ)的,下面介紹兩種方法可完成這個(gè)任80應(yīng)該定義一個(gè)數(shù)據(jù)管理類ObjectServer,并聲明它的對象。這個(gè)類提供下列服務(wù):●通知對象保存自身或保存需長期存儲(chǔ)的對象的狀態(tài);●檢索已存儲(chǔ)的對象并可使其存儲(chǔ)和恢復(fù)。應(yīng)該定義一個(gè)數(shù)據(jù)管理類ObjectServer,并8110.6服務(wù)與關(guān)聯(lián)的設(shè)計(jì)10.6.1設(shè)計(jì)服務(wù)設(shè)計(jì)類中的服務(wù)是面向?qū)ο笤O(shè)計(jì)的一項(xiàng)重要內(nèi)容。因?yàn)槊嫦驅(qū)ο蠓治鼋⑵饋淼膶ο竽P屯ǔ2]有詳細(xì)描述類中的服務(wù),而面向?qū)ο笤O(shè)計(jì)則是擴(kuò)充、完善和細(xì)化面向?qū)ο蠓治瞿P偷倪^程,所以,詳細(xì)描述類中的服務(wù)是面向?qū)ο笤O(shè)計(jì)的必要任務(wù)。10.6服務(wù)與關(guān)聯(lián)的設(shè)計(jì)10.6.1設(shè)計(jì)服務(wù)82

1.確定類中應(yīng)有的服務(wù)要正確確定類中應(yīng)有的服務(wù),必須綜合考慮對象模型、動(dòng)態(tài)模型和功能模型。對象模型是進(jìn)行對象設(shè)計(jì)的基本依據(jù),但是,在面向?qū)ο蠓治龅膶ο竽P偷念愔?,沒有列出服務(wù)或只列出少量的幾個(gè)最基本的服務(wù)。面向?qū)ο笤O(shè)計(jì)過程中,必須把動(dòng)態(tài)模型中對象的行為和功能模型中的數(shù)據(jù)處理轉(zhuǎn)換成服務(wù),加入到對象的類中,而這些服務(wù)必須由合適的類所提供。1)從對象模型中引入服務(wù)對象模型描述了系統(tǒng)的對象、屬性和服務(wù),則可將這些對象(以及對象的服務(wù))直接引入到設(shè)計(jì)中,只是要詳細(xì)定義這些服務(wù)。1.確定類中應(yīng)有的服務(wù)832)從動(dòng)態(tài)模型中確定服務(wù)動(dòng)態(tài)模型是由若干個(gè)狀態(tài)圖組成,對象的生命周期由一張狀態(tài)圖描繪,執(zhí)行對象服務(wù)使得狀態(tài)轉(zhuǎn)換,狀態(tài)轉(zhuǎn)換是指對象狀態(tài)的變化。對象接收到事件后驅(qū)動(dòng)對象的執(zhí)行服務(wù),實(shí)際上,事件可用消息表現(xiàn),對象接收消息由該消息的操作符指定服務(wù),該服務(wù)改變對象狀態(tài),即修改相應(yīng)的屬性值,并完成對象應(yīng)做的動(dòng)作。對象的動(dòng)作不但與事件有關(guān),而且與對象的狀態(tài)有關(guān)。因此,服務(wù)的算法必定與對象的狀態(tài)有關(guān)。如果一個(gè)對象在不同狀態(tài)下接收同樣事件,則對象的行為可不同。由此可用一個(gè)依賴于狀態(tài)的多分支控制結(jié)構(gòu)來實(shí)現(xiàn)服務(wù)的算法。2)從動(dòng)態(tài)模型中確定服務(wù)84動(dòng)態(tài)模型描述了系統(tǒng)是如何響應(yīng)外部事件的,程序的主要控制結(jié)構(gòu)來自于動(dòng)態(tài)模型。設(shè)計(jì)程序的控制結(jié)構(gòu),有時(shí)可通過內(nèi)部的調(diào)度機(jī)制識別事件,并將事件映射成操作調(diào)用來顯式地實(shí)現(xiàn)程序控制;有時(shí)可通過選擇的算法按動(dòng)態(tài)模型中確定的順序執(zhí)行操作,來隱式地實(shí)現(xiàn)程序控制。動(dòng)態(tài)模型描述了系統(tǒng)是如何響應(yīng)外部事件的,程序的主要控853)從功能模型中確定服務(wù)功能模型由一組數(shù)據(jù)流圖組成,功能模型指明了系統(tǒng)必須提供的服務(wù)。數(shù)據(jù)流圖中的某些處理可能對應(yīng)于某個(gè)(些)對象提供的服務(wù),因此,確定操作的目標(biāo)對象,然后在該對象所屬的類中定義這些服務(wù)。定義對象所屬的類中的服務(wù)時(shí),必須為服務(wù)選擇合適的算法,有了優(yōu)秀的算法才能設(shè)計(jì)出快速高效的服務(wù)來。此外,如果某個(gè)服務(wù)特別復(fù)雜而很難實(shí)現(xiàn),則可將復(fù)雜的服務(wù)分解成簡單的服務(wù),這樣實(shí)現(xiàn)起來比較容易(當(dāng)然分解的理由不僅僅考慮容易實(shí)現(xiàn)的因素)。算法和分解是實(shí)現(xiàn)優(yōu)化的重要手段。3)從功能模型中確定服務(wù)86

2.設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法上面討論了如何確定對象所屬的類的服務(wù),下面來討論如何設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法,設(shè)計(jì)實(shí)現(xiàn)服務(wù)按下列步驟進(jìn)行。(1)選擇算法:設(shè)計(jì)實(shí)現(xiàn)服務(wù)的算法時(shí),選擇算法應(yīng)該考慮的因素如下:●算法復(fù)雜度:選擇算法時(shí),首先是滿足用戶需求,其次才是追求高效率。根據(jù)服務(wù)需求選用復(fù)雜度較低(即效率較高)的算法。2.設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法87●易理解與易實(shí)現(xiàn):設(shè)計(jì)時(shí)考慮算法的易理解性和易實(shí)現(xiàn)性,一個(gè)易理解和易實(shí)現(xiàn)的算法可能與它的高效率是一對矛盾,設(shè)計(jì)者應(yīng)該權(quán)衡利弊,考慮各個(gè)因素,選擇適當(dāng)?shù)乃惴?。●易修改:設(shè)計(jì)時(shí)除了考慮算法的易理解性和易實(shí)現(xiàn)性,還應(yīng)該考慮算法的易修改性。因此,算法設(shè)計(jì)應(yīng)該盡可能通用,結(jié)構(gòu)清晰,并能預(yù)測到后續(xù)可能的修改情況。●易理解與易實(shí)現(xiàn):設(shè)計(jì)時(shí)考慮算法的易理解性和易實(shí)現(xiàn)88(2)選擇數(shù)據(jù)結(jié)構(gòu):在面向?qū)ο蠓治鲞^程中,僅考慮了系統(tǒng)中數(shù)據(jù)的靜態(tài)的邏輯結(jié)構(gòu),而在面向?qū)ο笤O(shè)計(jì)過程中,則涉及到選擇算法使用的物理數(shù)據(jù)結(jié)構(gòu),采用該種數(shù)據(jù)結(jié)構(gòu)能夠正確地、高效地實(shí)現(xiàn)算法。多數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)語言都提供了基本數(shù)據(jù)結(jié)構(gòu),可供用戶自選組合定義。(3)定義內(nèi)部類和內(nèi)部操作:在算法設(shè)計(jì)時(shí),為了提高效率而增加一些類,用來存放在執(zhí)行算法過程中所得出的中間結(jié)果。復(fù)雜操作往往是用簡單對象上的更低層操作來定義的。因此,在分解高層操作時(shí)通常會(huì)引入新的低層操作,這些新增加的低層操作在設(shè)計(jì)過程中必須定義。(2)選擇數(shù)據(jù)結(jié)構(gòu):在面向?qū)ο蠓治鲞^程中,僅考慮了8910.6.2設(shè)計(jì)關(guān)聯(lián)關(guān)聯(lián)是在對象模型中聯(lián)結(jié)不同對象的紐帶,它指定了對象相互間的訪問路徑。在面向?qū)ο蠓治鲞^程中,僅是初步確定對象之間的關(guān)聯(lián)和階數(shù)。在面向?qū)ο笤O(shè)計(jì)過程中,必須確定實(shí)現(xiàn)關(guān)聯(lián)的具體策略。根據(jù)應(yīng)用系統(tǒng)中的使用方式來確定實(shí)現(xiàn)關(guān)聯(lián)的策略??梢赃x定一個(gè)統(tǒng)一實(shí)現(xiàn)所有關(guān)聯(lián)的全局性的策略,或者對不同的關(guān)聯(lián)選擇不同的實(shí)現(xiàn)策略。首先對使用關(guān)聯(lián)的方式進(jìn)行分析研究,總結(jié)它們的使用方式,然后根據(jù)不同的使用方式設(shè)計(jì)出具體的實(shí)現(xiàn)關(guān)聯(lián)的途徑。10.6.2設(shè)計(jì)關(guān)聯(lián)90

1.關(guān)聯(lián)的遍歷通常應(yīng)用系統(tǒng)中使用關(guān)聯(lián)的方式有單向遍歷和雙向遍歷兩種。根據(jù)應(yīng)用系統(tǒng)的復(fù)雜程度不同,使用關(guān)聯(lián)的方式也不同。有些關(guān)聯(lián)只需要單向遍歷,可有些關(guān)聯(lián)可能需要雙向遍歷。單向關(guān)聯(lián)的實(shí)現(xiàn)自然比較簡單,而雙向關(guān)聯(lián)實(shí)現(xiàn)起來相對復(fù)雜一些。1.關(guān)聯(lián)的遍歷91

2.單向關(guān)聯(lián)的實(shí)現(xiàn)單向遍歷的關(guān)聯(lián)可用指針來實(shí)現(xiàn),指針是一個(gè)含有對象引用的屬性。如果關(guān)聯(lián)的階是一元的,則可用一個(gè)簡單指針來實(shí)現(xiàn),如圖10.4所示;如果關(guān)聯(lián)的階是多元的,則需要用一個(gè)指針集合來實(shí)現(xiàn),參見圖10.5。2.單向關(guān)聯(lián)的實(shí)現(xiàn)92圖10.4用指針實(shí)現(xiàn)單向關(guān)聯(lián)(a)關(guān)聯(lián);(b)實(shí)現(xiàn)圖10.4用指針實(shí)現(xiàn)單向關(guān)聯(lián)93圖10.5用指針實(shí)現(xiàn)雙向關(guān)聯(lián)(a)關(guān)聯(lián);(b)實(shí)現(xiàn)圖10.5用指針實(shí)現(xiàn)雙向關(guān)聯(lián)94

3.雙向關(guān)聯(lián)的實(shí)現(xiàn)許多關(guān)聯(lián)都需要雙向遍歷,且兩個(gè)方向遍歷的頻度可能會(huì)不相同。實(shí)現(xiàn)雙向關(guān)聯(lián)的方法有下述三種。(1)只用屬性實(shí)現(xiàn)一個(gè)方向的關(guān)聯(lián),當(dāng)需要反向遍歷時(shí)就執(zhí)行一次正向查找。當(dāng)兩個(gè)方向遍歷的頻度相差較大,且需要盡量減少存儲(chǔ)開銷和修改開銷時(shí),則這是一種實(shí)現(xiàn)雙向關(guān)聯(lián)的很有效的方法。3.雙向關(guān)聯(lián)的實(shí)現(xiàn)95(2)雙向的關(guān)聯(lián)都用屬性來實(shí)現(xiàn)。具體實(shí)現(xiàn)方法已在上一小節(jié)介紹過,如圖10.5所示。該方法能實(shí)現(xiàn)快速訪問,但是,如果一個(gè)屬性修改了,為了保持該關(guān)聯(lián)鏈的一致性,則引起相關(guān)的屬性的修改。如果修改次數(shù)遠(yuǎn)遠(yuǎn)少于訪問次數(shù)時(shí),該實(shí)現(xiàn)方法是一種很有效的方法。(3)用獨(dú)立的關(guān)聯(lián)對象來實(shí)現(xiàn)。關(guān)聯(lián)對象不屬于相互關(guān)聯(lián)的任何一個(gè)類,關(guān)聯(lián)對象是一個(gè)相關(guān)對象的集合,也就是說,它是獨(dú)立的關(guān)聯(lián)類的實(shí)例(請見圖10.6)。(2)雙向的關(guān)聯(lián)都用屬性來實(shí)現(xiàn)。具體實(shí)現(xiàn)方法已在上一96圖10.6用對象實(shí)現(xiàn)關(guān)聯(lián)圖10.6用對象實(shí)現(xiàn)關(guān)聯(lián)97

4.鏈屬性的實(shí)現(xiàn)如果某個(gè)關(guān)聯(lián)包含鏈屬性,則根據(jù)關(guān)聯(lián)的階數(shù)不同,實(shí)現(xiàn)它的方法也不同。如果是一對一關(guān)聯(lián),鏈屬性可作為其中一個(gè)對象的屬性并存儲(chǔ)在該對象中;如果是一對多關(guān)聯(lián),鏈屬性可作為“多”端對象的一個(gè)屬性;如果是多對多關(guān)聯(lián),則鏈屬性與多個(gè)關(guān)聯(lián)對象有關(guān),一般來說,使用一個(gè)獨(dú)立的類來實(shí)現(xiàn)鏈屬性,該類的每個(gè)實(shí)例表示一條鏈及該鏈的屬性(請見圖10.6)。4.鏈屬性的實(shí)現(xiàn)9810.7面向?qū)ο笤O(shè)計(jì)的優(yōu)化

1.確定優(yōu)先級為了尋找一種適合的折衷方案,設(shè)計(jì)人員必須根據(jù)系統(tǒng)需求的各項(xiàng)質(zhì)量指標(biāo),確定各項(xiàng)質(zhì)量指標(biāo)的相對重要性,即確定優(yōu)先級。系統(tǒng)的整體質(zhì)量與選擇的折衷方案密切相關(guān)。設(shè)計(jì)優(yōu)化要進(jìn)行全局考慮,確定各項(xiàng)質(zhì)量指標(biāo)的優(yōu)先級。不要使系統(tǒng)中各個(gè)子系統(tǒng)按照各自獨(dú)立的或?qū)α⒌哪繕?biāo)優(yōu)化,結(jié)果導(dǎo)致系統(tǒng)資源的嚴(yán)重浪費(fèi),并且導(dǎo)致設(shè)計(jì)出不良的結(jié)果或不成功的產(chǎn)品。在折衷方案中設(shè)置的優(yōu)先級不是很明確的。沒有辦法指定精確的優(yōu)先級數(shù)值或所占的比例數(shù)。通常是在效率和清晰性之間尋找適當(dāng)?shù)恼壑苑桨浮?0.7面向?qū)ο笤O(shè)計(jì)的優(yōu)化1.確定優(yōu)先級992.提高效率的幾項(xiàng)技術(shù)1)增加冗余關(guān)聯(lián)以提高訪問效率在面向?qū)ο蠓治鲞^程中,建立對象模型時(shí)盡量減少關(guān)聯(lián),避免冗余的關(guān)聯(lián)出現(xiàn),因?yàn)槿哂嚓P(guān)聯(lián)既不會(huì)增加任何信息,又會(huì)降低模型的清晰程度。但是,在面向?qū)ο笤O(shè)計(jì)過程中,你會(huì)發(fā)現(xiàn),分析階段確定的關(guān)聯(lián),可能不是構(gòu)成效率最高的訪問路徑,為了提高訪問效率,需要適當(dāng)?shù)卦黾右恍┤哂嚓P(guān)聯(lián)。2.提高效率的幾項(xiàng)技術(shù)100圖10.7公司、職員、技能之間的關(guān)聯(lián)鏈圖10.7公司、職員、技能之間的關(guān)聯(lián)鏈101假設(shè)某公司共有6000名職員,平均每名職員會(huì)10種技能,則將遍歷職員對象6000次,再對每名職員平均追歷技能對象10次,這樣簡單的嵌套查詢共需60000次。如果全公司僅有30名職員精通編程,則查詢命中率只有1/2000。使用哈希(Hash)表:將“精通編程”作為惟一的一個(gè)技能對象來表示,這樣改進(jìn)后就會(huì)使查詢次數(shù)由60000次減少到6000次?!熬哂屑寄堋标P(guān)聯(lián)不用無序表來實(shí)現(xiàn),而是改用哈希表來實(shí)現(xiàn),使用哈希表是提高訪問效率的一種有效方法。假設(shè)某公司共有6000名職員,平均每名職員會(huì)10種技102改進(jìn)后的查詢雖然提高了訪問效率,但是,當(dāng)滿足查詢條件的對象極少時(shí),查詢命中率仍然很低。這時(shí)不妨給需要經(jīng)常查詢的對象建立索引,以使得查詢效率更高。例如,在上述例子中,可以在公司與職員這兩類對象之間建立聯(lián)系,增加一個(gè)額外的限定關(guān)聯(lián)“精通計(jì)算機(jī)”,如圖10.8所示。利用這種適當(dāng)?shù)娜哂嚓P(guān)聯(lián),不必按順序逐個(gè)查找,便可即刻查到精通編程的職員,避免了冗余的訪問。當(dāng)然,索引也會(huì)帶來副作用,增加一定的系統(tǒng)開銷。例如,存儲(chǔ)空間增大,當(dāng)修改基關(guān)聯(lián)時(shí)會(huì)引起相應(yīng)的索引的修改等開銷。因此,建立索引適合那些經(jīng)常執(zhí)行的,開銷大的以及命中率低的查詢,而不是適合任何一類查詢。改進(jìn)后的查詢雖然提高了訪問效率,但是,當(dāng)滿足查詢條件103圖10.8為職員技能數(shù)據(jù)庫建立索引圖10.8為職員技能數(shù)據(jù)庫建立索引1042)調(diào)整查詢次序優(yōu)化查詢遍歷是優(yōu)化設(shè)計(jì)的一種有效的方法,優(yōu)化算法是優(yōu)化設(shè)計(jì)的另一種有效的方法。下面我們來介紹如何優(yōu)化算法。優(yōu)化算法一個(gè)重要目的是縮小查找范圍。例如,假設(shè)用戶在使用上述的職員技能數(shù)據(jù)庫的過程中,希望能找出既精通編程,又精通維修的所有職員。如果某公司有30位職員精通編程,卻有300位職員精通維修,則應(yīng)該先查找精通編程的職員,然后再從這些精通編程的職員中查找同時(shí)又精通維修的職員。也就是說,首先找出滿足需同時(shí)具備多個(gè)條件中的最小值條件來縮小查詢范圍,然后在此基礎(chǔ)上尋找滿足其他條件的職員。采用這樣的調(diào)整查詢次序來優(yōu)化算法,以便更好地提高查詢效率。2)調(diào)整查詢次序1053)保留派生屬性為了避免重復(fù)計(jì)算復(fù)雜表達(dá)式,將通過某種運(yùn)算從其他數(shù)據(jù)派生出新的數(shù)據(jù),我們把派生數(shù)據(jù)作為派生屬性保存起來,在類似的表達(dá)式計(jì)算中重用。派生屬性既可以定義在原有類中,也可以用對象保存起來并定義在新類中。當(dāng)修改了基本對象時(shí),必然引起所有依賴于它的、保存派生屬性的對象的修改。3)保留派生屬性106

3.調(diào)整繼承關(guān)系調(diào)整繼承關(guān)系是優(yōu)化設(shè)計(jì)的一項(xiàng)重要內(nèi)容。通過面向?qū)ο蠓治龅玫降膶ο竽P椭?,已?jīng)建立了繼承關(guān)系。但在面向?qū)ο笤O(shè)計(jì)過程中,應(yīng)該進(jìn)一步調(diào)整繼承關(guān)系來優(yōu)化對象模型。繼承關(guān)系能夠?yàn)橐粋€(gè)類族定義一個(gè)協(xié)議,并能在類之間實(shí)現(xiàn)代碼共享以減少冗余。一個(gè)基類和它的派生類組織在一起稱為一個(gè)類繼承。在面向?qū)ο笤O(shè)計(jì)中,建立良好的類繼承對于優(yōu)化結(jié)構(gòu)是非常重要的。利用類繼承能夠把若干個(gè)類組織成一個(gè)邏輯結(jié)構(gòu)。下面就設(shè)計(jì)類繼承的有關(guān)問題進(jìn)行討論。3.調(diào)整繼承關(guān)系1071)抽象與具體在設(shè)計(jì)類繼承時(shí),使用自頂向下和自底向上相結(jié)合的方法。設(shè)計(jì)過程是:①首先創(chuàng)建一些滿足具體用途的類;②其次對它們進(jìn)行歸納,歸納出一些通用的類作為基類;③然后可以根據(jù)需要再次派生出具體類;④最后如果需要?jiǎng)t再次歸納。就這樣經(jīng)過持續(xù)不斷的演化過程,設(shè)計(jì)出具有良好的繼承關(guān)系結(jié)構(gòu)的類繼承。1)抽象與具體108圖10.9設(shè)計(jì)類繼承創(chuàng)建一些具體類;(b)歸納出抽象類;(c)進(jìn)一步具體化;(d)再進(jìn)行歸納圖10.9設(shè)計(jì)類繼承1092)利用類歸納提高繼承程度在系統(tǒng)設(shè)計(jì)時(shí),有時(shí)利用繼承關(guān)系需要進(jìn)行類歸納來提高繼承程度。如果在一組相似的類中存在公共的屬性和公共的行為,則可以把這些公共的屬性和行為抽取出來重新定義一個(gè)類,作為這些相似類(即子類)的共同的祖先類,以便供它的子類繼承,如圖10.9(a)和(b)所示,這個(gè)過程就稱為類歸納。在確保以下兩點(diǎn)的基礎(chǔ)上,可對現(xiàn)有類進(jìn)行歸納:要遵照領(lǐng)域知識和常識;應(yīng)該確?,F(xiàn)有類的協(xié)議(即外部接口)不變。2)利用類歸納提高繼承程度110類歸納時(shí)常見的一種情況:當(dāng)各個(gè)現(xiàn)有類中的屬性和行為(操作)相似卻不完全相同時(shí),則需要稍加修改類的定義,以便來定義一個(gè)基類供它的子類從中繼承需要的屬性或行為。類歸納時(shí)常見的另一種情況:有時(shí)抽象出一個(gè)基類之后,在系統(tǒng)中繼承它的屬性和行為可能只有一個(gè)子類時(shí),這樣的類歸納并沒有獲得良好的共享。但是,歸納的基類將來可能能重用,這樣做通常仍然是值得的,提高了類的重用性,也是優(yōu)化設(shè)計(jì)的良好措施。類歸納時(shí)常見的一種情況:當(dāng)各個(gè)現(xiàn)有類中的屬性和行為(1113)利用委派實(shí)現(xiàn)行為共享當(dāng)類間存在一般-特殊關(guān)系時(shí),也就是說,存在確實(shí)的繼承關(guān)系時(shí),可合理利用繼承機(jī)制實(shí)現(xiàn)行為共享。當(dāng)只想用繼承作為實(shí)現(xiàn)操作共享的一種技術(shù)時(shí),并不需要基類和派生類具有相同的行為。在這種情況下,如果從基類繼承的操作中包含了子類不應(yīng)有的行為,則可能帶來一些麻煩。例如,假設(shè)需要實(shí)現(xiàn)一個(gè)Stack(后進(jìn)先出棧)類,類庫中已經(jīng)有一個(gè)List(表)類。如果從List類派生出Stack類,則如圖10.10(a)所示:3)利用委派實(shí)現(xiàn)行為共享112把一個(gè)元素壓入棧,相當(dāng)于在表尾加入一個(gè)元素;把一個(gè)元素彈出棧,相當(dāng)于從表尾移走一個(gè)元素。但是,Stack類同時(shí)也繼承了一些不需要的表操作。例如,從表頭移走一個(gè)元素或在表頭增加一個(gè)元素。用戶不慎錯(cuò)誤地使用了這類操作,Stack類將不能正常工作。利用委派實(shí)現(xiàn)行為共享能彌補(bǔ)上述繼承關(guān)系的不足。我們把一類對象作為另一類對象的屬性,從而在兩類對象間建立組合關(guān)系稱為委派。利用這種委派(而不是繼承)既能達(dá)到同樣目的,又比較安全。因?yàn)槭褂梦蓹C(jī)制時(shí),委派另一類對象實(shí)現(xiàn)的操作是有意義的,因此不會(huì)引起錯(cuò)誤的或破壞性的操作。把一個(gè)元素壓入棧,相當(dāng)于在表尾加入一個(gè)元素;把一個(gè)元113圖10.10(b)描述了委派List類實(shí)現(xiàn)Stack類操作的方法。Stack類的每個(gè)實(shí)例都包含一個(gè)私有的List類實(shí)例(或指向List類實(shí)例的指針)。委派List類對象通過調(diào)用last(定位到表尾)和add(加入一個(gè)元素)操作,來實(shí)現(xiàn)Stack對象的push(壓棧)操作;而通過List的last和remove(移走一個(gè)元素)操作,來實(shí)現(xiàn)Stack對象的pop(出棧)操作。圖10.10(b)描述了委派List類實(shí)現(xiàn)Stac114圖10.10用表實(shí)現(xiàn)棧的兩種方法(a)用繼承實(shí)現(xiàn);(b)用委托實(shí)現(xiàn)圖10.10用表實(shí)現(xiàn)棧的兩種方法115第10章面向?qū)ο笤O(shè)計(jì)10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則

10.2問題域子系統(tǒng)設(shè)計(jì)

10.3人機(jī)交互子系統(tǒng)設(shè)計(jì)10.4任務(wù)管理子系統(tǒng)設(shè)計(jì)10.5數(shù)據(jù)管理子系統(tǒng)設(shè)計(jì)10.6服務(wù)與關(guān)聯(lián)的設(shè)計(jì)10.7面向?qū)ο笤O(shè)計(jì)的優(yōu)化第10章面向?qū)ο笤O(shè)計(jì)10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則11610.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則10.1.1設(shè)計(jì)準(zhǔn)則1.模塊化模塊化是軟件設(shè)計(jì)的重要準(zhǔn)則。在面向?qū)ο箝_發(fā)方法中,將對象定義為模塊。對象把數(shù)據(jù)結(jié)構(gòu)和作用在數(shù)據(jù)上的操作封裝起來構(gòu)成模塊。對象是組成系統(tǒng)的基本模塊。10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則10.1.1設(shè)計(jì)準(zhǔn)則117

2.抽象類是一種抽象數(shù)據(jù)類型,在該數(shù)據(jù)類型之上,可以創(chuàng)建對象(類的成員)。類包含相似對象的共同屬性和服務(wù),它對外定義了公共接口,構(gòu)成了類的規(guī)格說明(即協(xié)議),供外界合法訪問。通過這種接口訪問類實(shí)例中的數(shù)據(jù)。通常把這類抽象稱為規(guī)格說明抽象。

3.信息隱藏在面向?qū)ο蠓椒ㄖ?,對象是屬性和服?wù)的封裝體,這就實(shí)現(xiàn)了信息隱藏。類結(jié)構(gòu)分離了接口與實(shí)現(xiàn),類的屬性的表示方法和操作的實(shí)現(xiàn)算法,對于類的用戶來說,都應(yīng)該是隱藏的,用戶只能通過公共接口訪問類中的屬性。2.抽象118

4.弱耦合所謂耦合,是指一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的依賴關(guān)系。依賴關(guān)系越多耦合度越強(qiáng),依賴關(guān)系越少耦合度越弱。在面向?qū)ο蠓椒ㄖ?,對象是最基本的模塊,不同對象之間相互關(guān)聯(lián)的依賴關(guān)系表示了耦合度。衡量設(shè)計(jì)優(yōu)良的一個(gè)重要標(biāo)準(zhǔn)就是弱耦合,弱耦合的設(shè)計(jì)中某個(gè)對象的改變不會(huì)或很少影響到其他對象。這樣給理解、測試或修改帶來很大的方便。反之,強(qiáng)耦合會(huì)給理解、測試或修改帶來很大的難度,并且還降低了該類的可重用性和可移植性。不同對象之間耦合是不可避免的。兩個(gè)對象必須相互聯(lián)系相互依賴時(shí),應(yīng)該通過類的協(xié)議(即公共接口)實(shí)現(xiàn)兩個(gè)對象相互依賴(耦合),而不是通過類的具體實(shí)現(xiàn)細(xì)節(jié)來描述。4.弱耦合119

5.強(qiáng)內(nèi)聚所謂內(nèi)聚,是一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度。結(jié)合得越緊密內(nèi)聚越強(qiáng),結(jié)合得越不緊密內(nèi)聚越弱。強(qiáng)內(nèi)聚也是衡量設(shè)計(jì)優(yōu)良的一個(gè)重要標(biāo)準(zhǔn)。在面向?qū)ο笤O(shè)計(jì)中,內(nèi)聚可分為下述三類:(1)服務(wù)內(nèi)聚。一個(gè)服務(wù)應(yīng)該是單一的,即只完成一個(gè)任務(wù)。(2)類內(nèi)聚。類內(nèi)聚要求類的屬性和服務(wù)應(yīng)該是高內(nèi)聚的,而且它們應(yīng)該是系統(tǒng)任務(wù)所必需的。一個(gè)類應(yīng)該只有一個(gè)功能,如果某個(gè)類有多個(gè)功能,通常應(yīng)該把它分解成多個(gè)專用的類。5.強(qiáng)內(nèi)聚120(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:一般-特殊結(jié)構(gòu)符合領(lǐng)域知識的表示形式,也就是說,特殊類應(yīng)該盡量地繼承一般類的屬性和服務(wù)。這樣的一般-特殊結(jié)構(gòu)是高內(nèi)聚的。例如,雖然表面看來飛機(jī)與汽車有相似的地方(都用發(fā)動(dòng)機(jī)驅(qū)動(dòng),都有輪子,……),但是,如果把飛機(jī)和汽車都作為“機(jī)動(dòng)車”類的子類,則不符合領(lǐng)域知識的表示形式,這樣的一般-特殊結(jié)構(gòu)是低內(nèi)聚的。高內(nèi)聚的一般-特殊結(jié)構(gòu)應(yīng)該是,設(shè)置一個(gè)抽象類“交通工具”,把飛機(jī)和機(jī)動(dòng)車作為交通工具類的子類,而汽車又是機(jī)動(dòng)車類的子類。(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:1216.可重用在面向?qū)ο笤O(shè)計(jì)中,一個(gè)類的設(shè)計(jì)應(yīng)該具有通用性,為開發(fā)相似的系統(tǒng)提供軟件重用可能。軟件重用可以提高軟件開發(fā)生產(chǎn)率,確保目標(biāo)系統(tǒng)質(zhì)量。可重用是面向?qū)ο箝_發(fā)方法的一個(gè)重要特性,也就是說,用面向?qū)ο蟮母拍詈头椒ū容^容易實(shí)現(xiàn)重用。因此,在軟件開發(fā)過程中,為了實(shí)現(xiàn)重用,既要盡量重用已有的類,又要?jiǎng)?chuàng)建可重用的新類。6.可重用12210.1.2設(shè)計(jì)策略在使用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件的實(shí)踐中,得出了下面一些基于經(jīng)驗(yàn)的啟發(fā)規(guī)則,這些規(guī)則往往能幫助軟件開發(fā)人員設(shè)計(jì)出好的方案來,以保證軟件的質(zhì)量。1.設(shè)計(jì)結(jié)果應(yīng)該清晰易懂良好的設(shè)計(jì)結(jié)果應(yīng)該是清晰易懂的,它能提高軟件的可維護(hù)性和可重用性。如果一個(gè)設(shè)計(jì)結(jié)構(gòu)不清楚,并且難以理解,是不會(huì)被人們接受的。設(shè)計(jì)時(shí)采用以下幾個(gè)策略能使結(jié)果清晰易懂。(1)命名一致。命名應(yīng)該與專業(yè)領(lǐng)域中的名字一致,并且要是符合人們習(xí)慣的名字。不同類中相似服務(wù)的名字應(yīng)該相同。10.1.2設(shè)計(jì)策略123(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建立了類的協(xié)議,避免重復(fù)勞動(dòng)或重復(fù)定義帶來的差異(不統(tǒng)一)。這些協(xié)議可能是其他設(shè)計(jì)人員已經(jīng)建立了類的協(xié)議,或是在類庫中已有的協(xié)議。(3)減少消息連接。盡量采用已有標(biāo)準(zhǔn)的消息連接,去掉不必要的消息連接。采用統(tǒng)一模式建立自己需要的消息連接,以便理解和使用,增強(qiáng)可理解性和可使用性。(4)避免模糊的定義。應(yīng)該定義具有明確、有限用途的類,避免那些模糊的、不準(zhǔn)確的類定義。(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建124

2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)從基類派生子類,再從子類派生下一層子類,這樣的一般-特殊結(jié)構(gòu)的類層次數(shù)應(yīng)該適當(dāng),不必過于細(xì)化,層次的深度應(yīng)該是有限的。一般來說,在一個(gè)中等規(guī)模(大約包含100個(gè)類)的系統(tǒng)中,類層次數(shù)應(yīng)保持為7±2。2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)1253.設(shè)計(jì)簡單的類類設(shè)計(jì)應(yīng)該盡量小而簡單,便于開發(fā)和管理。定義很大的類,它所包含的屬性和服務(wù)相對就多,會(huì)給開發(fā)和使用帶來困難。實(shí)踐表明,簡單類一個(gè)類的定義在50行左右(或兩屏)。簡單類可按照下列的策略定義。(1)避免包含太多的屬性。一個(gè)類包含的屬性多少將決定類的復(fù)雜程度。一個(gè)類包含太多的屬性表明該類過于復(fù)雜了,因此,就可能有過多的作用在這些屬性上的服務(wù)。(2)避免提供太多服務(wù)。一個(gè)類包含的服務(wù)多少也是決定類的復(fù)雜程度的一個(gè)重要因素。太復(fù)雜的類所提供的服務(wù)肯定太多。一般來說,一個(gè)類提供的公共服務(wù)不要超過七個(gè)。3.設(shè)計(jì)簡單的類126(3)明確精練的定義。如果一個(gè)類的任務(wù)簡單了,則它的定義就明確精練了,通常任務(wù)簡單的類可用幾個(gè)簡單語句描述。(4)簡化對象間的通信。每個(gè)對象應(yīng)該獨(dú)立完成任務(wù)。也就是說,對象在完成任務(wù)時(shí),盡量不要依賴于其他對象的配合(幫助),對象之間過多的依賴會(huì)破壞類的簡明性和清晰性。雖然,遵循上述設(shè)計(jì)策略能設(shè)計(jì)出明確精練的較小的類,但在開發(fā)大型軟件系統(tǒng)中,必定會(huì)有大量較小的類設(shè)計(jì)出來,這將會(huì)導(dǎo)致類間的通信變復(fù)雜。采用劃分“主題”的方法,可以解決這個(gè)問題。(3)明確精練的定義。如果一個(gè)類的任務(wù)簡單了,則它127

4.設(shè)計(jì)簡單的協(xié)議消息中的參數(shù)越多表示對象之間傳遞的消息越復(fù)雜,同樣表明對象之間的依賴關(guān)系越復(fù)雜,即對象間的耦合度越高。一般來說,簡單消息中的參數(shù)不要超過三個(gè)。過多的參數(shù)會(huì)導(dǎo)致對象的修改較復(fù)雜,因?yàn)閷σ粋€(gè)對象的修改往往導(dǎo)致其他對象的修改。4.設(shè)計(jì)簡單的協(xié)議128

5.設(shè)計(jì)簡單的服務(wù)類中的服務(wù)應(yīng)該設(shè)計(jì)得既簡單又小,用3~5行源程序代碼比較適合。服務(wù)的源程序中不要包含過多的語句行,或者復(fù)雜的語句控制結(jié)構(gòu),如分支嵌套、循環(huán)嵌套和函數(shù)調(diào)用等。如果一個(gè)服務(wù)非常復(fù)雜,則應(yīng)該檢查該服務(wù)的控制結(jié)構(gòu),并進(jìn)行分解和簡化,盡量避免設(shè)計(jì)復(fù)雜的服務(wù)。5.設(shè)計(jì)簡單的服務(wù)1296.減少設(shè)計(jì)變動(dòng)隨著設(shè)計(jì)方案逐漸成熟,改動(dòng)也應(yīng)該越來越小,這樣才能設(shè)計(jì)出優(yōu)良的結(jié)果。優(yōu)良的設(shè)計(jì)能保證軟件質(zhì)量,并能提高軟件的可重用性。因此,在設(shè)計(jì)中盡可能少改動(dòng),或者盡可能縮小修改的范圍。6.減少設(shè)計(jì)變動(dòng)13010.1.3系統(tǒng)分解與組織面向?qū)ο笤O(shè)計(jì)同過程設(shè)計(jì)一樣,自頂向下

溫馨提示

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

評論

0/150

提交評論