版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章面向?qū)ο笤O(shè)計(jì)10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則
10.2問(wèn)題域子系統(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ū)ο箝_(kāi)發(fā)方法中,將對(duì)象定義為模塊。對(duì)象把數(shù)據(jù)結(jié)構(gòu)和作用在數(shù)據(jù)上的操作封裝起來(lái)構(gòu)成模塊。對(duì)象是組成系統(tǒng)的基本模塊。10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則10.1.1設(shè)計(jì)準(zhǔn)則2
2.抽象類(lèi)是一種抽象數(shù)據(jù)類(lèi)型,在該數(shù)據(jù)類(lèi)型之上,可以創(chuàng)建對(duì)象(類(lèi)的成員)。類(lèi)包含相似對(duì)象的共同屬性和服務(wù),它對(duì)外定義了公共接口,構(gòu)成了類(lèi)的規(guī)格說(shuō)明(即協(xié)議),供外界合法訪(fǎng)問(wèn)。通過(guò)這種接口訪(fǎng)問(wèn)類(lèi)實(shí)例中的數(shù)據(jù)。通常把這類(lèi)抽象稱(chēng)為規(guī)格說(shuō)明抽象。
3.信息隱藏在面向?qū)ο蠓椒ㄖ?,?duì)象是屬性和服務(wù)的封裝體,這就實(shí)現(xiàn)了信息隱藏。類(lèi)結(jié)構(gòu)分離了接口與實(shí)現(xiàn),類(lèi)的屬性的表示方法和操作的實(shí)現(xiàn)算法,對(duì)于類(lèi)的用戶(hù)來(lái)說(shuō),都應(yīng)該是隱藏的,用戶(hù)只能通過(guò)公共接口訪(fǎng)問(wèn)類(lèi)中的屬性。2.抽象3
4.弱耦合所謂耦合,是指一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的依賴(lài)關(guān)系。依賴(lài)關(guān)系越多耦合度越強(qiáng),依賴(lài)關(guān)系越少耦合度越弱。在面向?qū)ο蠓椒ㄖ?,?duì)象是最基本的模塊,不同對(duì)象之間相互關(guān)聯(lián)的依賴(lài)關(guān)系表示了耦合度。衡量設(shè)計(jì)優(yōu)良的一個(gè)重要標(biāo)準(zhǔn)就是弱耦合,弱耦合的設(shè)計(jì)中某個(gè)對(duì)象的改變不會(huì)或很少影響到其他對(duì)象。這樣給理解、測(cè)試或修改帶來(lái)很大的方便。反之,強(qiáng)耦合會(huì)給理解、測(cè)試或修改帶來(lái)很大的難度,并且還降低了該類(lèi)的可重用性和可移植性。不同對(duì)象之間耦合是不可避免的。兩個(gè)對(duì)象必須相互聯(lián)系相互依賴(lài)時(shí),應(yīng)該通過(guò)類(lèi)的協(xié)議(即公共接口)實(shí)現(xiàn)兩個(gè)對(duì)象相互依賴(lài)(耦合),而不是通過(guò)類(lèi)的具體實(shí)現(xiàn)細(xì)節(jié)來(lái)描述。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)聚可分為下述三類(lèi):(1)服務(wù)內(nèi)聚。一個(gè)服務(wù)應(yīng)該是單一的,即只完成一個(gè)任務(wù)。(2)類(lèi)內(nèi)聚。類(lèi)內(nèi)聚要求類(lèi)的屬性和服務(wù)應(yīng)該是高內(nèi)聚的,而且它們應(yīng)該是系統(tǒng)任務(wù)所必需的。一個(gè)類(lèi)應(yīng)該只有一個(gè)功能,如果某個(gè)類(lèi)有多個(gè)功能,通常應(yīng)該把它分解成多個(gè)專(zhuān)用的類(lèi)。5.強(qiáng)內(nèi)聚5(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:一般-特殊結(jié)構(gòu)符合領(lǐng)域知識(shí)的表示形式,也就是說(shuō),特殊類(lèi)應(yīng)該盡量地繼承一般類(lèi)的屬性和服務(wù)。這樣的一般-特殊結(jié)構(gòu)是高內(nèi)聚的。例如,雖然表面看來(lái)飛機(jī)與汽車(chē)有相似的地方(都用發(fā)動(dòng)機(jī)驅(qū)動(dòng),都有輪子,……),但是,如果把飛機(jī)和汽車(chē)都作為“機(jī)動(dòng)車(chē)”類(lèi)的子類(lèi),則不符合領(lǐng)域知識(shí)的表示形式,這樣的一般-特殊結(jié)構(gòu)是低內(nèi)聚的。高內(nèi)聚的一般-特殊結(jié)構(gòu)應(yīng)該是,設(shè)置一個(gè)抽象類(lèi)“交通工具”,把飛機(jī)和機(jī)動(dòng)車(chē)作為交通工具類(lèi)的子類(lèi),而汽車(chē)又是機(jī)動(dòng)車(chē)類(lèi)的子類(lèi)。(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:66.可重用在面向?qū)ο笤O(shè)計(jì)中,一個(gè)類(lèi)的設(shè)計(jì)應(yīng)該具有通用性,為開(kāi)發(fā)相似的系統(tǒng)提供軟件重用可能。軟件重用可以提高軟件開(kāi)發(fā)生產(chǎn)率,確保目標(biāo)系統(tǒng)質(zhì)量??芍赜檬敲嫦?qū)ο箝_(kāi)發(fā)方法的一個(gè)重要特性,也就是說(shuō),用面向?qū)ο蟮母拍詈头椒ū容^容易實(shí)現(xiàn)重用。因此,在軟件開(kāi)發(fā)過(guò)程中,為了實(shí)現(xiàn)重用,既要盡量重用已有的類(lèi),又要?jiǎng)?chuàng)建可重用的新類(lèi)。6.可重用710.1.2設(shè)計(jì)策略在使用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件的實(shí)踐中,得出了下面一些基于經(jīng)驗(yàn)的啟發(fā)規(guī)則,這些規(guī)則往往能幫助軟件開(kāi)發(fā)人員設(shè)計(jì)出好的方案來(lái),以保證軟件的質(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)該與專(zhuān)業(yè)領(lǐng)域中的名字一致,并且要是符合人們習(xí)慣的名字。不同類(lèi)中相似服務(wù)的名字應(yīng)該相同。10.1.2設(shè)計(jì)策略8(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建立了類(lèi)的協(xié)議,避免重復(fù)勞動(dòng)或重復(fù)定義帶來(lái)的差異(不統(tǒng)一)。這些協(xié)議可能是其他設(shè)計(jì)人員已經(jīng)建立了類(lèi)的協(xié)議,或是在類(lèi)庫(kù)中已有的協(xié)議。(3)減少消息連接。盡量采用已有標(biāo)準(zhǔn)的消息連接,去掉不必要的消息連接。采用統(tǒng)一模式建立自己需要的消息連接,以便理解和使用,增強(qiáng)可理解性和可使用性。(4)避免模糊的定義。應(yīng)該定義具有明確、有限用途的類(lèi),避免那些模糊的、不準(zhǔn)確的類(lèi)定義。(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建9
2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)從基類(lèi)派生子類(lèi),再?gòu)淖宇?lèi)派生下一層子類(lèi),這樣的一般-特殊結(jié)構(gòu)的類(lèi)層次數(shù)應(yīng)該適當(dāng),不必過(guò)于細(xì)化,層次的深度應(yīng)該是有限的。一般來(lái)說(shuō),在一個(gè)中等規(guī)模(大約包含100個(gè)類(lèi))的系統(tǒng)中,類(lèi)層次數(shù)應(yīng)保持為7±2。2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)103.設(shè)計(jì)簡(jiǎn)單的類(lèi)類(lèi)設(shè)計(jì)應(yīng)該盡量小而簡(jiǎn)單,便于開(kāi)發(fā)和管理。定義很大的類(lèi),它所包含的屬性和服務(wù)相對(duì)就多,會(huì)給開(kāi)發(fā)和使用帶來(lái)困難。實(shí)踐表明,簡(jiǎn)單類(lèi)一個(gè)類(lèi)的定義在50行左右(或兩屏)。簡(jiǎn)單類(lèi)可按照下列的策略定義。(1)避免包含太多的屬性。一個(gè)類(lèi)包含的屬性多少將決定類(lèi)的復(fù)雜程度。一個(gè)類(lèi)包含太多的屬性表明該類(lèi)過(guò)于復(fù)雜了,因此,就可能有過(guò)多的作用在這些屬性上的服務(wù)。(2)避免提供太多服務(wù)。一個(gè)類(lèi)包含的服務(wù)多少也是決定類(lèi)的復(fù)雜程度的一個(gè)重要因素。太復(fù)雜的類(lèi)所提供的服務(wù)肯定太多。一般來(lái)說(shuō),一個(gè)類(lèi)提供的公共服務(wù)不要超過(guò)七個(gè)。3.設(shè)計(jì)簡(jiǎn)單的類(lèi)11(3)明確精練的定義。如果一個(gè)類(lèi)的任務(wù)簡(jiǎn)單了,則它的定義就明確精練了,通常任務(wù)簡(jiǎn)單的類(lèi)可用幾個(gè)簡(jiǎn)單語(yǔ)句描述。(4)簡(jiǎn)化對(duì)象間的通信。每個(gè)對(duì)象應(yīng)該獨(dú)立完成任務(wù)。也就是說(shuō),對(duì)象在完成任務(wù)時(shí),盡量不要依賴(lài)于其他對(duì)象的配合(幫助),對(duì)象之間過(guò)多的依賴(lài)會(huì)破壞類(lèi)的簡(jiǎn)明性和清晰性。雖然,遵循上述設(shè)計(jì)策略能設(shè)計(jì)出明確精練的較小的類(lèi),但在開(kāi)發(fā)大型軟件系統(tǒng)中,必定會(huì)有大量較小的類(lèi)設(shè)計(jì)出來(lái),這將會(huì)導(dǎo)致類(lèi)間的通信變復(fù)雜。采用劃分“主題”的方法,可以解決這個(gè)問(wèn)題。(3)明確精練的定義。如果一個(gè)類(lèi)的任務(wù)簡(jiǎn)單了,則它12
4.設(shè)計(jì)簡(jiǎn)單的協(xié)議消息中的參數(shù)越多表示對(duì)象之間傳遞的消息越復(fù)雜,同樣表明對(duì)象之間的依賴(lài)關(guān)系越復(fù)雜,即對(duì)象間的耦合度越高。一般來(lái)說(shuō),簡(jiǎn)單消息中的參數(shù)不要超過(guò)三個(gè)。過(guò)多的參數(shù)會(huì)導(dǎo)致對(duì)象的修改較復(fù)雜,因?yàn)閷?duì)一個(gè)對(duì)象的修改往往導(dǎo)致其他對(duì)象的修改。4.設(shè)計(jì)簡(jiǎn)單的協(xié)議13
5.設(shè)計(jì)簡(jiǎn)單的服務(wù)類(lèi)中的服務(wù)應(yīng)該設(shè)計(jì)得既簡(jiǎn)單又小,用3~5行源程序代碼比較適合。服務(wù)的源程序中不要包含過(guò)多的語(yǔ)句行,或者復(fù)雜的語(yǔ)句控制結(jié)構(gòu),如分支嵌套、循環(huán)嵌套和函數(shù)調(diào)用等。如果一個(gè)服務(wù)非常復(fù)雜,則應(yīng)該檢查該服務(wù)的控制結(jié)構(gòu),并進(jìn)行分解和簡(jiǎn)化,盡量避免設(shè)計(jì)復(fù)雜的服務(wù)。5.設(shè)計(jì)簡(jiǎn)單的服務(wù)146.減少設(shè)計(jì)變動(dòng)隨著設(shè)計(jì)方案逐漸成熟,改動(dòng)也應(yīng)該越來(lái)越小,這樣才能設(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ì)同過(guò)程設(shè)計(jì)一樣,自頂向下進(jìn)行功能分解。在設(shè)計(jì)比較復(fù)雜的應(yīng)用系統(tǒng)時(shí),將系統(tǒng)分解成若干個(gè)比較小的部分,再分別設(shè)計(jì)每個(gè)部分。這樣既簡(jiǎn)化了應(yīng)用系統(tǒng),又降低了設(shè)計(jì)的難度,并有利于實(shí)現(xiàn)和維護(hù)。10.1.3系統(tǒng)分解與組織16系統(tǒng)是根據(jù)功能來(lái)分解的,我們將系統(tǒng)分解的各個(gè)部分(即系統(tǒng)的主要組成部分)稱(chēng)為子系統(tǒng)。例如,編譯系統(tǒng)可劃分成詞法分析、語(yǔ)法分析、中間代碼生成、優(yōu)化、目標(biāo)代碼生成和出錯(cuò)處理等子系統(tǒng)。子系統(tǒng)不是單一的對(duì)象或功能,而是面向?qū)ο蠓治瞿P偷奈鍌€(gè)層次的集合。子系統(tǒng)的劃分不能太多,要與系統(tǒng)規(guī)模相匹配,最底層的子系統(tǒng)成為模塊。子系統(tǒng)間交互的形式和交互的信息由接口確定,因此,接口應(yīng)該簡(jiǎn)單、明確,以便設(shè)計(jì)出相對(duì)獨(dú)立的子系統(tǒng),減少子系統(tǒng)的依賴(lài)性。系統(tǒng)是根據(jù)功能來(lái)分解的,我們將系統(tǒng)分解的各個(gè)部分(即17
1.面向?qū)ο笤O(shè)計(jì)的五個(gè)層次、四個(gè)部分面向?qū)ο笤O(shè)計(jì)是在面向?qū)ο蠓治瞿P偷幕A(chǔ)上建立對(duì)象模型的過(guò)程。兩個(gè)階段同樣是建立對(duì)象模型,只是面向?qū)ο蠓治鼋⒘藛?wèn)題域的對(duì)象模型,而面向?qū)ο笤O(shè)計(jì)建立的是求解域的對(duì)象模型。因此,面向?qū)ο笤O(shè)計(jì)模型同樣由主題、類(lèi)-&-對(duì)象、結(jié)構(gòu)、屬性和服務(wù)等五個(gè)層次組成,并且又?jǐn)U充了問(wèn)題域(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ù)分解;對(duì)于小系統(tǒng)來(lái)說(shuō),可能要合并小的子系統(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)系可分為客戶(hù)/服務(wù)器關(guān)系和同等伙伴關(guān)系兩種。這兩種關(guān)系對(duì)應(yīng)兩種交互的方式,即客戶(hù)/服務(wù)器交互方式和同等伙伴交互方式。(1)客戶(hù)/服務(wù)器交互方式。客戶(hù)/服務(wù)器交互方式也稱(chēng)單向交互方式。在客戶(hù)/服務(wù)器關(guān)系中,作為“客戶(hù)”的子系統(tǒng)調(diào)用作為“服務(wù)器”的子系統(tǒng),執(zhí)行某些服務(wù)后并返回結(jié)果。在該交互方式中,任何交互行為都是由客戶(hù)驅(qū)動(dòng)的,因此,作為客戶(hù)的子系統(tǒng)必須了解作為服務(wù)器的子系統(tǒng)的接口,而服務(wù)器不必了解客戶(hù)的接口。2.子系統(tǒng)間的交互方式21(2)同等伙伴交互方式。同等伙伴交互方式也稱(chēng)雙向交互方式。在該交互方式中,每個(gè)子系統(tǒng)都可能調(diào)用其他子系統(tǒng),因此,每個(gè)子系統(tǒng)都必須了解其他子系統(tǒng)的接口,子系統(tǒng)間必須相互了解接口。與客戶(hù)/服務(wù)器關(guān)系比較,同等伙伴交互關(guān)系中子系統(tǒng)之間的交互更復(fù)雜,而且這種交互方式還可能構(gòu)成通信環(huán)路,會(huì)給設(shè)計(jì)帶來(lái)難度,并容易出現(xiàn)設(shè)計(jì)錯(cuò)誤。通常,系統(tǒng)使用客戶(hù)/服務(wù)器關(guān)系,因?yàn)閱蜗蚪换ジ菀桌斫?,也更容易設(shè)計(jì)和修改,而雙向交互相對(duì)困難些。(2)同等伙伴交互方式。同等伙伴交互方式也稱(chēng)雙向交22
3.系統(tǒng)組織將子系統(tǒng)組織成完整的系統(tǒng)有兩種方式,即水平層次組織和垂直塊組織。1)層次組織層次組織是將子系統(tǒng)按層組織成為一個(gè)層次軟件系統(tǒng),每層是一個(gè)子系統(tǒng)。上層建立在下層的基礎(chǔ)上,下層為上層提供必要的服務(wù)。各層內(nèi)所包含的對(duì)象是相互獨(dú)立的,而不同層次上的對(duì)象,相互間有關(guān)聯(lián)。低層子系統(tǒng)提供服務(wù),相當(dāng)于服務(wù)器,上層子系統(tǒng)使用下層提供的服務(wù),相當(dāng)于客戶(hù)。這樣構(gòu)成上、下層之間的客戶(hù)/服務(wù)器關(guān)系。這種組織方式使軟件系統(tǒng)形成層次結(jié)構(gòu)。3.系統(tǒng)組織23層次結(jié)構(gòu)又可分為封閉式和開(kāi)放式兩種。在封閉式結(jié)構(gòu)中,每層子系統(tǒng)只根據(jù)相鄰下層建立,且僅使用相鄰下層提供的服務(wù)。這種方式降低了各層次之間的相互依賴(lài)性,更容易理解和修改,因?yàn)橐粋€(gè)層次的接口只影響與其相鄰的上一層。在開(kāi)放式結(jié)構(gòu)中,某層子系統(tǒng)可以使用其下面的任何一層子系統(tǒng)所提供的服務(wù)。該方式減少了各層上重新定義的服務(wù)的需求,使得整個(gè)系統(tǒng)更高效、更緊湊。但是,該方式?jīng)]有遵守信息隱藏的原則,對(duì)任何一個(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)又可分為封閉式和開(kāi)放式兩種。在封閉式結(jié)構(gòu)中,24通常,在需求陳述中只描述了系統(tǒng)的頂層和底層的內(nèi)容,頂層就是用戶(hù)看到的目標(biāo)系統(tǒng),底層則是可以使用的資源(如硬件、操作系統(tǒng)、數(shù)據(jù)庫(kù)等)。這兩層間差異很大,為了減少不同層次之間的概念差異,設(shè)計(jì)者必須引入一些中間層次來(lái)彌補(bǔ)。通常,在需求陳述中只描述了系統(tǒng)的頂層和底層的內(nèi)容,頂252)塊組織塊組織將系統(tǒng)垂直地分解成若干個(gè)相對(duì)獨(dú)立的、弱耦合的子系統(tǒng),一個(gè)子系統(tǒng)相當(dāng)于一塊,每塊提供一種類(lèi)型的服務(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)有:管道型、樹(shù)型、星型等。為了減少子系統(tǒng)之間的交互次數(shù),設(shè)計(jì)時(shí)應(yīng)該采用與問(wèn)題結(jié)構(gòu)相適應(yīng)的、盡可能簡(jiǎn)單的拓?fù)浣Y(jié)構(gòu)。4.設(shè)計(jì)系統(tǒng)的拓?fù)浣Y(jié)構(gòu)2810.2問(wèn)題域子系統(tǒng)設(shè)計(jì)問(wèn)題域子系統(tǒng)也稱(chēng)問(wèn)題域部分(PDC,ProblemDomainComponent)。面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計(jì)是一個(gè)平滑的過(guò)渡,即沒(méi)有間斷沒(méi)有明確的分界線(xiàn)。面向?qū)ο蠓治鼋⑾到y(tǒng)的問(wèn)題域?qū)ο竽P?,而面向?qū)ο笤O(shè)計(jì)是建立求解域的對(duì)象模型。都是建模,但兩者必定性質(zhì)不同,分析建??梢耘c系統(tǒng)的具體實(shí)現(xiàn)無(wú)關(guān),設(shè)計(jì)建模則要考慮系統(tǒng)的具體實(shí)現(xiàn)環(huán)境的約束,如要考慮系統(tǒng)準(zhǔn)備使用的編程語(yǔ)言,可用的軟構(gòu)件庫(kù)(主要是類(lèi)庫(kù))以及程序員的編程經(jīng)驗(yàn)等約束問(wèn)題。10.2問(wèn)題域子系統(tǒng)設(shè)計(jì)問(wèn)題域子系統(tǒng)也稱(chēng)問(wèn)題域部分29面向?qū)ο蠓椒ㄖ械囊粋€(gè)主要目標(biāo)是保持問(wèn)題域組織框架的完整性、穩(wěn)定性,這樣可提高分析、設(shè)計(jì)到實(shí)現(xiàn)的追蹤性。因?yàn)橄到y(tǒng)的總體框架都是建立在問(wèn)題域基礎(chǔ)上的,所以,在設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中無(wú)論做怎樣的修改,例如增加具體類(lèi)、屬性或服務(wù)等,都不會(huì)影響開(kāi)發(fā)結(jié)果的穩(wěn)定性。穩(wěn)定性是在類(lèi)似系統(tǒng)中實(shí)現(xiàn)重用分析、設(shè)計(jì)和編程結(jié)果的關(guān)鍵因素。為更好地支持系統(tǒng)的擴(kuò)充,也同樣需要穩(wěn)定性。面向?qū)ο蠓椒ㄖ械囊粋€(gè)主要目標(biāo)是保持問(wèn)題域組織框架的完30問(wèn)題域子系統(tǒng)可以直接引用面向?qū)ο蠓治鏊贸龅膯?wèn)題域精確對(duì)象模型,該模型提供了完整的框架,面向?qū)ο笤O(shè)計(jì)就應(yīng)該保持該框架結(jié)構(gòu)。面向?qū)ο笤O(shè)計(jì)在分析模型的基礎(chǔ)上,從實(shí)現(xiàn)角度對(duì)問(wèn)題域模型作一些補(bǔ)充或修改,修改包括增添、合并或分解類(lèi)-&-對(duì)象、屬性及服務(wù),調(diào)整繼承關(guān)系等。如果問(wèn)題域子系統(tǒng)相當(dāng)復(fù)雜龐大時(shí),則應(yīng)把它進(jìn)一步分解成若干個(gè)更小的子系統(tǒng)。下面講述在面向?qū)ο笤O(shè)計(jì)過(guò)程中,對(duì)問(wèn)題域?qū)ο竽P妥鞯脑鲅a(bǔ)或修改的方法。問(wèn)題域子系統(tǒng)可以直接引用面向?qū)ο蠓治鏊贸龅膯?wèn)題域精31
1.調(diào)整需求當(dāng)用戶(hù)需求或外部環(huán)境發(fā)生了變化,或者分析員對(duì)問(wèn)題域理解不透徹或缺乏領(lǐng)域?qū)<規(guī)椭?,以致建立了不能完整、?zhǔn)確地反映用戶(hù)真實(shí)需求的面向?qū)ο蠓治瞿P蜁r(shí),需要對(duì)面向?qū)ο蠓治鏊_定的系統(tǒng)需求進(jìn)行修改。一般來(lái)說(shuō),首先對(duì)面向?qū)ο蠓治瞿P妥骱?jiǎn)單的修改,然后再將修改后的模型引用到問(wèn)題域子系統(tǒng)中。1.調(diào)整需求32
2.重用現(xiàn)有的類(lèi)設(shè)計(jì)時(shí)應(yīng)該在面向?qū)ο蠓治鼋Y(jié)果的基礎(chǔ)上實(shí)現(xiàn)現(xiàn)有類(lèi)的重用,現(xiàn)有類(lèi)是指面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言所提供的類(lèi)庫(kù)中的類(lèi)。因此,在設(shè)計(jì)階段就要開(kāi)始考慮重用,為代碼重用奠定基礎(chǔ)。如果確實(shí)需要?jiǎng)?chuàng)建新的類(lèi)時(shí),則在設(shè)計(jì)新類(lèi)時(shí),必須考慮它的可重用性。2.重用現(xiàn)有的類(lèi)33下面介紹重用已有的類(lèi)的過(guò)程。(1)選擇類(lèi)庫(kù)中可重用的現(xiàn)有類(lèi),加入到問(wèn)題域子系統(tǒng)中,并標(biāo)出現(xiàn)有類(lèi)中對(duì)本系統(tǒng)無(wú)用的屬性和服務(wù),以致將無(wú)用的屬性和服務(wù)降到最低程度。(2)將問(wèn)題域類(lèi)中從現(xiàn)有類(lèi)繼承來(lái)的屬性和服務(wù)標(biāo)出來(lái),它們?cè)贈(zèng)]有必要定義在問(wèn)題域類(lèi)內(nèi)了。(3)確定被重用的現(xiàn)有類(lèi)和問(wèn)題域類(lèi)之間的一般-特殊關(guān)系,也就是說(shuō),以重用現(xiàn)有類(lèi)為基類(lèi),派生出問(wèn)題域類(lèi)。(4)修改問(wèn)題域類(lèi)相關(guān)的關(guān)聯(lián),必要時(shí)用與重用現(xiàn)有類(lèi)相關(guān)的關(guān)聯(lián)替換與問(wèn)題域類(lèi)相關(guān)的關(guān)聯(lián)。下面介紹重用已有的類(lèi)的過(guò)程。34
3.組合問(wèn)題域類(lèi)通常,為了把問(wèn)題域類(lèi)組合在一個(gè)類(lèi)庫(kù)中,需要引入一個(gè)根類(lèi)(抽象類(lèi))將問(wèn)題域類(lèi)作為從屬類(lèi)組織在一起。當(dāng)沒(méi)有更先進(jìn)的、更好的組合機(jī)制時(shí),才采用該種組合方法。另外,可通過(guò)建立協(xié)議來(lái)完成這種組織。3.組合問(wèn)題域類(lèi)35
4.增添一般化類(lèi)以便建立協(xié)議在設(shè)計(jì)過(guò)程中,經(jīng)常發(fā)現(xiàn)許多具體類(lèi)需要有一個(gè)相似的協(xié)議,即它們都需要定義一組相似的服務(wù)。這時(shí)可以引入一個(gè)附加的根類(lèi),以便建立這個(gè)協(xié)議。也就是說(shuō),定義公共服務(wù)集合,在特殊類(lèi)中詳細(xì)定義這些服務(wù)。4.增添一般化類(lèi)以便建立協(xié)議36
5.簡(jiǎn)化繼承當(dāng)面向?qū)ο竽P椭械囊话?特殊結(jié)構(gòu)包括多繼承,而使用一種只有單繼承和無(wú)繼承的編程語(yǔ)言時(shí),需要對(duì)面向?qū)ο竽P妥饕恍┬薷?,即將多繼承化為單繼承,單繼承化為無(wú)繼承,用單繼承和無(wú)繼承編程語(yǔ)言來(lái)表達(dá)多繼承功能。5.簡(jiǎn)化繼承37
6.實(shí)例設(shè)計(jì)在面向?qū)ο笤O(shè)計(jì)過(guò)程中,ATM系統(tǒng)的問(wèn)題域子系統(tǒng)的結(jié)構(gòu)如圖10.3所示。把ATM系統(tǒng)的問(wèn)題域子系統(tǒng),進(jìn)一步分解成更小的ATM站子系統(tǒng),中央計(jì)算機(jī)子系統(tǒng)和分行計(jì)算機(jī)子系統(tǒng),構(gòu)成星型拓?fù)浣Y(jié)構(gòu)。以中央計(jì)算機(jī)為中心向外連接(用專(zhuān)用電話(huà)線(xiàn)),與所有ATM站和分行計(jì)算機(jī)通信。區(qū)分每個(gè)ATM站和每臺(tái)分行計(jì)算機(jī)連向中央計(jì)算機(jī)的電話(huà)線(xiàn),分別用ATM站號(hào)和分行代碼來(lái)實(shí)現(xiàn)。這里假設(shè)面向?qū)ο蠓治瞿P褪峭暾?,在面向?qū)ο笤O(shè)計(jì)過(guò)程中對(duì)問(wèn)題域模型不必作實(shí)質(zhì)性的修改或擴(kuò)充了。6.實(shí)例設(shè)計(jì)38圖10.3ATM系統(tǒng)問(wèn)題域子系統(tǒng)的結(jié)構(gòu)圖10.3ATM系統(tǒng)問(wèn)題域子系統(tǒng)的結(jié)構(gòu)3910.3人機(jī)交互子系統(tǒng)設(shè)計(jì)人機(jī)交互子系統(tǒng)也稱(chēng)人機(jī)交互部分(HIC,HumanInteractionComponent)。人機(jī)交互部分的設(shè)計(jì)結(jié)果,將對(duì)用戶(hù)使用系統(tǒng)帶來(lái)很大影響。人機(jī)界面設(shè)計(jì)得好,則會(huì)使系統(tǒng)產(chǎn)生魅力,吸引用戶(hù)經(jīng)常使用系統(tǒng),并覺(jué)得與系統(tǒng)的交互是友好的、興奮的,還能提高工作效率;反之不然。為了得到良好的人機(jī)界面,在分析階段要對(duì)用戶(hù)進(jìn)行分析,在設(shè)計(jì)階段要延續(xù)該分析,包括對(duì)用戶(hù)、交互時(shí)間、交互技術(shù)等進(jìn)行分析。10.3人機(jī)交互子系統(tǒng)設(shè)計(jì)人機(jī)交互子系統(tǒng)也稱(chēng)人機(jī)交40在人機(jī)交互子系統(tǒng)設(shè)計(jì)中,在初步分析用戶(hù)界面需求的基礎(chǔ)上,對(duì)人機(jī)交互的細(xì)節(jié)進(jìn)行詳細(xì)設(shè)計(jì),包括對(duì)窗口、對(duì)話(huà)框和報(bào)表的形式,設(shè)計(jì)命令層次組織等內(nèi)容的設(shè)計(jì)。設(shè)計(jì)人機(jī)交互子系統(tǒng)的關(guān)鍵,是使用原型技術(shù)。建立人機(jī)界面的原型,征求用戶(hù)的意見(jiàn),獲取用戶(hù)的評(píng)價(jià),也是設(shè)計(jì)人機(jī)界面的一種有效途徑。在人機(jī)交互子系統(tǒng)設(shè)計(jì)中,在初步分析用戶(hù)界面需求的基礎(chǔ)41
1.設(shè)計(jì)人機(jī)交互界面的準(zhǔn)則要把人機(jī)交互界面設(shè)計(jì)得友好,讓用戶(hù)滿(mǎn)意,應(yīng)該遵循下列準(zhǔn)則:(1)一致性。在人機(jī)交互界面中,術(shù)語(yǔ)、步驟、動(dòng)作的使用都要一致。(2)減少步驟。人機(jī)交互界面設(shè)計(jì)時(shí),應(yīng)盡量減少為完成某個(gè)操作而敲擊鍵盤(pán)、點(diǎn)擊鼠標(biāo)、點(diǎn)擊下拉菜單的次數(shù),并且適應(yīng)不同技術(shù)水平的用戶(hù),還得有極小的響應(yīng)時(shí)間,特別應(yīng)該為熟練用戶(hù)提供簡(jiǎn)捷的操作方法(例如熱鍵)。1.設(shè)計(jì)人機(jī)交互界面的準(zhǔn)則42(3)及時(shí)提供反饋信息。在運(yùn)行時(shí)間較長(zhǎng)時(shí),應(yīng)該有提示使得用戶(hù)不感到寂寞。每當(dāng)要用戶(hù)等待系統(tǒng)完成一個(gè)活動(dòng)時(shí),系統(tǒng)都應(yīng)該向用戶(hù)提供有意義的、及時(shí)的反饋信息,以便能夠讓用戶(hù)知道系統(tǒng)當(dāng)前已經(jīng)完成該活動(dòng)的進(jìn)度如何,是否正常等信息,不要“啞播放”。(4)提供撤消命令。人與系統(tǒng)交互時(shí)難免會(huì)出錯(cuò)誤,系統(tǒng)應(yīng)該提供“撤消(Undo)”命令,以便用戶(hù)發(fā)現(xiàn)錯(cuò)誤時(shí)能及時(shí)撤消錯(cuò)誤操作,進(jìn)行補(bǔ)救處理。(3)及時(shí)提供反饋信息。在運(yùn)行時(shí)間較長(zhǎng)時(shí),應(yīng)該有提43(5)減少記憶。好的界面不需要用戶(hù)記憶使用步驟,操作比較簡(jiǎn)單。(6)易學(xué)易用。界面應(yīng)該易學(xué)易用,應(yīng)該有聯(lián)機(jī)學(xué)習(xí)、操作手冊(cè)以及其他參考資料,以便用戶(hù)在需要時(shí)可隨時(shí)參閱。(7)富有吸引力。給用戶(hù)設(shè)計(jì)友好的、趣味的、具有吸引力的人機(jī)交互界面,從而吸引用戶(hù)使用。(5)減少記憶。好的界面不需要用戶(hù)記憶使用步驟,操44
2.設(shè)計(jì)人機(jī)交互子系統(tǒng)的策略1)分類(lèi)用戶(hù)人機(jī)交互界面的兩個(gè)要點(diǎn)是人如何命令系統(tǒng)及系統(tǒng)如何向用戶(hù)提交信息。因此,設(shè)計(jì)好人機(jī)交互界面的首要任務(wù)是認(rèn)真研究使用系統(tǒng)的用戶(hù),深入到用戶(hù)的工作現(xiàn)場(chǎng),仔細(xì)觀察用戶(hù)的工作流程。觀察用戶(hù)必須完成哪些工作,如何工作的,思考完成這些工作在系統(tǒng)中應(yīng)該提供哪些工具以及如何實(shí)現(xiàn),如何使工具使用起來(lái)更方便、更有效。為了設(shè)計(jì)出符合用戶(hù)需要的界面,應(yīng)該深入了解用戶(hù)的需要與愛(ài)好,可將用戶(hù)按照不同角度進(jìn)行分類(lèi)。2.設(shè)計(jì)人機(jī)交互子系統(tǒng)的策略45①按技能分類(lèi)(初級(jí)/中級(jí)/高級(jí))。②按職務(wù)分類(lèi)(總經(jīng)理/部門(mén)經(jīng)理/職員)。③按工作性質(zhì)分類(lèi)(行政人員/技術(shù)人員)。④按專(zhuān)業(yè)知識(shí)分類(lèi)(外專(zhuān)業(yè)/專(zhuān)業(yè)/系統(tǒng)員/程序員)。①按技能分類(lèi)(初級(jí)/中級(jí)/高級(jí))。462)描述用戶(hù)及其任務(wù)腳本對(duì)以上定義的每類(lèi)用戶(hù)的情況,就下述問(wèn)題進(jìn)行考慮并制表,如表10.1所示。表10.1描述用戶(hù)及其任務(wù)的腳本內(nèi)容①用戶(hù)類(lèi)型②使用系統(tǒng)的目的③特征(年齡、性別、受教育程度、限制因素等)④關(guān)鍵的成功因素(需求、愛(ài)好、習(xí)慣等)⑤技能水平⑥完成本職工作的腳2)描述用戶(hù)及其任務(wù)腳本表10.1描述用戶(hù)及其473)設(shè)計(jì)命令層設(shè)計(jì)命令層是界面設(shè)計(jì)的重要部分,一般包含下列工作。(1)研究現(xiàn)有的人機(jī)交互的準(zhǔn)則。命令層設(shè)計(jì)有許多方式,但目前最受用戶(hù)喜愛(ài)的是Windows界面,Windows已經(jīng)成了微機(jī)上圖形用戶(hù)界面事實(shí)上的工業(yè)標(biāo)準(zhǔn)。所有Windows應(yīng)用程序的界面是一致的,窗口布局、菜單、術(shù)語(yǔ)等使用,以及界面的風(fēng)格、習(xí)慣等都是一致的,Windows的命令層設(shè)計(jì)采用了下拉式菜單和彈出式菜單,而且各菜單的組織方式也類(lèi)似。設(shè)計(jì)圖形用戶(hù)界面時(shí),應(yīng)該保持與普通Windows應(yīng)用程序界面一致,并遵守廣大用戶(hù)習(xí)慣的約定,這樣才會(huì)被用戶(hù)接受和喜愛(ài)。3)設(shè)計(jì)命令層48(2)設(shè)計(jì)初始命令層。所謂命令層,是將系統(tǒng)中的可用服務(wù)用過(guò)程抽象機(jī)制組織起來(lái)的一種體現(xiàn)。設(shè)計(jì)時(shí)首先從服務(wù)的基本過(guò)程抽象開(kāi)始,確定系統(tǒng)中最上層(如大的操作,相近小命令的總稱(chēng),多層命令的最上層等),然后再修改它們,以符合目標(biāo)系統(tǒng)的特定需要。(2)設(shè)計(jì)初始命令層。所謂命令層,是將系統(tǒng)中的可用49(3)優(yōu)化命令層。為使命令層完善、合理以及使用方便,應(yīng)該考慮下列一些因素,作進(jìn)一步修改?!衽帕校簷z查每個(gè)服務(wù)的名字,并將服務(wù)排在命令層中的合適位置??砂聪到y(tǒng)功能(服務(wù))順序排列,也可以按用戶(hù)習(xí)慣的工作順序排序?!裾w-部分組合:通過(guò)服務(wù)本身發(fā)現(xiàn)整體-部分關(guān)系,來(lái)幫助在命令層中對(duì)服務(wù)組織和分組。(3)優(yōu)化命令層。為使命令層完善、合理以及使用方便,50●寬度和深度:通常,命令層中同一層顯示命令的個(gè)數(shù)(寬度),設(shè)計(jì)為(7±2)個(gè)比較合適;命令層中層數(shù)(深度)設(shè)計(jì)為3層比較合適。這樣符合人的短期記憶能力?!駵p少操作步驟:做同樣的工作,按鍵或拖動(dòng)鼠標(biāo)越少越好。并為高級(jí)用戶(hù)提供簡(jiǎn)捷的操作方法?!駥挾群蜕疃龋和ǔ?,命令層中同一層顯示命令的個(gè)數(shù)(514)設(shè)計(jì)人機(jī)交互類(lèi)人機(jī)交互類(lèi)設(shè)計(jì),可在操作系統(tǒng)及編程語(yǔ)言的基礎(chǔ)上,利用類(lèi)庫(kù)中現(xiàn)有的、適用的類(lèi)來(lái)派生出符合目標(biāo)系統(tǒng)需要的類(lèi),作為人機(jī)交互類(lèi)。4)設(shè)計(jì)人機(jī)交互類(lèi)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)象稱(chēng)為“并發(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)模型。如果對(duì)象間不存在交互,或者說(shuō)它們能同時(shí)接收事件,那么這兩個(gè)對(duì)象是并發(fā)的。通過(guò)檢查各個(gè)對(duì)象的狀態(tài)圖及它們之間交換的事件,把若干個(gè)非并發(fā)的對(duì)象歸并到一起。獨(dú)立的任務(wù)把必須并發(fā)進(jìn)行的行為分離開(kāi)來(lái)。這種并發(fā)行為既可以在不同的處理器上實(shí)現(xiàn),也可以在單個(gè)處理器上利用多任務(wù)操作系統(tǒng)仿真實(shí)現(xiàn)。一般來(lái)說(shuō),劃分任務(wù),是為了簡(jiǎn)化系統(tǒng)中必須的并發(fā)行為的設(shè)計(jì)和編碼。分析并發(fā)性的主要依據(jù)是系統(tǒng)的動(dòng)態(tài)模型。如果對(duì)象間不存54
2.設(shè)計(jì)任務(wù)管理子系統(tǒng)1)確定事件驅(qū)動(dòng)任務(wù)由某個(gè)事件觸發(fā)而引起的任務(wù)稱(chēng)事件驅(qū)動(dòng)任務(wù)。事件通常表明一個(gè)設(shè)備傳輸過(guò)來(lái)的一個(gè)信息,事件是由設(shè)備引起的。任務(wù)是對(duì)事件的處理。一個(gè)任務(wù)可以設(shè)計(jì)成由一個(gè)事件來(lái)觸發(fā)(驅(qū)動(dòng)),該事件常常是對(duì)一些數(shù)據(jù)的到達(dá)發(fā)信號(hào),而這些數(shù)據(jù)可能來(lái)自輸入數(shù)據(jù)行,或者另一個(gè)任務(wù)寫(xiě)入的數(shù)據(jù)緩沖區(qū)。這類(lèi)任務(wù)可能主要完成通信工作,例如,與設(shè)備、屏幕窗口、其他任務(wù)、子系統(tǒng)、另一個(gè)處理器或其他系統(tǒng)通信。2.設(shè)計(jì)任務(wù)管理子系統(tǒng)55事件驅(qū)動(dòng)任務(wù)的工作過(guò)程為:①任務(wù)處于睡眠狀態(tài)(不消耗處理器時(shí)間),等待來(lái)自數(shù)據(jù)行或其他數(shù)據(jù)源的中斷;②接收到中斷就喚醒了該任務(wù);③閱讀數(shù)據(jù)并把數(shù)據(jù)放入內(nèi)存緩沖區(qū)或其他目的地;④向需要知道此事件的對(duì)象發(fā)出通知,然后該任務(wù)又回到睡眠狀態(tài)。事件驅(qū)動(dòng)任務(wù)的工作過(guò)程為:562)確定時(shí)鐘驅(qū)動(dòng)任務(wù)按特定的時(shí)間間隔被觸發(fā)后執(zhí)行某些處理的任務(wù)稱(chēng)時(shí)鐘驅(qū)動(dòng)任務(wù)。例如,某些設(shè)備需要周期性地獲得數(shù)據(jù);某些人機(jī)接口、子系統(tǒng)、任務(wù)、處理器或其他系統(tǒng)也可能需要周期性地通信。時(shí)鐘驅(qū)動(dòng)型任務(wù)的工作過(guò)程為:①任務(wù)設(shè)置了喚醒時(shí)間后進(jìn)入睡眠狀態(tài);②等待來(lái)自系統(tǒng)的中斷;③接收到中斷,任務(wù)被喚醒;④進(jìn)行處理,通知有關(guān)的對(duì)象;⑤該任務(wù)又回到睡眠狀態(tài)。2)確定時(shí)鐘驅(qū)動(dòng)任務(wù)573)確定優(yōu)先任務(wù)根據(jù)事件的優(yōu)先級(jí)高低來(lái)做處理的任務(wù)稱(chēng)優(yōu)先級(jí)任務(wù)。它可以滿(mǎn)足高優(yōu)先級(jí)或低優(yōu)先級(jí)的處理需求。(1)高優(yōu)先級(jí):有些服務(wù)可能是高優(yōu)先級(jí)的,需要把這類(lèi)服務(wù)劃分成獨(dú)立的任務(wù),使該類(lèi)服務(wù)在一個(gè)嚴(yán)格限定的時(shí)間內(nèi)完成。(2)低優(yōu)先級(jí):有些服務(wù)是低優(yōu)先級(jí)的,屬于低優(yōu)先級(jí)處理(通常指那些后臺(tái)處理)。設(shè)計(jì)時(shí)可能用附加的任務(wù)把這種服務(wù)分離出來(lái)。任務(wù)的劃分是根據(jù)時(shí)間決定優(yōu)先級(jí),根據(jù)優(yōu)先級(jí)的高低劃分出輕重緩急的任務(wù)。3)確定優(yōu)先任務(wù)584)確定關(guān)鍵任務(wù)設(shè)計(jì)時(shí)應(yīng)該分離出那些對(duì)于系統(tǒng)的成敗特別關(guān)鍵的任務(wù),該類(lèi)任務(wù)通常都有嚴(yán)格的可靠性、安全性要求。設(shè)計(jì)時(shí)可用附加的任務(wù)來(lái)分離出關(guān)鍵的任務(wù),應(yīng)該進(jìn)行深入細(xì)致的設(shè)計(jì)、編碼和測(cè)試,以滿(mǎn)足高可靠性、安全性處理的要求。也就是說(shuō),根據(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ù),用來(lái)協(xié)調(diào)任務(wù)之間的關(guān)系,該任務(wù)稱(chēng)為協(xié)調(diào)任務(wù)。從一個(gè)任務(wù)到另一個(gè)任務(wù)的轉(zhuǎn)換時(shí)間叫現(xiàn)場(chǎng)轉(zhuǎn)換時(shí)間。協(xié)調(diào)任務(wù)用來(lái)控制現(xiàn)場(chǎng)轉(zhuǎn)換時(shí)間時(shí),將會(huì)給系統(tǒng)設(shè)計(jì)帶來(lái)困難,但是引入?yún)f(xié)調(diào)任務(wù)可為封裝不同任務(wù)之間的協(xié)調(diào)控制帶來(lái)好處。該任務(wù)的行為可用狀態(tài)轉(zhuǎn)換矩陣來(lái)描述。這樣的任務(wù)應(yīng)該只做協(xié)調(diào)工作,不必分配它其他的工作。5)確定協(xié)調(diào)任務(wù)606)審查每個(gè)任務(wù)對(duì)任務(wù)的性質(zhì)進(jìn)行審查,去掉人為的、不必要的任務(wù),要使任務(wù)數(shù)保持到最少。設(shè)計(jì)多任務(wù)系統(tǒng)的主要問(wèn)題是,設(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ù)命名,然后簡(jiǎn)要地描述任務(wù)。如果一個(gè)任務(wù)可以分解成多個(gè)任務(wù),則修改該服務(wù)的名稱(chēng)以及描述,使每個(gè)服務(wù)映射到一個(gè)任務(wù)。(2)如何協(xié)調(diào)。定義每個(gè)任務(wù)怎樣協(xié)調(diào)工作。指出它是任務(wù)事件驅(qū)動(dòng)的還是時(shí)鐘驅(qū)動(dòng)的。對(duì)于事件驅(qū)動(dòng)的任務(wù),描述觸發(fā)該任務(wù)的事件;對(duì)時(shí)鐘驅(qū)動(dòng)的任務(wù),描述在觸發(fā)之前所經(jīng)過(guò)的時(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)也稱(chēng)數(shù)據(jù)管理部分(DMC,DataManagementComponent)。數(shù)據(jù)管理子系統(tǒng)為面向?qū)ο笤O(shè)計(jì)模型提供了在特定的數(shù)據(jù)管理系統(tǒng)之上,存儲(chǔ)或檢索對(duì)象的基本結(jié)構(gòu)。設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)的目的是,將目標(biāo)軟件系統(tǒng)中依賴(lài)開(kāi)發(fā)平臺(tái)的數(shù)據(jù)存取部分與其他功能分離,數(shù)據(jù)存取通過(guò)一般的數(shù)據(jù)存儲(chǔ)管理模式(文件、關(guān)系數(shù)據(jù)庫(kù)或面向?qū)ο髷?shù)據(jù)庫(kù))實(shí)現(xiàn),但實(shí)現(xiàn)細(xì)節(jié)集中在數(shù)據(jù)管理子系統(tǒng)中。這樣既有利于軟件的擴(kuò)充、移植和維護(hù),又簡(jiǎn)化了軟件設(shè)計(jì)、編碼和測(cè)試的過(guò)程。10.5數(shù)據(jù)管理子系統(tǒng)設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)也稱(chē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ù)庫(kù)系統(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)提供了基本的文件處理和分類(lèi)能力。它的特點(diǎn)是長(zhǎng)期保存數(shù)據(jù),成本低而且簡(jiǎn)單。但文件操作繁瑣,實(shí)現(xiàn)比較困難,必須編寫(xiě)大量的代碼。此外,文件管理系統(tǒng)是操作系統(tǒng)的一個(gè)組成部分,不同操作系統(tǒng)的文件管理系統(tǒng)往往有明顯的差異。10.5.1選擇數(shù)據(jù)存儲(chǔ)管理模式65
2.關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)建立在關(guān)系理論基礎(chǔ)上。它用若干個(gè)表來(lái)管理數(shù)據(jù),表中的每一行表示表中的一組值,每一列有一個(gè)單一的(原子)值在其中。它具有以下優(yōu)點(diǎn):(1)提供了各種最基本的數(shù)據(jù)管理功能。例如,中斷恢復(fù)、多用戶(hù)共享、多應(yīng)用共享、完整性和事務(wù)支持等。(2)為多種應(yīng)用提供了一致的接口。(3)支持標(biāo)準(zhǔn)化的SQL語(yǔ)言。2.關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)66關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)為了做到通用和一致性,實(shí)現(xiàn)相當(dāng)復(fù)雜且存在一定不足,以致限制了它的普遍使用。缺點(diǎn)如下:(1)運(yùn)行開(kāi)銷(xiāo)大。即使只完成簡(jiǎn)單的事務(wù)(例如,只修改表中的一行)也需要較長(zhǎng)的時(shí)間。(2)不能滿(mǎn)足高級(jí)應(yīng)用的需求。關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)是為商務(wù)應(yīng)用服務(wù)的,商務(wù)應(yīng)用中數(shù)據(jù)量雖大,但數(shù)據(jù)結(jié)構(gòu)卻比較簡(jiǎn)單。一般來(lái)說(shuō),在數(shù)據(jù)類(lèi)型豐富或操作不標(biāo)準(zhǔn)的應(yīng)用中,很難用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)現(xiàn)。(3)與程序設(shè)計(jì)語(yǔ)言的連接不自然。大多數(shù)程序設(shè)計(jì)語(yǔ)言本質(zhì)上是過(guò)程性的,每次只能處理一個(gè)記錄。而SQL語(yǔ)言支持面向集合的操作,是一種非過(guò)程性語(yǔ)言,兩者之間存在差異,連接不方便。關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)為了做到通用和一致性,實(shí)現(xiàn)相當(dāng)復(fù)雜67
3.面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)(OODB,ObjectOrientedDataBase)是一種新技術(shù),它擴(kuò)展設(shè)計(jì)途徑如下:(1)在關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)上,加強(qiáng)了一些操作功能。例如,增加了抽象數(shù)據(jù)類(lèi)型和繼承性,以及創(chuàng)建及管理類(lèi)和對(duì)象的通用服務(wù)。這種OODB稱(chēng)為擴(kuò)充的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。(2)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中擴(kuò)充了數(shù)據(jù)庫(kù)的功能。例如,擴(kuò)充了存儲(chǔ)和管理對(duì)象的語(yǔ)法和功能。這種OODB稱(chēng)為擴(kuò)充的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。3.面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)68(3)從面向?qū)ο蠓椒ū旧沓霭l(fā)來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)。開(kāi)發(fā)人員可以用統(tǒng)一的面向?qū)ο笥^點(diǎn)進(jìn)行設(shè)計(jì),不再需要區(qū)分存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)和程序數(shù)據(jù)結(jié)構(gòu)。首先保留對(duì)象值,然后在需要時(shí)創(chuàng)建該對(duì)象的一個(gè)副本。這是大多數(shù)對(duì)象數(shù)據(jù)管理模式都采用的“復(fù)制對(duì)象”的方法。擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言則支持了“永久對(duì)象”方法:確切地存儲(chǔ)同樣的對(duì)象,包括對(duì)象的內(nèi)部標(biāo)識(shí),而不是僅僅存儲(chǔ)一個(gè)對(duì)象的副本。使用這種方法,當(dāng)一個(gè)對(duì)象從存儲(chǔ)庫(kù)檢索到時(shí),它與先前存在的那個(gè)對(duì)象是完全相同的。“永久對(duì)象”方法,為在多用戶(hù)環(huán)境下從對(duì)象服務(wù)器中共享對(duì)象奠定了基礎(chǔ)。(3)從面向?qū)ο蠓椒ū旧沓霭l(fā)來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)。開(kāi)發(fā)人員6910.5.2設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)無(wú)論基于哪種數(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è)類(lèi)的屬性(既包括類(lèi)本身的定義屬性又包括繼承下來(lái)的類(lèi)屬性);(2)將所有屬性表格規(guī)范為第一范式;(3)為每個(gè)類(lèi)定義一個(gè)文件;(4)測(cè)量性能和需要的存儲(chǔ)容量能否滿(mǎn)足實(shí)際性能要求;1)文件系統(tǒng)71(5)若文件太多時(shí),則把一般-特殊結(jié)構(gòu)的對(duì)象文件合并成一個(gè)文件,以減少文件數(shù)量。必要時(shí)把某些屬性組合起來(lái),并用某種編碼值表示這些屬性,而不再分別使用獨(dú)立的域表示每個(gè)屬性。這樣做可以減少所需要的存儲(chǔ)空間,但是增加了處理時(shí)間。(5)若文件太多時(shí),則把一般-特殊結(jié)構(gòu)的對(duì)象文722)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)設(shè)計(jì)數(shù)據(jù)格式的步驟為:(1)列出每個(gè)類(lèi)的屬性表;(2)將所有屬性表格規(guī)范為第三范式;(3)為每個(gè)類(lèi)定義一個(gè)數(shù)據(jù)庫(kù)表。(4)測(cè)量性能和需要的存儲(chǔ)容量能否滿(mǎn)足實(shí)際性能要求;(5)若不滿(mǎn)足再返回第二步設(shè)計(jì)規(guī)范,修改原來(lái)設(shè)計(jì)的第三范式,以滿(mǎn)足性能和存儲(chǔ)需求。2)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)733)面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)設(shè)計(jì)數(shù)據(jù)格式的步驟為:(1)對(duì)于在關(guān)系數(shù)據(jù)庫(kù)上擴(kuò)充的面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng),其處理步驟與基于關(guān)系數(shù)據(jù)庫(kù)的處理步驟類(lèi)似。(2)對(duì)于由面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言擴(kuò)充而來(lái)的面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng),則不需要對(duì)屬性進(jìn)行規(guī)范化,因?yàn)閿?shù)據(jù)庫(kù)管理系統(tǒng)本身具有把對(duì)象值映射成存儲(chǔ)值的功能。3)面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)74
2.設(shè)計(jì)相應(yīng)的服務(wù)如果某個(gè)類(lèi)的對(duì)象需要存儲(chǔ)起來(lái),則在該類(lèi)中應(yīng)該增加一個(gè)屬性和服務(wù),用于完成存儲(chǔ)對(duì)象自身的操作。通常把增加的屬性和服務(wù)與對(duì)象中其他的屬性和服務(wù)分離,作為“隱含”的屬性和服務(wù),在類(lèi)-&-對(duì)象的定義中描述,不在面向?qū)ο笤O(shè)計(jì)模型的屬性和服務(wù)層中顯式地表示出來(lái)?!按鎯?chǔ)自己”的屬性和服務(wù)形成了問(wèn)題域子系統(tǒng)與數(shù)據(jù)管理子系統(tǒng)之間必要的橋梁。若系統(tǒng)支持多繼承,那么用于“存儲(chǔ)自己”的屬性和服務(wù)應(yīng)該專(zhuān)門(mén)定義在一個(gè)基類(lèi)“ObjectServer(對(duì)象服務(wù)器)”中,通過(guò)繼承關(guān)系使那些需要存儲(chǔ)對(duì)象的類(lèi)從基類(lèi)中獲得該屬性和服務(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í),對(duì)象需要確定打開(kāi)哪個(gè)文件,在文件中如何定位,如何檢索出舊值(如果存在)以及如何更新值。因此,需要定義一個(gè)“ObjectServer類(lèi)”,該類(lèi)應(yīng)該提供兩個(gè)服務(wù):(1)告知對(duì)象如何存儲(chǔ)自身;(2)檢索已存儲(chǔ)的對(duì)象(查找、取值、創(chuàng)建或初始化對(duì)象),以便把這些對(duì)象提供給其他子系統(tǒng)使用。同設(shè)計(jì)數(shù)據(jù)格式一樣,不同的數(shù)據(jù)存儲(chǔ)管理模式,其設(shè)計(jì)相762)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)采用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)設(shè)計(jì)時(shí),對(duì)象需確定訪(fǎng)問(wèn)哪些數(shù)據(jù)庫(kù)表,如何檢索到所需要的行(元組),如何檢索出舊值(如果存在)以及如何更新值。因此,還應(yīng)該專(zhuān)門(mén)定義一個(gè)“ObjectServer”類(lèi),并聲明它的對(duì)象。該類(lèi)應(yīng)提供下列服務(wù):(1)告知對(duì)象如何存儲(chǔ)自身;(2)檢索已存儲(chǔ)的對(duì)象(查找,取值,創(chuàng)建或初始化對(duì)象),以便由其他子系統(tǒng)使用這些對(duì)象。2)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)773)面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)(1)對(duì)于在關(guān)系數(shù)據(jù)庫(kù)上擴(kuò)充的面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng),與使用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)時(shí)方法相同。(2)對(duì)于由面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言擴(kuò)充而來(lái)的面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng),沒(méi)有必要定義專(zhuān)門(mén)的類(lèi),因該系統(tǒng)已經(jīng)提供了為每個(gè)對(duì)象“存儲(chǔ)自己”的行為。只需給需要長(zhǎng)期保存的對(duì)象加個(gè)標(biāo)記,這類(lèi)對(duì)象的存儲(chǔ)和恢復(fù)由面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)負(fù)責(zé)完成。3)面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)783.實(shí)例設(shè)計(jì)用圖10.3所示的ATM系統(tǒng)為例,具體說(shuō)明數(shù)據(jù)管理子系統(tǒng)的設(shè)計(jì)方法。假設(shè)采用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)存儲(chǔ)數(shù)據(jù)。從系統(tǒng)可知,在分行計(jì)算機(jī)中存放的是惟一的永久性數(shù)據(jù)。因?yàn)橛卸鄠€(gè)并發(fā)事務(wù)同時(shí)訪(fǎng)問(wèn)這些數(shù)據(jù),而且必須保持?jǐn)?shù)據(jù)的一致性和完整性。因此,應(yīng)該把每個(gè)事務(wù)作為一個(gè)不可分割的批操作來(lái)處理,由事務(wù)封鎖賬戶(hù)直到該事務(wù)結(jié)束為止。需要存儲(chǔ)的對(duì)象在該例中主要是賬戶(hù)類(lèi)的對(duì)象。為了支持?jǐn)?shù)據(jù)管理子系統(tǒng)的實(shí)現(xiàn),賬戶(hù)類(lèi)對(duì)象必須知道自己是怎樣存儲(chǔ)的,下面介紹兩種方法可完成這個(gè)任務(wù)。3.實(shí)例設(shè)計(jì)79須知道自己是怎樣存儲(chǔ)的,下面介紹兩種方法可完成這個(gè)任務(wù)。(1)由每個(gè)對(duì)象自身存儲(chǔ)。賬戶(hù)類(lèi)對(duì)象在接到“存儲(chǔ)自己”的消息后,需要增加一個(gè)屬性和一個(gè)服務(wù)來(lái)定義存儲(chǔ)自己的行為,以便知道怎樣把自身存儲(chǔ)起來(lái)。(2)由數(shù)據(jù)管理子系統(tǒng)負(fù)責(zé)存儲(chǔ)對(duì)象。賬戶(hù)類(lèi)對(duì)象在接到“存儲(chǔ)自己”的消息后,知道應(yīng)該發(fā)送什么消息到數(shù)據(jù)管理子系統(tǒng),以便把它的狀態(tài)由數(shù)據(jù)管理子系統(tǒng)保存起來(lái),因此也需要增加屬性和服務(wù)來(lái)定義這些行為。使用這種方法的優(yōu)點(diǎn)是沒(méi)有必要修改問(wèn)題域子系統(tǒng)。須知道自己是怎樣存儲(chǔ)的,下面介紹兩種方法可完成這個(gè)任80應(yīng)該定義一個(gè)數(shù)據(jù)管理類(lèi)ObjectServer,并聲明它的對(duì)象。這個(gè)類(lèi)提供下列服務(wù):●通知對(duì)象保存自身或保存需長(zhǎng)期存儲(chǔ)的對(duì)象的狀態(tài);●檢索已存儲(chǔ)的對(duì)象并可使其存儲(chǔ)和恢復(fù)。應(yīng)該定義一個(gè)數(shù)據(jù)管理類(lèi)ObjectServer,并8110.6服務(wù)與關(guān)聯(lián)的設(shè)計(jì)10.6.1設(shè)計(jì)服務(wù)設(shè)計(jì)類(lèi)中的服務(wù)是面向?qū)ο笤O(shè)計(jì)的一項(xiàng)重要內(nèi)容。因?yàn)槊嫦驅(qū)ο蠓治鼋⑵饋?lái)的對(duì)象模型通常并沒(méi)有詳細(xì)描述類(lèi)中的服務(wù),而面向?qū)ο笤O(shè)計(jì)則是擴(kuò)充、完善和細(xì)化面向?qū)ο蠓治瞿P偷倪^(guò)程,所以,詳細(xì)描述類(lèi)中的服務(wù)是面向?qū)ο笤O(shè)計(jì)的必要任務(wù)。10.6服務(wù)與關(guān)聯(lián)的設(shè)計(jì)10.6.1設(shè)計(jì)服務(wù)82
1.確定類(lèi)中應(yīng)有的服務(wù)要正確確定類(lèi)中應(yīng)有的服務(wù),必須綜合考慮對(duì)象模型、動(dòng)態(tài)模型和功能模型。對(duì)象模型是進(jìn)行對(duì)象設(shè)計(jì)的基本依據(jù),但是,在面向?qū)ο蠓治龅膶?duì)象模型的類(lèi)中,沒(méi)有列出服務(wù)或只列出少量的幾個(gè)最基本的服務(wù)。面向?qū)ο笤O(shè)計(jì)過(guò)程中,必須把動(dòng)態(tài)模型中對(duì)象的行為和功能模型中的數(shù)據(jù)處理轉(zhuǎn)換成服務(wù),加入到對(duì)象的類(lèi)中,而這些服務(wù)必須由合適的類(lèi)所提供。1)從對(duì)象模型中引入服務(wù)對(duì)象模型描述了系統(tǒng)的對(duì)象、屬性和服務(wù),則可將這些對(duì)象(以及對(duì)象的服務(wù))直接引入到設(shè)計(jì)中,只是要詳細(xì)定義這些服務(wù)。1.確定類(lèi)中應(yīng)有的服務(wù)832)從動(dòng)態(tài)模型中確定服務(wù)動(dòng)態(tài)模型是由若干個(gè)狀態(tài)圖組成,對(duì)象的生命周期由一張狀態(tài)圖描繪,執(zhí)行對(duì)象服務(wù)使得狀態(tài)轉(zhuǎn)換,狀態(tài)轉(zhuǎn)換是指對(duì)象狀態(tài)的變化。對(duì)象接收到事件后驅(qū)動(dòng)對(duì)象的執(zhí)行服務(wù),實(shí)際上,事件可用消息表現(xiàn),對(duì)象接收消息由該消息的操作符指定服務(wù),該服務(wù)改變對(duì)象狀態(tài),即修改相應(yīng)的屬性值,并完成對(duì)象應(yīng)做的動(dòng)作。對(duì)象的動(dòng)作不但與事件有關(guān),而且與對(duì)象的狀態(tài)有關(guān)。因此,服務(wù)的算法必定與對(duì)象的狀態(tài)有關(guān)。如果一個(gè)對(duì)象在不同狀態(tài)下接收同樣事件,則對(duì)象的行為可不同。由此可用一個(gè)依賴(lài)于狀態(tài)的多分支控制結(jié)構(gòu)來(lái)實(shí)現(xiàn)服務(wù)的算法。2)從動(dòng)態(tài)模型中確定服務(wù)84動(dòng)態(tài)模型描述了系統(tǒng)是如何響應(yīng)外部事件的,程序的主要控制結(jié)構(gòu)來(lái)自于動(dòng)態(tài)模型。設(shè)計(jì)程序的控制結(jié)構(gòu),有時(shí)可通過(guò)內(nèi)部的調(diào)度機(jī)制識(shí)別事件,并將事件映射成操作調(diào)用來(lái)顯式地實(shí)現(xiàn)程序控制;有時(shí)可通過(guò)選擇的算法按動(dòng)態(tài)模型中確定的順序執(zhí)行操作,來(lái)隱式地實(shí)現(xiàn)程序控制。動(dòng)態(tài)模型描述了系統(tǒng)是如何響應(yīng)外部事件的,程序的主要控853)從功能模型中確定服務(wù)功能模型由一組數(shù)據(jù)流圖組成,功能模型指明了系統(tǒng)必須提供的服務(wù)。數(shù)據(jù)流圖中的某些處理可能對(duì)應(yīng)于某個(gè)(些)對(duì)象提供的服務(wù),因此,確定操作的目標(biāo)對(duì)象,然后在該對(duì)象所屬的類(lèi)中定義這些服務(wù)。定義對(duì)象所屬的類(lèi)中的服務(wù)時(shí),必須為服務(wù)選擇合適的算法,有了優(yōu)秀的算法才能設(shè)計(jì)出快速高效的服務(wù)來(lái)。此外,如果某個(gè)服務(wù)特別復(fù)雜而很難實(shí)現(xiàn),則可將復(fù)雜的服務(wù)分解成簡(jiǎn)單的服務(wù),這樣實(shí)現(xiàn)起來(lái)比較容易(當(dāng)然分解的理由不僅僅考慮容易實(shí)現(xiàn)的因素)。算法和分解是實(shí)現(xiàn)優(yōu)化的重要手段。3)從功能模型中確定服務(wù)86
2.設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法上面討論了如何確定對(duì)象所屬的類(lèi)的服務(wù),下面來(lái)討論如何設(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í),首先是滿(mǎn)足用戶(hù)需求,其次才是追求高效率。根據(jù)服務(wù)需求選用復(fù)雜度較低(即效率較高)的算法。2.設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法87●易理解與易實(shí)現(xiàn):設(shè)計(jì)時(shí)考慮算法的易理解性和易實(shí)現(xiàn)性,一個(gè)易理解和易實(shí)現(xiàn)的算法可能與它的高效率是一對(duì)矛盾,設(shè)計(jì)者應(yīng)該權(quán)衡利弊,考慮各個(gè)因素,選擇適當(dāng)?shù)乃惴ā!褚仔薷模涸O(shè)計(jì)時(shí)除了考慮算法的易理解性和易實(shí)現(xiàn)性,還應(yīng)該考慮算法的易修改性。因此,算法設(shè)計(jì)應(yīng)該盡可能通用,結(jié)構(gòu)清晰,并能預(yù)測(cè)到后續(xù)可能的修改情況?!褚桌斫馀c易實(shí)現(xiàn):設(shè)計(jì)時(shí)考慮算法的易理解性和易實(shí)現(xiàn)88(2)選擇數(shù)據(jù)結(jié)構(gòu):在面向?qū)ο蠓治鲞^(guò)程中,僅考慮了系統(tǒng)中數(shù)據(jù)的靜態(tài)的邏輯結(jié)構(gòu),而在面向?qū)ο笤O(shè)計(jì)過(guò)程中,則涉及到選擇算法使用的物理數(shù)據(jù)結(jié)構(gòu),采用該種數(shù)據(jù)結(jié)構(gòu)能夠正確地、高效地實(shí)現(xiàn)算法。多數(shù)面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言都提供了基本數(shù)據(jù)結(jié)構(gòu),可供用戶(hù)自選組合定義。(3)定義內(nèi)部類(lèi)和內(nèi)部操作:在算法設(shè)計(jì)時(shí),為了提高效率而增加一些類(lèi),用來(lái)存放在執(zhí)行算法過(guò)程中所得出的中間結(jié)果。復(fù)雜操作往往是用簡(jiǎn)單對(duì)象上的更低層操作來(lái)定義的。因此,在分解高層操作時(shí)通常會(huì)引入新的低層操作,這些新增加的低層操作在設(shè)計(jì)過(guò)程中必須定義。(2)選擇數(shù)據(jù)結(jié)構(gòu):在面向?qū)ο蠓治鲞^(guò)程中,僅考慮了8910.6.2設(shè)計(jì)關(guān)聯(lián)關(guān)聯(lián)是在對(duì)象模型中聯(lián)結(jié)不同對(duì)象的紐帶,它指定了對(duì)象相互間的訪(fǎng)問(wèn)路徑。在面向?qū)ο蠓治鲞^(guò)程中,僅是初步確定對(duì)象之間的關(guān)聯(lián)和階數(shù)。在面向?qū)ο笤O(shè)計(jì)過(guò)程中,必須確定實(shí)現(xiàn)關(guān)聯(lián)的具體策略。根據(jù)應(yīng)用系統(tǒng)中的使用方式來(lái)確定實(shí)現(xiàn)關(guān)聯(lián)的策略??梢赃x定一個(gè)統(tǒng)一實(shí)現(xiàn)所有關(guān)聯(lián)的全局性的策略,或者對(duì)不同的關(guān)聯(lián)選擇不同的實(shí)現(xiàn)策略。首先對(duì)使用關(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)自然比較簡(jiǎn)單,而雙向關(guān)聯(lián)實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜一些。1.關(guān)聯(lián)的遍歷91
2.單向關(guān)聯(lián)的實(shí)現(xiàn)單向遍歷的關(guān)聯(lián)可用指針來(lái)實(shí)現(xiàn),指針是一個(gè)含有對(duì)象引用的屬性。如果關(guān)聯(lián)的階是一元的,則可用一個(gè)簡(jiǎn)單指針來(lái)實(shí)現(xiàn),如圖10.4所示;如果關(guān)聯(lián)的階是多元的,則需要用一個(gè)指針集合來(lái)實(shí)現(xiàn),參見(jià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ǔ)開(kāi)銷(xiāo)和修改開(kāi)銷(xiāo)時(shí),則這是一種實(shí)現(xiàn)雙向關(guān)聯(lián)的很有效的方法。3.雙向關(guān)聯(lián)的實(shí)現(xiàn)95(2)雙向的關(guān)聯(lián)都用屬性來(lái)實(shí)現(xiàn)。具體實(shí)現(xiàn)方法已在上一小節(jié)介紹過(guò),如圖10.5所示。該方法能實(shí)現(xiàn)快速訪(fǎng)問(wèn),但是,如果一個(gè)屬性修改了,為了保持該關(guān)聯(lián)鏈的一致性,則引起相關(guān)的屬性的修改。如果修改次數(shù)遠(yuǎn)遠(yuǎn)少于訪(fǎng)問(wèn)次數(shù)時(shí),該實(shí)現(xiàn)方法是一種很有效的方法。(3)用獨(dú)立的關(guān)聯(lián)對(duì)象來(lái)實(shí)現(xiàn)。關(guān)聯(lián)對(duì)象不屬于相互關(guān)聯(lián)的任何一個(gè)類(lèi),關(guān)聯(lián)對(duì)象是一個(gè)相關(guān)對(duì)象的集合,也就是說(shuō),它是獨(dú)立的關(guān)聯(lián)類(lèi)的實(shí)例(請(qǐng)見(jiàn)圖10.6)。(2)雙向的關(guān)聯(lián)都用屬性來(lái)實(shí)現(xiàn)。具體實(shí)現(xiàn)方法已在上一96圖10.6用對(duì)象實(shí)現(xiàn)關(guān)聯(lián)圖10.6用對(duì)象實(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)它的方法也不同。如果是一對(duì)一關(guān)聯(lián),鏈屬性可作為其中一個(gè)對(duì)象的屬性并存儲(chǔ)在該對(duì)象中;如果是一對(duì)多關(guān)聯(lián),鏈屬性可作為“多”端對(duì)象的一個(gè)屬性;如果是多對(duì)多關(guān)聯(lián),則鏈屬性與多個(gè)關(guān)聯(lián)對(duì)象有關(guān),一般來(lái)說(shuō),使用一個(gè)獨(dú)立的類(lèi)來(lái)實(shí)現(xiàn)鏈屬性,該類(lèi)的每個(gè)實(shí)例表示一條鏈及該鏈的屬性(請(qǐng)見(jiàn)圖10.6)。4.鏈屬性的實(shí)現(xiàn)9810.7面向?qū)ο笤O(shè)計(jì)的優(yōu)化
1.確定優(yōu)先級(jí)為了尋找一種適合的折衷方案,設(shè)計(jì)人員必須根據(jù)系統(tǒng)需求的各項(xiàng)質(zhì)量指標(biāo),確定各項(xiàng)質(zhì)量指標(biāo)的相對(duì)重要性,即確定優(yōu)先級(jí)。系統(tǒng)的整體質(zhì)量與選擇的折衷方案密切相關(guān)。設(shè)計(jì)優(yōu)化要進(jìn)行全局考慮,確定各項(xiàng)質(zhì)量指標(biāo)的優(yōu)先級(jí)。不要使系統(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)先級(jí)不是很明確的。沒(méi)有辦法指定精確的優(yōu)先級(jí)數(shù)值或所占的比例數(shù)。通常是在效率和清晰性之間尋找適當(dāng)?shù)恼壑苑桨浮?0.7面向?qū)ο笤O(shè)計(jì)的優(yōu)化1.確定優(yōu)先級(jí)992.提高效率的幾項(xiàng)技術(shù)1)增加冗余關(guān)聯(lián)以提高訪(fǎng)問(wèn)效率在面向?qū)ο蠓治鲞^(guò)程中,建立對(duì)象模型時(shí)盡量減少關(guān)聯(lián),避免冗余的關(guān)聯(lián)出現(xiàn),因?yàn)槿哂嚓P(guān)聯(lián)既不會(huì)增加任何信息,又會(huì)降低模型的清晰程度。但是,在面向?qū)ο笤O(shè)計(jì)過(guò)程中,你會(huì)發(fā)現(xiàn),分析階段確定的關(guān)聯(lián),可能不是構(gòu)成效率最高的訪(fǎng)問(wèn)路徑,為了提高訪(fǎng)問(wèn)效率,需要適當(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種技能,則將遍歷職員對(duì)象6000次,再對(duì)每名職員平均追歷技能對(duì)象10次,這樣簡(jiǎn)單的嵌套查詢(xún)共需60000次。如果全公司僅有30名職員精通編程,則查詢(xún)命中率只有1/2000。使用哈希(Hash)表:將“精通編程”作為惟一的一個(gè)技能對(duì)象來(lái)表示,這樣改進(jìn)后就會(huì)使查詢(xún)次數(shù)由60000次減少到6000次?!熬哂屑寄堋标P(guān)聯(lián)不用無(wú)序表來(lái)實(shí)現(xiàn),而是改用哈希表來(lái)實(shí)現(xiàn),使用哈希表是提高訪(fǎng)問(wèn)效率的一種有效方法。假設(shè)某公司共有6000名職員,平均每名職員會(huì)10種技102改進(jìn)后的查詢(xún)雖然提高了訪(fǎng)問(wèn)效率,但是,當(dāng)滿(mǎn)足查詢(xún)條件的對(duì)象極少時(shí),查詢(xún)命中率仍然很低。這時(shí)不妨給需要經(jīng)常查詢(xún)的對(duì)象建立索引,以使得查詢(xún)效率更高。例如,在上述例子中,可以在公司與職員這兩類(lèi)對(duì)象之間建立聯(lián)系,增加一個(gè)額外的限定關(guān)聯(lián)“精通計(jì)算機(jī)”,如圖10.8所示。利用這種適當(dāng)?shù)娜哂嚓P(guān)聯(lián),不必按順序逐個(gè)查找,便可即刻查到精通編程的職員,避免了冗余的訪(fǎng)問(wèn)。當(dāng)然,索引也會(huì)帶來(lái)副作用,增加一定的系統(tǒng)開(kāi)銷(xiāo)。例如,存儲(chǔ)空間增大,當(dāng)修改基關(guān)聯(lián)時(shí)會(huì)引起相應(yīng)的索引的修改等開(kāi)銷(xiāo)。因此,建立索引適合那些經(jīng)常執(zhí)行的,開(kāi)銷(xiāo)大的以及命中率低的查詢(xún),而不是適合任何一類(lèi)查詢(xún)。改進(jìn)后的查詢(xún)雖然提高了訪(fǎng)問(wèn)效率,但是,當(dāng)滿(mǎn)足查詢(xún)條件103圖10.8為職員技能數(shù)據(jù)庫(kù)建立索引圖10.8為職員技能數(shù)據(jù)庫(kù)建立索引1042)調(diào)整查詢(xún)次序優(yōu)化查詢(xún)遍歷是優(yōu)化設(shè)計(jì)的一種有效的方法,優(yōu)化算法是優(yōu)化設(shè)計(jì)的另一種有效的方法。下面我們來(lái)介紹如何優(yōu)化算法。優(yōu)化算法一個(gè)重要目的是縮小查找范圍。例如,假設(shè)用戶(hù)在使用上述的職員技能數(shù)據(jù)庫(kù)的過(guò)程中,希望能找出既精通編程,又精通維修的所有職員。如果某公司有30位職員精通編程,卻有300位職員精通維修,則應(yīng)該先查找精通編程的職員,然后再?gòu)倪@些精通編程的職員中查找同時(shí)又精通維修的職員。也就是說(shuō),首先找出滿(mǎn)足需同時(shí)具備多個(gè)條件中的最小值條件來(lái)縮小查詢(xún)范圍,然后在此基礎(chǔ)上尋找滿(mǎn)足其他條件的職員。采用這樣的調(diào)整查詢(xún)次序來(lái)優(yōu)化算法,以便更好地提高查詢(xún)效率。2)調(diào)整查詢(xún)次序1053)保留派生屬性為了避免重復(fù)計(jì)算復(fù)雜表達(dá)式,將通過(guò)某種運(yùn)算從其他數(shù)據(jù)派生出新的數(shù)據(jù),我們把派生數(shù)據(jù)作為派生屬性保存起來(lái),在類(lèi)似的表達(dá)式計(jì)算中重用。派生屬性既可以定義在原有類(lèi)中,也可以用對(duì)象保存起來(lái)并定義在新類(lèi)中。當(dāng)修改了基本對(duì)象時(shí),必然引起所有依賴(lài)于它的、保存派生屬性的對(duì)象的修改。3)保留派生屬性106
3.調(diào)整繼承關(guān)系調(diào)整繼承關(guān)系是優(yōu)化設(shè)計(jì)的一項(xiàng)重要內(nèi)容。通過(guò)面向?qū)ο蠓治龅玫降膶?duì)象模型中,已經(jīng)建立了繼承關(guān)系。但在面向?qū)ο笤O(shè)計(jì)過(guò)程中,應(yīng)該進(jìn)一步調(diào)整繼承關(guān)系來(lái)優(yōu)化對(duì)象模型。繼承關(guān)系能夠?yàn)橐粋€(gè)類(lèi)族定義一個(gè)協(xié)議,并能在類(lèi)之間實(shí)現(xiàn)代碼共享以減少冗余。一個(gè)基類(lèi)和它的派生類(lèi)組織在一起稱(chēng)為一個(gè)類(lèi)繼承。在面向?qū)ο笤O(shè)計(jì)中,建立良好的類(lèi)繼承對(duì)于優(yōu)化結(jié)構(gòu)是非常重要的。利用類(lèi)繼承能夠把若干個(gè)類(lèi)組織成一個(gè)邏輯結(jié)構(gòu)。下面就設(shè)計(jì)類(lèi)繼承的有關(guān)問(wèn)題進(jìn)行討論。3.調(diào)整繼承關(guān)系1071)抽象與具體在設(shè)計(jì)類(lèi)繼承時(shí),使用自頂向下和自底向上相結(jié)合的方法。設(shè)計(jì)過(guò)程是:①首先創(chuàng)建一些滿(mǎn)足具體用途的類(lèi);②其次對(duì)它們進(jìn)行歸納,歸納出一些通用的類(lèi)作為基類(lèi);③然后可以根據(jù)需要再次派生出具體類(lèi);④最后如果需要?jiǎng)t再次歸納。就這樣經(jīng)過(guò)持續(xù)不斷的演化過(guò)程,設(shè)計(jì)出具有良好的繼承關(guān)系結(jié)構(gòu)的類(lèi)繼承。1)抽象與具體108圖10.9設(shè)計(jì)類(lèi)繼承創(chuàng)建一些具體類(lèi);(b)歸納出抽象類(lèi);(c)進(jìn)一步具體化;(d)再進(jìn)行歸納圖10.9設(shè)計(jì)類(lèi)繼承1092)利用類(lèi)歸納提高繼承程度在系統(tǒng)設(shè)計(jì)時(shí),有時(shí)利用繼承關(guān)系需要進(jìn)行類(lèi)歸納來(lái)提高繼承程度。如果在一組相似的類(lèi)中存在公共的屬性和公共的行為,則可以把這些公共的屬性和行為抽取出來(lái)重新定義一個(gè)類(lèi),作為這些相似類(lèi)(即子類(lèi))的共同的祖先類(lèi),以便供它的子類(lèi)繼承,如圖10.9(a)和(b)所示,這個(gè)過(guò)程就稱(chēng)為類(lèi)歸納。在確保以下兩點(diǎn)的基礎(chǔ)上,可對(duì)現(xiàn)有類(lèi)進(jìn)行歸納:要遵照領(lǐng)域知識(shí)和常識(shí);應(yīng)該確保現(xiàn)有類(lèi)的協(xié)議(即外部接口)不變。2)利用類(lèi)歸納提高繼承程度110類(lèi)歸納時(shí)常見(jiàn)的一種情況:當(dāng)各個(gè)現(xiàn)有類(lèi)中的屬性和行為(操作)相似卻不完全相同時(shí),則需要稍加修改類(lèi)的定義,以便來(lái)定義一個(gè)基類(lèi)供它的子類(lèi)從中繼承需要的屬性或行為。類(lèi)歸納時(shí)常見(jiàn)的另一種情況:有時(shí)抽象出一個(gè)基類(lèi)之后,在系統(tǒng)中繼承它的屬性和行為可能只有一個(gè)子類(lèi)時(shí),這樣的類(lèi)歸納并沒(méi)有獲得良好的共享。但是,歸納的基類(lèi)將來(lái)可能能重用,這樣做通常仍然是值得的,提高了類(lèi)的重用性,也是優(yōu)化設(shè)計(jì)的良好措施。類(lèi)歸納時(shí)常見(jiàn)的一種情況:當(dāng)各個(gè)現(xiàn)有類(lèi)中的屬性和行為(1113)利用委派實(shí)現(xiàn)行為共享當(dāng)類(lèi)間存在一般-特殊關(guān)系時(shí),也就是說(shuō),存在確實(shí)的繼承關(guān)系時(shí),可合理利用繼承機(jī)制實(shí)現(xiàn)行為共享。當(dāng)只想用繼承作為實(shí)現(xiàn)操作共享的一種技術(shù)時(shí),并不需要基類(lèi)和派生類(lèi)具有相同的行為。在這種情況下,如果從基類(lèi)繼承的操作中包含了子類(lèi)不應(yīng)有的行為,則可能帶來(lái)一些麻煩。例如,假設(shè)需要實(shí)現(xiàn)一個(gè)Stack(后進(jìn)先出棧)類(lèi),類(lèi)庫(kù)中已經(jīng)有一個(gè)List(表)類(lèi)。如果從List類(lèi)派生出Stack類(lèi),則如圖10.10(a)所示:3)利用委派實(shí)現(xiàn)行為共享112把一個(gè)元素壓入棧,相當(dāng)于在表尾加入一個(gè)元素;把一個(gè)元素彈出棧,相當(dāng)于從表尾移走一個(gè)元素。但是,Stack類(lèi)同時(shí)也繼承了一些不需要的表操作。例如,從表頭移走一個(gè)元素或在表頭增加一個(gè)元素。用戶(hù)不慎錯(cuò)誤地使用了這類(lèi)操作,Stack類(lèi)將不能正常工作。利用委派實(shí)現(xiàn)行為共享能彌補(bǔ)上述繼承關(guān)系的不足。我們把一類(lèi)對(duì)象作為另一類(lèi)對(duì)象的屬性,從而在兩類(lèi)對(duì)象間建立組合關(guān)系稱(chēng)為委派。利用這種委派(而不是繼承)既能達(dá)到同樣目的,又比較安全。因?yàn)槭褂梦蓹C(jī)制時(shí),委派另一類(lèi)對(duì)象實(shí)現(xiàn)的操作是有意義的,因此不會(huì)引起錯(cuò)誤的或破壞性的操作。把一個(gè)元素壓入棧,相當(dāng)于在表尾加入一個(gè)元素;把一個(gè)元113圖10.10(b)描述了委派List類(lèi)實(shí)現(xiàn)Stack類(lèi)操作的方法。Stack類(lèi)的每個(gè)實(shí)例都包含一個(gè)私有的List類(lèi)實(shí)例(或指向List類(lèi)實(shí)例的指針)。委派List類(lèi)對(duì)象通過(guò)調(diào)用last(定位到表尾)和add(加入一個(gè)元素)操作,來(lái)實(shí)現(xiàn)Stack對(duì)象的push(壓棧)操作;而通過(guò)List的last和remove(移走一個(gè)元素)操作,來(lái)實(shí)現(xiàn)Stack對(duì)象的pop(出棧)操作。圖10.10(b)描述了委派List類(lèi)實(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問(wèn)題域子系統(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ū)ο箝_(kāi)發(fā)方法中,將對(duì)象定義為模塊。對(duì)象把數(shù)據(jù)結(jié)構(gòu)和作用在數(shù)據(jù)上的操作封裝起來(lái)構(gòu)成模塊。對(duì)象是組成系統(tǒng)的基本模塊。10.1面向?qū)ο蟮脑O(shè)計(jì)準(zhǔn)則10.1.1設(shè)計(jì)準(zhǔn)則117
2.抽象類(lèi)是一種抽象數(shù)據(jù)類(lèi)型,在該數(shù)據(jù)類(lèi)型之上,可以創(chuàng)建對(duì)象(類(lèi)的成員)。類(lèi)包含相似對(duì)象的共同屬性和服務(wù),它對(duì)外定義了公共接口,構(gòu)成了類(lèi)的規(guī)格說(shuō)明(即協(xié)議),供外界合法訪(fǎng)問(wèn)。通過(guò)這種接口訪(fǎng)問(wèn)類(lèi)實(shí)例中的數(shù)據(jù)。通常把這類(lèi)抽象稱(chēng)為規(guī)格說(shuō)明抽象。
3.信息隱藏在面向?qū)ο蠓椒ㄖ?,?duì)象是屬性和服務(wù)的封裝體,這就實(shí)現(xiàn)了信息隱藏。類(lèi)結(jié)構(gòu)分離了接口與實(shí)現(xiàn),類(lèi)的屬性的表示方法和操作的實(shí)現(xiàn)算法,對(duì)于類(lèi)的用戶(hù)來(lái)說(shuō),都應(yīng)該是隱藏的,用戶(hù)只能通過(guò)公共接口訪(fǎng)問(wèn)類(lèi)中的屬性。2.抽象118
4.弱耦合所謂耦合,是指一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的依賴(lài)關(guān)系。依賴(lài)關(guān)系越多耦合度越強(qiáng),依賴(lài)關(guān)系越少耦合度越弱。在面向?qū)ο蠓椒ㄖ校瑢?duì)象是最基本的模塊,不同對(duì)象之間相互關(guān)聯(lián)的依賴(lài)關(guān)系表示了耦合度。衡量設(shè)計(jì)優(yōu)良的一個(gè)重要標(biāo)準(zhǔn)就是弱耦合,弱耦合的設(shè)計(jì)中某個(gè)對(duì)象的改變不會(huì)或很少影響到其他對(duì)象。這樣給理解、測(cè)試或修改帶來(lái)很大的方便。反之,強(qiáng)耦合會(huì)給理解、測(cè)試或修改帶來(lái)很大的難度,并且還降低了該類(lèi)的可重用性和可移植性。不同對(duì)象之間耦合是不可避免的。兩個(gè)對(duì)象必須相互聯(lián)系相互依賴(lài)時(shí),應(yīng)該通過(guò)類(lèi)的協(xié)議(即公共接口)實(shí)現(xiàn)兩個(gè)對(duì)象相互依賴(lài)(耦合),而不是通過(guò)類(lèi)的具體實(shí)現(xiàn)細(xì)節(jié)來(lái)描述。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)聚可分為下述三類(lèi):(1)服務(wù)內(nèi)聚。一個(gè)服務(wù)應(yīng)該是單一的,即只完成一個(gè)任務(wù)。(2)類(lèi)內(nèi)聚。類(lèi)內(nèi)聚要求類(lèi)的屬性和服務(wù)應(yīng)該是高內(nèi)聚的,而且它們應(yīng)該是系統(tǒng)任務(wù)所必需的。一個(gè)類(lèi)應(yīng)該只有一個(gè)功能,如果某個(gè)類(lèi)有多個(gè)功能,通常應(yīng)該把它分解成多個(gè)專(zhuān)用的類(lèi)。5.強(qiáng)內(nèi)聚120(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:一般-特殊結(jié)構(gòu)符合領(lǐng)域知識(shí)的表示形式,也就是說(shuō),特殊類(lèi)應(yīng)該盡量地繼承一般類(lèi)的屬性和服務(wù)。這樣的一般-特殊結(jié)構(gòu)是高內(nèi)聚的。例如,雖然表面看來(lái)飛機(jī)與汽車(chē)有相似的地方(都用發(fā)動(dòng)機(jī)驅(qū)動(dòng),都有輪子,……),但是,如果把飛機(jī)和汽車(chē)都作為“機(jī)動(dòng)車(chē)”類(lèi)的子類(lèi),則不符合領(lǐng)域知識(shí)的表示形式,這樣的一般-特殊結(jié)構(gòu)是低內(nèi)聚的。高內(nèi)聚的一般-特殊結(jié)構(gòu)應(yīng)該是,設(shè)置一個(gè)抽象類(lèi)“交通工具”,把飛機(jī)和機(jī)動(dòng)車(chē)作為交通工具類(lèi)的子類(lèi),而汽車(chē)又是機(jī)動(dòng)車(chē)類(lèi)的子類(lèi)。(3)一般-特殊內(nèi)聚。一般-特殊內(nèi)聚表示:1216.可重用在面向?qū)ο笤O(shè)計(jì)中,一個(gè)類(lèi)的設(shè)計(jì)應(yīng)該具有通用性,為開(kāi)發(fā)相似的系統(tǒng)提供軟件重用可能。軟件重用可以提高軟件開(kāi)發(fā)生產(chǎn)率,確保目標(biāo)系統(tǒng)質(zhì)量??芍赜檬敲嫦?qū)ο箝_(kāi)發(fā)方法的一個(gè)重要特性,也就是說(shuō),用面向?qū)ο蟮母拍詈头椒ū容^容易實(shí)現(xiàn)重用。因此,在軟件開(kāi)發(fā)過(guò)程中,為了實(shí)現(xiàn)重用,既要盡量重用已有的類(lèi),又要?jiǎng)?chuàng)建可重用的新類(lèi)。6.可重用12210.1.2設(shè)計(jì)策略在使用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件的實(shí)踐中,得出了下面一些基于經(jīng)驗(yàn)的啟發(fā)規(guī)則,這些規(guī)則往往能幫助軟件開(kāi)發(fā)人員設(shè)計(jì)出好的方案來(lái),以保證軟件的質(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)該與專(zhuān)業(yè)領(lǐng)域中的名字一致,并且要是符合人們習(xí)慣的名字。不同類(lèi)中相似服務(wù)的名字應(yīng)該相同。10.1.2設(shè)計(jì)策略123(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建立了類(lèi)的協(xié)議,避免重復(fù)勞動(dòng)或重復(fù)定義帶來(lái)的差異(不統(tǒng)一)。這些協(xié)議可能是其他設(shè)計(jì)人員已經(jīng)建立了類(lèi)的協(xié)議,或是在類(lèi)庫(kù)中已有的協(xié)議。(3)減少消息連接。盡量采用已有標(biāo)準(zhǔn)的消息連接,去掉不必要的消息連接。采用統(tǒng)一模式建立自己需要的消息連接,以便理解和使用,增強(qiáng)可理解性和可使用性。(4)避免模糊的定義。應(yīng)該定義具有明確、有限用途的類(lèi),避免那些模糊的、不準(zhǔn)確的類(lèi)定義。(2)重用協(xié)議(公共接口)。在設(shè)計(jì)中應(yīng)該使用已經(jīng)建124
2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)從基類(lèi)派生子類(lèi),再?gòu)淖宇?lèi)派生下一層子類(lèi),這樣的一般-特殊結(jié)構(gòu)的類(lèi)層次數(shù)應(yīng)該適當(dāng),不必過(guò)于細(xì)化,層次的深度應(yīng)該是有限的。一般來(lái)說(shuō),在一個(gè)中等規(guī)模(大約包含100個(gè)類(lèi))的系統(tǒng)中,類(lèi)層次數(shù)應(yīng)保持為7±2。2.一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)1253.設(shè)計(jì)簡(jiǎn)單的類(lèi)類(lèi)設(shè)計(jì)應(yīng)該盡量小而簡(jiǎn)單,便于開(kāi)發(fā)和管理。定義很大的類(lèi),它所包含的屬性和服務(wù)相對(duì)就多,會(huì)給開(kāi)發(fā)和使用帶來(lái)困難。實(shí)踐表明,簡(jiǎn)單類(lèi)一個(gè)類(lèi)的定義在50行左右(或兩屏)。簡(jiǎn)單類(lèi)可按照下列的策略定義。(1)避免包含太多的屬性。一個(gè)類(lèi)包含的屬性多少將決定類(lèi)的復(fù)雜程度。一個(gè)類(lèi)包含太多的屬性表明該類(lèi)過(guò)于復(fù)雜了,因此,就可能有過(guò)多的作用在這些屬性上的服務(wù)。(2)避免提供太多服務(wù)。一個(gè)類(lèi)包含的服務(wù)多少也是決定類(lèi)的復(fù)雜程度的一個(gè)重要因素。太復(fù)雜的類(lèi)所提供的服務(wù)肯定太多。一般來(lái)說(shuō),一個(gè)類(lèi)提供的公共服務(wù)不要超過(guò)七個(gè)。3.設(shè)計(jì)簡(jiǎn)單的類(lèi)126(3)明確精練的定義。如果一個(gè)類(lèi)的任務(wù)簡(jiǎn)單了,則它的定義就明確精練了,通常任務(wù)簡(jiǎn)單的類(lèi)可用幾個(gè)簡(jiǎn)單語(yǔ)句描述。(4)簡(jiǎn)化對(duì)象間的通信。每個(gè)對(duì)象應(yīng)該獨(dú)立完成任務(wù)。也就是說(shuō),對(duì)象在完成任務(wù)時(shí),盡量不要依賴(lài)于其他對(duì)象的配合(幫助),對(duì)象之間過(guò)多的依賴(lài)會(huì)破壞類(lèi)的簡(jiǎn)明性和清晰性。雖然,遵循上述設(shè)計(jì)策略能設(shè)計(jì)出明確精練的較小的類(lèi),但在開(kāi)發(fā)大型軟件系統(tǒng)中,必定會(huì)有大量較小的類(lèi)設(shè)計(jì)出來(lái),這將會(huì)導(dǎo)致類(lèi)間的通信變復(fù)雜。采用劃分“主題”的方法,可以解決這個(gè)問(wèn)題。(3)明確精練的定義。如果一個(gè)類(lèi)的任務(wù)簡(jiǎn)單了,則它127
4.設(shè)計(jì)簡(jiǎn)單的協(xié)議消息中的參數(shù)越多表示對(duì)象之間傳遞的消息越復(fù)雜,同樣表明對(duì)象之間的依賴(lài)關(guān)系越復(fù)雜,即對(duì)象間的耦合度越高。一般來(lái)說(shuō),簡(jiǎn)單消息中的參數(shù)不要超過(guò)三個(gè)。過(guò)多的參數(shù)會(huì)導(dǎo)致對(duì)象的修改較復(fù)雜,因?yàn)閷?duì)一個(gè)對(duì)象的修改往往導(dǎo)致其他對(duì)象的修改。4.設(shè)計(jì)簡(jiǎn)單的協(xié)議128
5.設(shè)計(jì)簡(jiǎn)單的服務(wù)類(lèi)中的服務(wù)應(yīng)該設(shè)計(jì)得既簡(jiǎn)單又小,用3~5行源程序代碼比較適合。服務(wù)的源程序中不要包含過(guò)多的語(yǔ)句行,或者復(fù)雜的語(yǔ)句控制結(jié)構(gòu),如分支嵌套、循環(huán)嵌套和函數(shù)調(diào)用等。如果一個(gè)服務(wù)非常復(fù)雜,則應(yīng)該檢查該服務(wù)的控制結(jié)構(gòu),并進(jìn)行分解和簡(jiǎn)化,盡量避免設(shè)計(jì)復(fù)雜的服務(wù)。5.設(shè)計(jì)簡(jiǎn)單的服務(wù)1296.減少設(shè)計(jì)變動(dòng)隨著設(shè)計(jì)方案逐漸成熟,改動(dòng)也應(yīng)該越來(lái)越小,這樣才能設(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ì)同過(guò)程設(shè)計(jì)一樣,自頂向下
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生鮮培訓(xùn)課件教學(xué)課件
- 2024年廣告銷(xiāo)售代理合同
- 2024年度企業(yè)級(jí)云計(jì)算服務(wù)平臺(tái)合作合同
- 2024國(guó)際快遞運(yùn)輸服務(wù)合同詳細(xì)條款
- 大班課件春節(jié)教學(xué)課件
- 真菌課件圖文教學(xué)課件
- 2024年度企業(yè)科技創(chuàng)新與研發(fā)外包合同協(xié)議書(shū)
- 2024年建筑工程施工合同與工程監(jiān)理協(xié)議
- 2024物業(yè)合同糾紛案件
- 2024中船工貿(mào)公司船舶建造合同版本
- 雅魯藏布江大拐彎巨型水電站規(guī)劃方案
- 廣西基本醫(yī)療保險(xiǎn)門(mén)診特殊慢性病申報(bào)表
- 城市經(jīng)濟(jì)學(xué)習(xí)題與答案
- 國(guó)開(kāi)成本會(huì)計(jì)第14章綜合練習(xí)試題及答案
- 幼兒園大班科學(xué):《樹(shù)葉為什么會(huì)變黃》課件
- 1到50帶圈數(shù)字直接復(fù)制
- 鐵路工程施工組織設(shè)計(jì)(施工方案)編制分類(lèi)
- 幼兒園中班數(shù)學(xué)《有趣的圖形》課件
- 《規(guī)劃每一天》教案2021
- 草莓創(chuàng)意主題實(shí)用框架模板ppt
- 山大口腔頜面外科學(xué)課件第5章 口腔種植外科-1概論、口腔種植的生物學(xué)基礎(chǔ)
評(píng)論
0/150
提交評(píng)論