軟件工程 第十一章面向?qū)ο笤O(shè)計(jì).ppt_第1頁(yè)
軟件工程 第十一章面向?qū)ο笤O(shè)計(jì).ppt_第2頁(yè)
軟件工程 第十一章面向?qū)ο笤O(shè)計(jì).ppt_第3頁(yè)
軟件工程 第十一章面向?qū)ο笤O(shè)計(jì).ppt_第4頁(yè)
軟件工程 第十一章面向?qū)ο笤O(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩127頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第11章 面向?qū)ο笤O(shè)計(jì),11.1 面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則 11.2 啟發(fā)規(guī)則 11.3 軟件重用 11.4 系統(tǒng)分解 11.5 設(shè)計(jì)問(wèn)題域子系統(tǒng) 11.6 設(shè)計(jì)人機(jī)交互子系統(tǒng),11.7 設(shè)計(jì)任務(wù)管理子系統(tǒng) 11.8 設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng) 11.9 設(shè)計(jì)類(lèi)中的服務(wù) 11.10 設(shè)計(jì)關(guān)聯(lián) 11.11 設(shè)計(jì)優(yōu)化,分析是提取和整理用戶(hù)需求,并建立問(wèn)題域精確模型的過(guò)程。設(shè)計(jì)則是把分析階段得到的需求轉(zhuǎn)變成符合成本和質(zhì)量要求的、抽象的系統(tǒng)實(shí)現(xiàn)方案的過(guò)程。從面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計(jì)(OOD),是一個(gè)逐漸擴(kuò)充模型的過(guò)程。分析是以問(wèn)題為中心,設(shè)計(jì)則是面向計(jì)算機(jī)的“實(shí)現(xiàn)”開(kāi)發(fā)活動(dòng)。或者說(shuō),面向?qū)ο笤O(shè)計(jì)就是用面向?qū)ο笥^點(diǎn)

2、建立求解域模型的過(guò)程。,軟件設(shè)計(jì)的任務(wù): 把客觀世界的對(duì)象和操作變換成計(jì)算機(jī) 可接受的形式。,11.1 面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則,軟件設(shè)計(jì)的三條重要原則:抽象、信息隱藏和模塊化 1. 模塊化 面向?qū)ο筌浖_(kāi)發(fā)模式,也遵循把系統(tǒng)分解成模塊的設(shè)計(jì)原理:對(duì)象就是模塊。它是把數(shù)據(jù)結(jié)構(gòu)和操作這些數(shù)據(jù)的方法緊密地結(jié)合在一起所構(gòu)成的模塊。,2. 抽象 面向?qū)ο蠓椒ㄟ^(guò)程抽象和數(shù)據(jù)抽象。 類(lèi)是一種抽象數(shù)據(jù)類(lèi)型,對(duì)外提供方法,對(duì)內(nèi)封裝數(shù)據(jù)和實(shí)現(xiàn),使用者可以通過(guò)這些方法說(shuō)明使用類(lèi)中定義的數(shù)據(jù)。通常把這類(lèi)抽象稱(chēng)為規(guī)格說(shuō)明抽象。,參數(shù)化抽象:是指當(dāng)描述類(lèi)的規(guī)格說(shuō)明時(shí)并不具體指定所要操作的數(shù)據(jù)類(lèi)型,而是把數(shù)據(jù)類(lèi)型作為參數(shù)。這使

3、得類(lèi)的抽象程度更高,應(yīng)用范圍更廣,可重用性更高。例如,C+語(yǔ)言提供的“模板”機(jī)制,就是一種參數(shù)化抽象機(jī)制。 3. 信息隱藏 在面向?qū)ο蠓椒ㄖ校畔㈦[藏通過(guò)對(duì)象的封裝性實(shí)現(xiàn)。對(duì)外盡可能隱藏對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),利用有限的接口或方法與外界保持聯(lián)系。,4. 弱耦合 耦合指一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的緊密程度。 在面向?qū)ο蠓椒ㄖ?,?duì)象是最基本的模塊,因此,耦合主要指不同對(duì)象之間相互關(guān)聯(lián)的緊密程度。 弱耦合是優(yōu)秀設(shè)計(jì)的一個(gè)重要標(biāo)準(zhǔn),低耦合使得系統(tǒng)中某一部分的變化對(duì)其他部分的影響降到最低程度。在理想情況下,對(duì)某一部分的理解、測(cè)試或修改,無(wú)須涉及系統(tǒng)的其他部分。,為了達(dá)到低耦合,模塊之間的應(yīng)該是很少接口、

4、很小接口和顯式的接口。很少接口是指模塊間接口的數(shù)量應(yīng)該最小化;很小接口就是某一個(gè)接口移動(dòng)的信息量應(yīng)該最小化;顯式接口就是當(dāng)模塊通信時(shí)應(yīng)該用顯式或直接的方式。 一般說(shuō)來(lái),對(duì)象之間的耦合可分為兩大類(lèi):交互耦合和繼承耦合,(1) 交互耦合 如果對(duì)象之間的耦合通過(guò)消息連接來(lái)實(shí)現(xiàn),則這種耦合就是交互耦合。為使交互耦合盡可能松散,應(yīng)該遵守下述準(zhǔn)則: 盡量降低消息連接的復(fù)雜程度。 盡量減少消息中包含的參數(shù)個(gè)數(shù),降低參數(shù)的復(fù)雜程度。 減少對(duì)象發(fā)送(或接收)的消息數(shù)。 (2) 繼承耦合,繼承耦合是一般化類(lèi)與特殊類(lèi)之間耦合的一種形式。 與交互耦合相反,應(yīng)該提高繼承耦合程度。 通過(guò)繼承關(guān)系結(jié)合起來(lái)的基類(lèi)和派生類(lèi),構(gòu)

5、成了系統(tǒng)中粒度更大的模塊。因此,它們彼此之間結(jié)合得越緊密越好。 為獲得緊密的繼承耦合,在設(shè)計(jì)時(shí)應(yīng)該使特殊類(lèi)盡量多繼承并使用其一般化類(lèi)的屬性和服務(wù),從而更緊密地耦合到其一般化類(lèi)。,5. 強(qiáng)內(nèi)聚 內(nèi)聚衡量一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度。 在設(shè)計(jì)時(shí)應(yīng)該力求做到高內(nèi)聚。 在面向?qū)ο笤O(shè)計(jì)中存在下述3種內(nèi)聚。 (1) 服務(wù)內(nèi)聚:一個(gè)服務(wù)應(yīng)該完成一個(gè)且僅完成一個(gè)功能。 (2) 類(lèi)內(nèi)聚:設(shè)計(jì)類(lèi)的原則是,一個(gè)類(lèi)應(yīng)該只有一個(gè)用途,它的屬性和服務(wù)應(yīng)該是高內(nèi)聚的。,(3) 一般-特殊內(nèi)聚。設(shè)計(jì)出的一般-特殊結(jié)構(gòu),應(yīng)該符合多數(shù)人的概念,更準(zhǔn)確地說(shuō),這種結(jié)構(gòu)應(yīng)該是對(duì)相應(yīng)的領(lǐng)域知識(shí)的正確抽取。 一般說(shuō)來(lái),緊密的繼承耦

6、合與高度的一般-特殊內(nèi)聚是一致的。,6. 可重用 軟件重用是提高軟件生產(chǎn)率和質(zhì)量的重要途徑。在面向?qū)ο笤O(shè)計(jì)中,重用占有非常重要的地位。 重用從設(shè)計(jì)階段開(kāi)始。 重用有兩方面的含義: 一.是盡量使用已有的類(lèi)(包括開(kāi)發(fā)環(huán)境提供的類(lèi)庫(kù),及以往開(kāi)發(fā)類(lèi)似系統(tǒng)時(shí)創(chuàng)建的類(lèi)), 二.是如果確實(shí)需要?jiǎng)?chuàng)建新類(lèi),則在設(shè)計(jì)這些新類(lèi)的協(xié)議時(shí),應(yīng)該考慮將來(lái)的可重復(fù)使用性。,11.2 啟發(fā)規(guī)則,使用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件得出以下幾條啟發(fā)規(guī)則,可以幫助開(kāi)發(fā)人員提高面向?qū)ο笤O(shè)計(jì)的質(zhì)量。 1. 設(shè)計(jì)結(jié)果應(yīng)該清晰易懂 提高軟件可維護(hù)性和可重用性的重要措施是使設(shè)計(jì)結(jié)果清晰、易讀、易懂 。 保證設(shè)計(jì)結(jié)果清晰易懂的主要因素如下。,(1)

7、用詞一致。命名應(yīng)與其所代表的事物一致,與人們習(xí)慣的名字一致。不同類(lèi)中相似服務(wù)的名字應(yīng)該相同。 (2) 使用已有的協(xié)議。已有的協(xié)議包括同一軟件的其他設(shè)計(jì)人員已經(jīng)建立了類(lèi)的協(xié)議,及已在所使用的類(lèi)庫(kù)中相應(yīng)的協(xié)議,則應(yīng)該使用這些協(xié)議。 (3) 減少消息模式的數(shù)目。如果已有標(biāo)準(zhǔn)的消息協(xié)議,設(shè)計(jì)人員應(yīng)該遵守這些協(xié)議。如果確需自己建立消息協(xié)議,則應(yīng)該盡量減少消息模式的數(shù)目。有利于讀者理解。,(4) 避免模糊的定義。一個(gè)類(lèi)的用途應(yīng)該是有限的,而且應(yīng)該從類(lèi)名可以較容易地推想出它的用途。 2. 一般-特殊結(jié)構(gòu)的深度應(yīng)適當(dāng) 類(lèi)等級(jí)中包含的層次數(shù)要適當(dāng)。 一般說(shuō)來(lái),在一個(gè)中等規(guī)模(大約包含100個(gè)類(lèi))的系統(tǒng)中,類(lèi)等級(jí)

8、層次數(shù)應(yīng)保持為72。 不應(yīng)該僅僅從方便編碼的角度出發(fā)隨意創(chuàng)建派生類(lèi),應(yīng)該使一般-特殊結(jié)構(gòu)與領(lǐng)域知識(shí)或常識(shí)保持一致。,3. 設(shè)計(jì)簡(jiǎn)單的類(lèi) 應(yīng)該盡量設(shè)計(jì)小而簡(jiǎn)單的類(lèi),便于開(kāi)發(fā)管理。 經(jīng)驗(yàn)表明,如果一個(gè)類(lèi)的定義不超過(guò)一頁(yè)紙(或兩屏),則使用這個(gè)類(lèi)是比較容易的。 為使類(lèi)保持簡(jiǎn)單,應(yīng)該注意以下幾點(diǎn)。 避免包含過(guò)多的屬性。 (2) 有明確的定義。 (3) 盡量簡(jiǎn)化對(duì)象之間的合作關(guān)系。 (4) 不要提供太多服務(wù)。,但由于類(lèi)的規(guī)格較小,則有可能導(dǎo)致類(lèi)的數(shù)目增多,帶來(lái)一定的復(fù)雜性。此時(shí),可將類(lèi)分組,劃分“主題”予以解決。 4. 使用簡(jiǎn)單的協(xié)議 一般說(shuō)來(lái),消息中的參數(shù)不要超過(guò)3個(gè)。 經(jīng)驗(yàn)表明,通過(guò)復(fù)雜消息相互關(guān)聯(lián)

9、的對(duì)象是緊耦合的,對(duì)一個(gè)對(duì)象的修改往往導(dǎo)致其他對(duì)象的修改。,5. 使用簡(jiǎn)單的服務(wù) 一般說(shuō)來(lái),面向?qū)ο笤O(shè)計(jì)類(lèi)時(shí)應(yīng)盡量避免使用復(fù)雜的服務(wù)。 服務(wù)通常都很小,一般只有35行源程序語(yǔ)句,可以用僅含一個(gè)動(dòng)詞和一個(gè)賓語(yǔ)的簡(jiǎn)單句子描述它的功能。 如果一個(gè)服務(wù)中包含了過(guò)多的源程序語(yǔ)句,或者語(yǔ)句嵌套層次太多,或者使用了復(fù)雜的CASE語(yǔ)句,則應(yīng)該仔細(xì)檢查這個(gè)服務(wù),設(shè)法分解或簡(jiǎn)化它。,如果需要在服務(wù)中使用CASE語(yǔ)句,通常應(yīng)該考慮用一般-特殊結(jié)構(gòu)代替這個(gè)類(lèi)的可能性。 6. 把設(shè)計(jì)變動(dòng)減至最小 通常,設(shè)計(jì)的質(zhì)量越高,設(shè)計(jì)結(jié)果保持不變的時(shí)間也越長(zhǎng)。即使必須修改設(shè)計(jì),也應(yīng)該使修改的范圍盡可能小。理想的設(shè)計(jì)變動(dòng)曲線如圖11

10、.1所示。,圖11.1 理想的設(shè)計(jì)變動(dòng)情況,在設(shè)計(jì)的早期階段,變動(dòng)較大,隨著時(shí)間推移,設(shè)計(jì)方案日趨成熟,改動(dòng)也越來(lái)越小了。圖中的峰值與出現(xiàn)設(shè)計(jì)錯(cuò)誤或發(fā)生非預(yù)期變動(dòng)的情況相對(duì)應(yīng)。峰值越高,表明設(shè)計(jì)質(zhì)量越差,可重用性也越差。,11.3 軟件重用 11.3.1 概述,1. 重用 重用也叫再用或復(fù)用,是指同一事物不作修改或稍加改動(dòng)就多次重復(fù)使用。 廣義地說(shuō),軟件重用可分為以下3個(gè)層次: (1) 知識(shí)重用(例如,軟件工程知識(shí)的重用)。 (2) 方法和標(biāo)準(zhǔn)的重用(例如,面向?qū)ο蠓椒ɑ驀?guó)家制定的軟件開(kāi)發(fā)規(guī)范的重用)。 (3) 軟件成分的重用。,2. 軟件成分的重用級(jí)別 軟件成分的重用劃分為3個(gè)級(jí)別: (1)

11、 代碼重用 代碼重用通常把它理解為調(diào)用庫(kù)中的模塊。 實(shí)際上,代碼重用也可以采用下列幾種形式中的任何一種: 源代碼剪貼:這是最原始的重用形式。 源代碼包含:許多程序設(shè)計(jì)語(yǔ)言都提供包含(include)庫(kù)中源代碼的機(jī)制。 繼承:利用繼承機(jī)制可以擴(kuò)充或具體化庫(kù)中的類(lèi)。,(2) 設(shè)計(jì)結(jié)果重用 設(shè)計(jì)結(jié)果重用是指重用某個(gè)軟件系統(tǒng)的設(shè)計(jì)模型(即求解域模型)。 此重用有助于把一個(gè)應(yīng)用系統(tǒng)移植到完全不同的軟硬件平臺(tái)上。 (3) 分析結(jié)果重用 重用某個(gè)系統(tǒng)的分析模型。 這種重用特別適用于用戶(hù)需求未改變,但系統(tǒng)體系結(jié)構(gòu)發(fā)生了根本變化的場(chǎng)合。 是一種更高級(jí)別的重用。,3. 典型的可重用軟件成分 被重用的軟件成分主要有

12、以下10種: (1) 項(xiàng)目計(jì)劃。軟件項(xiàng)目計(jì)劃的基本結(jié)構(gòu)和許多內(nèi)容(例如,軟件質(zhì)量保證計(jì)劃)都是可以跨項(xiàng)目重用的。這樣做減少了用于制定計(jì)劃的時(shí)間,也降低了與建立進(jìn)度表和進(jìn)行風(fēng)險(xiǎn)分析等活動(dòng)相關(guān)聯(lián)的不確定性。 (2) 成本估計(jì)。因?yàn)樵诓煌?xiàng)目中經(jīng)常含有類(lèi)似的功能,所以有可能在只做極少修改或根本不做修改的情況下,重用對(duì)該功能的成本估計(jì)結(jié)果。,(3) 體系結(jié)構(gòu)。即使不同的應(yīng)用領(lǐng)域時(shí),也很少有截然不同的程序和數(shù)據(jù)體系結(jié)構(gòu)。因此,有可能創(chuàng)建一組類(lèi)屬的體系結(jié)構(gòu)模板(例如,事務(wù)處理體系結(jié)構(gòu)),并把那些模板作為可重用的設(shè)計(jì)框架。通常把類(lèi)屬的體系結(jié)構(gòu)模板稱(chēng)為領(lǐng)域體系結(jié)構(gòu)。 (4) 需求模型和規(guī)格說(shuō)明。類(lèi)和對(duì)象的模型

13、及規(guī)格說(shuō)明是明顯的重用的候選者,此外,用傳統(tǒng)軟件工程方法開(kāi)發(fā)的分析模型(例如,數(shù)據(jù)流圖),也是可重用的。,(5) 設(shè)計(jì)。 用傳統(tǒng)方法開(kāi)發(fā)的體系結(jié)構(gòu)、數(shù)據(jù)、接口和過(guò)程設(shè)計(jì)結(jié)果,是重用的候選者。 更常見(jiàn)的是,系統(tǒng)和對(duì)象設(shè)計(jì)是可重用的。 (6) 源代碼。用兼容的程序設(shè)計(jì)語(yǔ)言書(shū)寫(xiě)的、經(jīng)過(guò)驗(yàn)證的程序構(gòu)件,是重用的候選者。 (7) 用戶(hù)文檔和技術(shù)文檔。即使針對(duì)的應(yīng)用是不同的,也經(jīng)常有可能重用用戶(hù)文檔和技術(shù)文檔的大部分。,(8) 用戶(hù)界面。 GUI(圖形用戶(hù)界面),因?yàn)樗烧嫉揭粋€(gè)應(yīng)用程序的60%代碼量,因此,重用的效果非常顯著。這是最廣泛被重用的軟件成分。 (9) 數(shù)據(jù)。在大多數(shù)經(jīng)常被重用的軟件成分中,被

14、重用的數(shù)據(jù)包括: 內(nèi)部表、列表和記錄結(jié)構(gòu),以及文件和完整的數(shù)據(jù)庫(kù)。 (10) 測(cè)試用例。一旦設(shè)計(jì)或代碼構(gòu)件將被重用,相關(guān)的測(cè)試用例應(yīng)該“附屬于”它們也被重用。,11.3.2 類(lèi)構(gòu)件,面向?qū)ο蠹夹g(shù)中的“類(lèi)”,是比較理想的可重用軟構(gòu)件,可稱(chēng)之為類(lèi)構(gòu)件。 類(lèi)構(gòu)件有3種重用方式,分別是: 實(shí)例重用 繼承重用 多態(tài)重用,1. 可重用軟構(gòu)件應(yīng)具備的特點(diǎn) 為使軟構(gòu)件也像硬件集成電路那樣,能在構(gòu)造各種各樣的軟件系統(tǒng)時(shí)方便地重復(fù)使用,就必須使它們滿(mǎn)足下列要求。 (1) 模塊獨(dú)立性強(qiáng)。具有單一、完整的功能,且經(jīng)過(guò)反復(fù)測(cè)試被確認(rèn)是正確的。它應(yīng)該是一個(gè)不受或很少受外界干擾的封裝體,其內(nèi)部實(shí)現(xiàn)在外面是不可見(jiàn)的。,(2)

15、 具有高度可塑性。 可重用的軟構(gòu)件必須具有高度可裁剪性,也就是說(shuō),必須提供為適應(yīng)特定需求而擴(kuò)充或修改已有構(gòu)件的機(jī)制,而且所提供的機(jī)制必須使用起來(lái)非常簡(jiǎn)單方便。 (3) 接口清晰、簡(jiǎn)明、可靠。 軟構(gòu)件應(yīng)該提供清晰、簡(jiǎn)明、可靠的對(duì)外接口,而且還應(yīng)該有詳盡的文檔說(shuō)明,方便用戶(hù)使用。,2. 類(lèi)構(gòu)件的重用方式 (1) 實(shí)例重用 由于類(lèi)的封裝性,使用者無(wú)須了解實(shí)現(xiàn)細(xì)節(jié)就可以使用適當(dāng)?shù)臉?gòu)造函數(shù),按照需要?jiǎng)?chuàng)建類(lèi)的實(shí)例。然后向所創(chuàng)建的實(shí)例發(fā)送適當(dāng)?shù)南ⅲ瑔?dòng)相應(yīng)的服務(wù),完成需要完成的工作。這是最基本的重用方式。 還可以用幾個(gè)簡(jiǎn)單的對(duì)象作為類(lèi)的成員創(chuàng)建出一個(gè)更復(fù)雜的類(lèi),這是實(shí)例重用的另一種形式。,(2) 繼承重用

16、 繼承性提供了一種對(duì)已有的類(lèi)構(gòu)件進(jìn)行裁剪的機(jī)制。 繼承重用提供了一種安全地修改已有類(lèi)構(gòu)件,以便在當(dāng)前系統(tǒng)中重用的手段。 為提高繼承重用的效果,關(guān)鍵是設(shè)計(jì)一個(gè)合理的、具有一定深度的類(lèi)構(gòu)件繼承層次結(jié)構(gòu)。這樣做可降低了每個(gè)類(lèi)構(gòu)件的接口復(fù)雜度,提高了每個(gè)子類(lèi)的可理解性,而且為軟件開(kāi)發(fā)人員提供了更多可重用的類(lèi)構(gòu)件。同時(shí)為多態(tài)重用奠定了基礎(chǔ)。,(3) 多態(tài)重用 利用多態(tài)性可以使對(duì)象的對(duì)外接口更加一般化(基類(lèi)與派生類(lèi)的許多對(duì)外接口是相同的),從而降低了消息連接的復(fù)雜程度。 多態(tài)性同時(shí)提供了一種簡(jiǎn)便可靠的軟構(gòu)件組合機(jī)制。 系統(tǒng)運(yùn)行時(shí),根據(jù)接收消息的對(duì)象類(lèi)型,由多態(tài)性機(jī)制啟動(dòng)正確的方法,去響應(yīng)一個(gè)一般化的消息,

17、從而簡(jiǎn)化了消息界面和軟構(gòu)件連接過(guò)程。,為充分實(shí)現(xiàn)多態(tài)重用,在設(shè)計(jì)類(lèi)構(gòu)件時(shí),應(yīng)該把注意力集中在下列一些可能影響重用性的操作上: 與表示方法有關(guān)的操作。例如,不同實(shí)例的比較、顯示、擦除等等。 與數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)大小等有關(guān)的操作。 與外部設(shè)備有關(guān)的操作。例如,設(shè)備控制。 實(shí)現(xiàn)算法在將來(lái)可能會(huì)改進(jìn)(或改變)的核心操作。,11.3.3 軟件重用的效益,1. 質(zhì)量 理想情況下,為了重用而開(kāi)發(fā)的軟件構(gòu)件已被證明是正確的,且沒(méi)有缺陷。事實(shí)上,由于不能定期進(jìn)行形式化驗(yàn)證,錯(cuò)誤可能而且也確實(shí)存在。但是,隨著每一次重用,都會(huì)有一些錯(cuò)誤被發(fā)現(xiàn)并被清除,構(gòu)件的質(zhì)量也會(huì)隨之改善。隨著時(shí)間的推移,構(gòu)件將變成實(shí)質(zhì)上無(wú)錯(cuò)誤的。,

18、2. 生產(chǎn)率 當(dāng)把可重用的軟件成分應(yīng)用于軟件開(kāi)發(fā)的全過(guò)程時(shí),創(chuàng)建計(jì)劃、模型、文檔、代碼和數(shù)據(jù)所需花費(fèi)的時(shí)間將減少,從而將用較少的投入給客戶(hù)提供相同級(jí)別的產(chǎn)品,因此,生產(chǎn)率得到了提高。 由于應(yīng)用領(lǐng)域、問(wèn)題復(fù)雜程度、項(xiàng)目組的結(jié)構(gòu)和大小、項(xiàng)目期限、可應(yīng)用的技術(shù)等許多因素都對(duì)項(xiàng)目組的生產(chǎn)率有影響,因此,不同開(kāi)發(fā)組織對(duì)軟件重用帶來(lái)生產(chǎn)率提高的數(shù)字的報(bào)告并不相同,但基本上30%50%的重用大約可以導(dǎo)致生產(chǎn)率提高25%40%。,3. 成本 軟件重用帶來(lái)的凈成本節(jié)省可以用下式估算:C=Cs-Cr-Cd 其中,Cs是項(xiàng)目從頭開(kāi)發(fā)(沒(méi)有重用)時(shí)所需要的成本;Cr是與重用相關(guān)聯(lián)的成本;Cd是交付給客戶(hù)的軟件的實(shí)際成

19、本。 可以使用本書(shū)第13章講述的技術(shù)來(lái)估算Cs,而與重用相關(guān)聯(lián)的成本Cr主要包括下述成本: 領(lǐng)域分析與建模的成本; 設(shè)計(jì)領(lǐng)域體系結(jié)構(gòu)的成本; 為便于重用而增加的文檔的成本;,維護(hù)和完善可重用的軟件成分的成本; 為從外部獲取構(gòu)件所付出的版稅和許可證費(fèi); 創(chuàng)建(或購(gòu)買(mǎi))及運(yùn)行重用庫(kù)的費(fèi)用; 對(duì)設(shè)計(jì)和實(shí)現(xiàn)可重用構(gòu)件的人員的培訓(xùn)費(fèi)用。 雖然和領(lǐng)域分析及運(yùn)行重用庫(kù)相關(guān)聯(lián)的成本可能相當(dāng)高,但是它們可以由許多項(xiàng)目分?jǐn)偂?11.4 系統(tǒng)分解,人類(lèi)解決復(fù)雜問(wèn)題時(shí)普遍采用的策略是,“分而治之,各個(gè)擊破”。 同樣,軟件工程師在設(shè)計(jì)比較復(fù)雜的應(yīng)用系統(tǒng)時(shí)普遍采用的策略,也是首先把系統(tǒng)分解成若干個(gè)比較小的部分,然后再分別

20、設(shè)計(jì)每個(gè)部分。 這樣有利于降低設(shè)計(jì)的難度,有利于分工協(xié)作,也有利于維護(hù)人員對(duì)系統(tǒng)理解和維護(hù)。,通過(guò)面向?qū)ο蠓治鏊贸龅膯?wèn)題域精確模型,為設(shè)計(jì)問(wèn)題域子系統(tǒng)奠定了良好的基礎(chǔ),建立了完整的框架。一般應(yīng)該保持面向?qū)ο蠓治鏊⒌膯?wèn)題域結(jié)構(gòu)。 通常,面向?qū)ο笤O(shè)計(jì)僅需從實(shí)現(xiàn)角度對(duì)問(wèn)題域模型做一些補(bǔ)充或修改,主要是增添、合并或分解類(lèi)與對(duì)象、屬性及服務(wù),調(diào)整繼承關(guān)系等等。 當(dāng)問(wèn)題域子系統(tǒng)過(guò)分復(fù)雜龐大時(shí),應(yīng)該把它進(jìn)一步分解成若干個(gè)更小的子系統(tǒng)。,通常根據(jù)所提供的功能來(lái)劃分子系統(tǒng)。一般說(shuō)來(lái),子系統(tǒng)的數(shù)目應(yīng)該與系統(tǒng)規(guī)模基本匹配。 在劃分和設(shè)計(jì)子系統(tǒng)時(shí)應(yīng)遵循下列幾個(gè)原則: 1)各個(gè)子系統(tǒng)之間應(yīng)該具有盡可能簡(jiǎn)單、明確的

21、接口。 2)應(yīng)保持設(shè)計(jì)的各個(gè)子系統(tǒng)相對(duì)獨(dú)立。 3)減少子系統(tǒng)彼此間的依賴(lài)性。,采用面向?qū)ο蠓椒ㄔO(shè)計(jì)軟件系統(tǒng)時(shí),面向?qū)ο笤O(shè)計(jì)模型(即求解域的對(duì)象模型),與面向?qū)ο蠓治瞿P?即問(wèn)題域的對(duì)象模型)一樣,也由主題、類(lèi)與對(duì)象、結(jié)構(gòu)、屬性、服務(wù)等5個(gè)層次組成。這5個(gè)層次一層比一層表示的細(xì)節(jié)更多,可以把這5個(gè)層次想象為整個(gè)模型的水平切片。 大多數(shù)系統(tǒng)的面向?qū)ο笤O(shè)計(jì)模型,在邏輯上都由4大部分組成。這4大部分對(duì)應(yīng)于組成目標(biāo)系統(tǒng)的4個(gè)子系統(tǒng),它們分別是:?jiǎn)栴}域子系統(tǒng)、人機(jī)交互子系統(tǒng)、任務(wù)管理子系統(tǒng)和數(shù)據(jù)管理子系統(tǒng)。,典型的面向?qū)ο笤O(shè)計(jì)模型,1. 子系統(tǒng)之間的兩種交互方式 在軟件系統(tǒng)中,子系統(tǒng)之間的交互有兩種可能的

22、方式,分別是客戶(hù)-供應(yīng)商(Client-supplier)關(guān)系和平等伙伴(peer-to-peer)關(guān)系。 (1) 客戶(hù)-供應(yīng)商關(guān)系 “供應(yīng)商”的子系統(tǒng)提供接口作為“客戶(hù)”的子系統(tǒng)的調(diào)用,并返回結(jié)果給“客戶(hù)” 。整個(gè)調(diào)用過(guò)程是“客戶(hù)”子系統(tǒng)驅(qū)動(dòng)的。 使用這種交互方案,客戶(hù)子系統(tǒng)必須了解供應(yīng)商子系統(tǒng)提供的接口,然而“供應(yīng)商” 卻無(wú)須了解“客戶(hù)”的接口。,(2) 平等伙伴關(guān)系 在這種關(guān)系中,每個(gè)子系統(tǒng)都是客戶(hù),亦都是供應(yīng)商,可以互相調(diào)用。 每個(gè)子系統(tǒng)都必須了解其他子系統(tǒng)的接口以便調(diào)用。相對(duì)于客戶(hù)-供應(yīng)商關(guān)系而言,平等伙伴關(guān)系中的子系統(tǒng)之間的交互更復(fù)雜,而且這種交互方式還可能存在通信環(huán)路,使系統(tǒng)難于

23、理解,容易發(fā)生設(shè)計(jì)錯(cuò)誤。 總的說(shuō)來(lái),單向交互比雙向交互更容易理解,也更容易設(shè)計(jì)和修改,因此應(yīng)該盡量使用客戶(hù)-供應(yīng)商關(guān)系。,2. 組織系統(tǒng)的兩種方案 把子系統(tǒng)組織成完整的系統(tǒng)時(shí),有水平層次組織和垂直塊組織兩種方案可供選擇。 (1) 層次組織 這種組織方案把軟件系統(tǒng)組織成一個(gè)層次系統(tǒng),每層是一個(gè)子系統(tǒng)。上層在下層的基礎(chǔ)上建立,下層為實(shí)現(xiàn)上層功能而提供必要的服務(wù)。每一層內(nèi)所包含的對(duì)象,彼此間相互獨(dú)立,而處于不同層次上的對(duì)象,彼此間往往有關(guān)聯(lián)。,上層通過(guò)層間的接口調(diào)用下層提供的服務(wù),在上、下層之間存在客戶(hù)-供應(yīng)商關(guān)系。低層子系統(tǒng)提供服務(wù),相當(dāng)于供應(yīng)商,上層子系統(tǒng)使用下層提供的服務(wù),相當(dāng)于客戶(hù)。 層次結(jié)

24、構(gòu)又可進(jìn)一步劃分成兩種模式:封閉式和開(kāi)放式。 封閉式模式:就是每層子系統(tǒng)僅僅使用其直接下層提供的服務(wù)。由于一個(gè)層次的接口只影響與其緊相鄰的上一層,因此,這種工作模式降低了各層次之間的相互依賴(lài)性,更,容易理解和修改。 開(kāi)放模式:某層子系統(tǒng)可以使用處于其下面的任何一層子系統(tǒng)所提供的服務(wù)。這種工作模式的優(yōu)點(diǎn),是減少了需要在每層重新定義的服務(wù)數(shù)目,使得整個(gè)系統(tǒng)更高效更緊湊。但是,缺點(diǎn)是開(kāi)放模式的系統(tǒng)不符合信息隱藏原則,對(duì)任何一個(gè)子系統(tǒng)的修改都會(huì)影響處在更高層次的那些子系統(tǒng)。 設(shè)計(jì)軟件系統(tǒng)時(shí)到底采用哪種結(jié)構(gòu)模式,需要權(quán)衡效率和模塊獨(dú)立性等多種因素,通盤(pán)考慮以后再做決定。,(2) 塊狀組織 這種組織方案把

25、軟件系統(tǒng)垂直地分解成若干個(gè)相對(duì)獨(dú)立的、弱耦合的子系統(tǒng),一個(gè)子系統(tǒng)相當(dāng)于一塊,每塊提供一種類(lèi)型的服務(wù)。,圖11.3 典型應(yīng)用系統(tǒng)的組織結(jié)構(gòu),11.5 設(shè)計(jì)問(wèn)題域子系統(tǒng),使用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件時(shí),在分析與設(shè)計(jì)之間并沒(méi)有明確的分界線。 通過(guò)面向?qū)ο蠓治鏊贸龅膯?wèn)題域精確模型,為設(shè)計(jì)問(wèn)題域子系統(tǒng)奠定了良好的基礎(chǔ),建立了完整的框架。 面向?qū)ο笤O(shè)計(jì)僅需從實(shí)現(xiàn)角度對(duì)問(wèn)題域模型做一些補(bǔ)充或修改,主要是增添、合并或分解類(lèi)與對(duì)象、屬性及服務(wù),調(diào)整繼承關(guān)系等等。當(dāng)問(wèn)題域子系統(tǒng)過(guò)分復(fù)雜龐大時(shí),應(yīng)該把它進(jìn)一步分解成若干個(gè)更小的子系統(tǒng)。,下面介紹,在面向?qū)ο笤O(shè)計(jì)過(guò)程中,可能對(duì)面向?qū)ο蠓治鏊贸龅膯?wèn)題域模型做的補(bǔ)充或修改

26、。 1. 調(diào)整需求 需求的變化可能貫穿于軟件開(kāi)發(fā)的全過(guò)程。有兩種情況會(huì)導(dǎo)致修改通過(guò)面向?qū)ο蠓治鏊_定的系統(tǒng)需求:一、是用戶(hù)需求或外部環(huán)境發(fā)生了變化; 二、是分析員對(duì)問(wèn)題域理解不透徹或缺乏領(lǐng)域?qū)<規(guī)椭?,以致面向?qū)ο蠓治瞿P筒荒芡暾?zhǔn)確地反映用戶(hù)的真實(shí)需求。 如出現(xiàn)上述情況,則修改面向?qū)ο蠓治瞿P?,再將修改反映到?wèn)題域子系統(tǒng)中。,2. 重用已有的類(lèi) 代碼重用從設(shè)計(jì)階段開(kāi)始,在研究面向?qū)ο蠓治鼋Y(jié)果時(shí)就應(yīng)該尋找使用已有類(lèi)的方法 若因?yàn)闆](méi)有合適的類(lèi)可以重用而確實(shí)需要?jiǎng)?chuàng)建新的類(lèi),則在設(shè)計(jì)這些新類(lèi)的協(xié)議時(shí),必須考慮到將來(lái)的可重用性。 如果有可能重用已有的類(lèi),則重用已有類(lèi)的典型過(guò)程如下:,(1) 選擇有可能

27、被重用的已有類(lèi),標(biāo)出這些候選類(lèi)中對(duì)本問(wèn)題無(wú)用的屬性和服務(wù),盡量重用那些能使無(wú)用的屬性和服務(wù)降到最低程度的類(lèi)。 (2) 在被重用的已有類(lèi)和問(wèn)題域類(lèi)之間添加泛化關(guān)系(即從被重用的已有類(lèi)派生出問(wèn)題域類(lèi))。 (3) 標(biāo)出問(wèn)題域類(lèi)中從已有類(lèi)繼承來(lái)的屬性和服務(wù),無(wú)須在問(wèn)題域類(lèi)內(nèi)定義它們。 (4) 修改與問(wèn)題域類(lèi)相關(guān)的關(guān)聯(lián),必要時(shí)改為與被重用的已有類(lèi)相關(guān)的關(guān)聯(lián)。,3. 把問(wèn)題域類(lèi)組合在一起 在面向?qū)ο笤O(shè)計(jì)過(guò)程中,設(shè)計(jì)者往往通過(guò)引入一個(gè)根類(lèi)而把問(wèn)題域類(lèi)組合在一起。同時(shí),根類(lèi)還可以用來(lái)建立協(xié)議。 4. 加入一般化類(lèi)以建立類(lèi)間協(xié)議 在設(shè)計(jì)過(guò)程中一些具體類(lèi)需要有一個(gè)公共的協(xié)議,也就是說(shuō),它們都需要定義一組類(lèi)似的服務(wù)

28、。在這種情況下可以引入一個(gè)附加類(lèi)(例如,根類(lèi)),以便建立這個(gè)協(xié)議(即命名公共服務(wù)集合,這些服務(wù)在具體類(lèi)中仔細(xì)定義)。,5. 調(diào)整繼承層次 如果面向?qū)ο蠓治瞿P椭邪硕嘀乩^承關(guān)系,然而所使用的程序設(shè)計(jì)語(yǔ)言卻并不提供多重繼承機(jī)制,則必須修改面向?qū)ο蠓治龅慕Y(jié)果。即使使用支持多重繼承的語(yǔ)言,有時(shí)也會(huì)出于實(shí)現(xiàn)考慮而對(duì)面向?qū)ο蠓治鼋Y(jié)果作一些調(diào)整。下面分幾種情況討論: (1) 使用多重繼承機(jī)制 使用多重繼承機(jī)制時(shí),應(yīng)該避免出現(xiàn)屬性及服務(wù)的命名沖突。下面通過(guò)例子說(shuō)明避免命名沖突的方法。,下圖是一種多重繼承模式的例子,這種模式可以稱(chēng)為窄菱形模式。使用這種模式時(shí)出現(xiàn)屬性及服務(wù)命名沖突的可能性比較大。,圖11.4

29、 窄菱形模式,圖11.5(見(jiàn)書(shū)262頁(yè))是另一種多重繼承模式,稱(chēng)為闊菱形模式。使用這種模式時(shí),屬性及服務(wù)的名字發(fā)生沖突的可能性比較小,但是,它需要用更多的類(lèi)才能表示同一個(gè)設(shè)計(jì)。,(2) 使用單繼承機(jī)制 如果使用僅提供單繼承機(jī)制的語(yǔ)言實(shí)現(xiàn)系統(tǒng),則必須把面向?qū)ο蠓治瞿P椭械亩嘀乩^承結(jié)構(gòu)轉(zhuǎn)換成單繼承結(jié)構(gòu)。 常見(jiàn)的做法是,把多重繼承結(jié)構(gòu)簡(jiǎn)化成單一的單繼承層次結(jié)構(gòu),如圖11.6所示。,圖11.6 把多重繼承簡(jiǎn)化為單一層次的單繼承,6. ATM系統(tǒng)實(shí)例 下圖描繪了上章給出的ATM系統(tǒng)的問(wèn)題域子系統(tǒng)的結(jié)構(gòu)。,11.6 設(shè)計(jì)人機(jī)交互子系統(tǒng),在面向?qū)ο蠓治鲞^(guò)程中,已經(jīng)對(duì)用戶(hù)界面需求做了初步分析,在面向?qū)ο笤O(shè)計(jì)過(guò)

30、程中,則應(yīng)該對(duì)系統(tǒng)的人機(jī)交互子系統(tǒng)進(jìn)行詳細(xì)設(shè)計(jì),以確定人機(jī)交互的細(xì)節(jié),其中包括指定窗口和報(bào)表的形式、設(shè)計(jì)命令層次等項(xiàng)內(nèi)容。,1. 分類(lèi)用戶(hù) 人機(jī)交互界面是給用戶(hù)使用的,為設(shè)計(jì)好人機(jī)交互子系統(tǒng),設(shè)計(jì)者應(yīng)該認(rèn)真研究使用它的用戶(hù)。 了解用戶(hù)的需要與愛(ài)好,以便設(shè)計(jì)出符合用戶(hù)需要的界面,設(shè)計(jì)者首先應(yīng)該把將來(lái)可能與系統(tǒng)交互的用戶(hù)分類(lèi)。通常從下列幾個(gè)不同角度進(jìn)行分類(lèi): 按技能水平分類(lèi)(新手、初級(jí)、中級(jí)、高級(jí))。 按職務(wù)分類(lèi)(總經(jīng)理、經(jīng)理、職員)。 按所屬集團(tuán)分類(lèi)(職員、顧客)。,2. 描述用戶(hù) 應(yīng)該仔細(xì)了解將來(lái)使用系統(tǒng)的每類(lèi)用戶(hù)的情況,把獲得的下列各項(xiàng)信息記錄下來(lái): 用戶(hù)類(lèi)型。 使用系統(tǒng)欲達(dá)到的目的。 特征

31、(年齡、性別、受教育程度、限制因素等)。 關(guān)鍵的成功因素(需求、愛(ài)好、習(xí)慣等)。 技能水平。 完成本職工作的腳本。,3. 設(shè)計(jì)命令層次 設(shè)計(jì)命令層次的工作通常包含以下幾項(xiàng)內(nèi)容。 (1) 研究現(xiàn)有的人機(jī)交互含義和準(zhǔn)則 現(xiàn)在,Windows已經(jīng)成了微機(jī)上圖形用戶(hù)界面事實(shí)上的工業(yè)標(biāo)準(zhǔn)。所有Windows應(yīng)用程序的基本外觀及給用戶(hù)的感受都是相同的。Windows程序通常還遵守廣大用戶(hù)習(xí)以為常的許多約定。 設(shè)計(jì)圖形用戶(hù)界面時(shí),應(yīng)該保持與普通Windows應(yīng)用程序界面相一致,并遵守廣大用戶(hù)習(xí)慣的約定,這樣才會(huì)被用戶(hù)接受和喜愛(ài)。,(2) 確定初始的命令層次 所謂命令層次,實(shí)質(zhì)上是用過(guò)程抽象機(jī)制組織起來(lái)的、可

32、供選用的服務(wù)的表示形式。設(shè)計(jì)命令層次時(shí),通常先從對(duì)服務(wù)的過(guò)程抽象著手,然后再進(jìn)一步修改它們,以適合具體應(yīng)用環(huán)境的需要。 (3) 精化命令層次 為進(jìn)一步修改完善初始的命令層次,應(yīng)該考慮下列一些因素:,次序:仔細(xì)選擇每個(gè)服務(wù)的名字,并在命令層的每一部分內(nèi)把服務(wù)排好次序。排序時(shí)或者把最常用的服務(wù)放在最前面,或者按照用戶(hù)習(xí)慣的工作步驟排序。 整體-部分關(guān)系:尋找在這些服務(wù)中存在的整體-部分模式,這樣做有助于在命令層中分組組織服務(wù)。 寬度和深度:由于人的短期記憶能力有限,命令層次的寬度和深度都不應(yīng)該過(guò)大。 操作步驟:應(yīng)該用盡量少的單擊、拖動(dòng)和擊鍵組合來(lái)表達(dá)命令,而且應(yīng)該為高級(jí)用戶(hù)提供簡(jiǎn)捷的操作方法。,4

33、. 設(shè)計(jì)人機(jī)交互類(lèi) 人機(jī)交互類(lèi)與所使用的操作系統(tǒng)及編程語(yǔ)言密切相關(guān)。例如,在Windows環(huán)境下運(yùn)行的Visual C+語(yǔ)言提供了MFC類(lèi)庫(kù),設(shè)計(jì)人機(jī)交互類(lèi)時(shí),往往僅需從MFC類(lèi)庫(kù)中選出一些適用的類(lèi),然后從這些類(lèi)派生出符合自己需要的類(lèi)就可以了。,11.7 設(shè)計(jì)任務(wù)管理子系統(tǒng),從概念上說(shuō),不同對(duì)象可以并發(fā)地工作,但是,在實(shí)際系統(tǒng)中,許多對(duì)象之間往往存在相互依賴(lài)關(guān)系。此外,在實(shí)際使用的硬件中,可能僅由一個(gè)處理器支持多個(gè)對(duì)象。因此,設(shè)計(jì)工作的一項(xiàng)重要內(nèi)容就是,確定哪些是必須同時(shí)動(dòng)作的對(duì)象,哪些是相互排斥的對(duì)象。然后進(jìn)一步設(shè)計(jì)任務(wù)管理子系統(tǒng)。,1. 分析并發(fā)性 通過(guò)面向?qū)ο蠓治鼋⑵饋?lái)的動(dòng)態(tài)模型,是分

34、析并發(fā)性的主要依據(jù)。 如果兩個(gè)對(duì)象彼此間不存在交互,或者它們同時(shí)接受事件,則這兩個(gè)對(duì)象在本質(zhì)上是并發(fā)的。 通過(guò)檢查各個(gè)對(duì)象的狀態(tài)圖及它們之間交換的事件,能夠把若干個(gè)非并發(fā)的對(duì)象歸并到一條控制線中。,2. 設(shè)計(jì)任務(wù)管理子系統(tǒng) 常見(jiàn)的任務(wù)有事件驅(qū)動(dòng)型任務(wù)、時(shí)鐘驅(qū)動(dòng)型任務(wù)、優(yōu)先任務(wù)、關(guān)鍵任務(wù)和協(xié)調(diào)任務(wù)等。設(shè)計(jì)任務(wù)管理子系統(tǒng),包括確定各類(lèi)任務(wù)并把任務(wù)分配給適當(dāng)?shù)挠布蜍浖?zhí)行。 (1) 確定事件驅(qū)動(dòng)型任務(wù) 某些任務(wù)是由事件驅(qū)動(dòng)的,這類(lèi)任務(wù)可能主要完成通信工作。例如,與設(shè)備、屏幕窗口、其他任務(wù)、子系統(tǒng)、另一個(gè)處理器或其他系統(tǒng)通信。事件通常是表明某些數(shù)據(jù)到達(dá)的信號(hào)。,在系統(tǒng)運(yùn)行時(shí),這類(lèi)任務(wù)的工作過(guò)程如下

35、:任務(wù)處于睡眠狀態(tài)(不消耗處理器時(shí)間),等待來(lái)自數(shù)據(jù)線或其他數(shù)據(jù)源的中斷;一旦接收到中斷就喚醒了該任務(wù),接收數(shù)據(jù)并把數(shù)據(jù)放入內(nèi)存緩沖區(qū)或其他目的地,通知需要知道這件事的對(duì)象,然后該任務(wù)又回到睡眠狀態(tài)。,(2) 確定時(shí)鐘驅(qū)動(dòng)型任務(wù) 某些任務(wù)每隔一定時(shí)間間隔就被觸發(fā)以執(zhí)行某些處理,例如,某些設(shè)備需要周期性地獲得數(shù)據(jù);某些人機(jī)接口、子系統(tǒng)、任務(wù)、處理器或其他系統(tǒng)也可能需要周期性地通信。在這些場(chǎng)合往往需要使用時(shí)鐘驅(qū)動(dòng)型任務(wù)。 時(shí)鐘驅(qū)動(dòng)型任務(wù)的工作過(guò)程如下:任務(wù)設(shè)置了喚醒時(shí)間后進(jìn)入睡眠狀態(tài);任務(wù)睡眠(不消耗處理器時(shí)間),等待來(lái)自系統(tǒng)的中斷;一旦接收到這種中斷,任務(wù)就被喚醒并做它的工作,通知有關(guān)的對(duì)象,然

36、后該任務(wù)又回到睡眠狀態(tài)。,(3) 確定優(yōu)先任務(wù) 優(yōu)先任務(wù)可以滿(mǎn)足高優(yōu)先級(jí)或低優(yōu)先級(jí)的處理需求: 高優(yōu)先級(jí):某些服務(wù)具有很高的優(yōu)先級(jí),為了在嚴(yán)格限定的時(shí)間內(nèi)完成這種服務(wù),可能需要把這類(lèi)服務(wù)分離成獨(dú)立的任務(wù)。 低優(yōu)先級(jí):與高優(yōu)先級(jí)相反,有些服務(wù)是低優(yōu)先級(jí)的,屬于低優(yōu)先級(jí)處理(通常指那些背景處理)。設(shè)計(jì)時(shí)可能用額外的任務(wù)把這樣的處理分離出來(lái)。,(4) 確定關(guān)鍵任務(wù) 關(guān)鍵任務(wù)是有關(guān)系統(tǒng)成功或失敗的關(guān)鍵處理,這類(lèi)處理通常都有嚴(yán)格的可靠性要求。在設(shè)計(jì)過(guò)程中可能用額外的任務(wù)把這樣的關(guān)鍵處理分離出來(lái),以滿(mǎn)足高可靠性處理的要求。對(duì)高可靠性處理應(yīng)該精心設(shè)計(jì)和編碼,并且應(yīng)該嚴(yán)格測(cè)試。 (5) 確定協(xié)調(diào)任務(wù) 當(dāng)系統(tǒng)中

37、存在3個(gè)以上任務(wù)時(shí),就應(yīng)該增加一個(gè)任務(wù),用它作為協(xié)調(diào)任務(wù)。,引入?yún)f(xié)調(diào)任務(wù)會(huì)增加系統(tǒng)的總開(kāi)銷(xiāo)(增加從一個(gè)任務(wù)到另一個(gè)任務(wù)的轉(zhuǎn)換時(shí)間),但是引入?yún)f(xié)調(diào)任務(wù)有助于把不同任務(wù)之間的協(xié)調(diào)控制封裝起來(lái)。 (6) 盡量減少任務(wù)數(shù) 必須仔細(xì)分析和選擇每個(gè)確實(shí)需要的任務(wù)。應(yīng)該使系統(tǒng)中包含的任務(wù)數(shù)盡量少。 設(shè)計(jì)多任務(wù)系統(tǒng)的主要問(wèn)題是,設(shè)計(jì)者常常為了自己處理時(shí)的方便而輕率地定義過(guò)多的任務(wù)。這樣做加大了設(shè)計(jì)工作的技術(shù)復(fù)雜度,并使系統(tǒng)變得不易理解,從而也加大了系統(tǒng)維護(hù)的難度。,(7) 確定資源需求 使用多處理器或固件,主要是為了滿(mǎn)足高性能的需求。設(shè)計(jì)者必須通過(guò)計(jì)算系統(tǒng)載荷(即每秒處理的業(yè)務(wù)數(shù)及處理一個(gè)業(yè)務(wù)所花費(fèi)的時(shí)間),

38、來(lái)估算所需要的CPU(或其他固件)的處理能力。 設(shè)計(jì)者應(yīng)該綜合考慮各種因素,以決定哪些子系統(tǒng)用硬件實(shí)現(xiàn),哪些子系統(tǒng)用軟件實(shí)現(xiàn)。下述兩個(gè)因素可能是使用硬件實(shí)現(xiàn)某些子系統(tǒng)的主要原因:,11.8 設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng),數(shù)據(jù)管理子系統(tǒng)是系統(tǒng)存儲(chǔ)或檢索對(duì)象的基本設(shè)施,它建立在某種數(shù)據(jù)存儲(chǔ)管理系統(tǒng)之上,并且隔離了數(shù)據(jù)存儲(chǔ)管理模式(文件、關(guān)系數(shù)據(jù)庫(kù)或面向?qū)ο髷?shù)據(jù)庫(kù))的影響。,11.8.1 選擇數(shù)據(jù)存儲(chǔ)管理模式,不同的數(shù)據(jù)存儲(chǔ)管理模式有不同的特點(diǎn),適用范圍也不相同,設(shè)計(jì)者應(yīng)該根據(jù)應(yīng)用系統(tǒng)的特點(diǎn)選擇適用的模式。 1. 文件管理系統(tǒng) 文件管理系統(tǒng)是操作系統(tǒng)的一個(gè)組成部分,使用它長(zhǎng)期保存數(shù)據(jù)具有成本低和簡(jiǎn)單等特點(diǎn),但

39、是,文件操作的級(jí)別低,為提供適當(dāng)?shù)某橄蠹?jí)別還必須編寫(xiě)額外的代碼。此外,不同操作系統(tǒng)的文件管理系統(tǒng)往往有明顯差異。,2. 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng) 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的理論基礎(chǔ)是關(guān)系代數(shù),它有下列一些主要優(yōu)點(diǎn): (1) 提供了各種最基本的數(shù)據(jù)管理功能(例如,中斷恢復(fù),多用戶(hù)共享,多應(yīng)用共享,完整性,事務(wù)支持等)。 (2) 為多種應(yīng)用提供了一致的接口。 (3) 標(biāo)準(zhǔn)化的語(yǔ)言(大多數(shù)商品化關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都使用SQL語(yǔ)言)。 但是,為了做到通用與一致,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)通常都相當(dāng)復(fù)雜,有下述一些缺點(diǎn):,(1) 運(yùn)行開(kāi)銷(xiāo)大:即使只完成簡(jiǎn)單的事務(wù)(例如,只修改表中的一行),也需要較長(zhǎng)的時(shí)間。 (2) 不能滿(mǎn)

40、足高級(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)單。事實(shí)上,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)很難用在數(shù)據(jù)類(lèi)型豐富或操作不標(biāo)準(zhǔn)的應(yīng)用中。 (3) 與程序設(shè)計(jì)語(yǔ)言的連接不自然:SQL語(yǔ)言支持面向集合的操作,是一種非過(guò)程性語(yǔ)言;然而大多數(shù)程序設(shè)計(jì)語(yǔ)言本質(zhì)上卻是過(guò)程性的,每次只能處理一個(gè)記錄。,3. 面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng) 面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)是一種新技術(shù),主要有兩種設(shè)計(jì)途徑:擴(kuò)展的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)和擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言。 (1) 擴(kuò)展的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)是在關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)上,增加了抽象數(shù)據(jù)類(lèi)型和繼承機(jī)制,此外還增加了創(chuàng)建及管理類(lèi)和對(duì)象的通用服務(wù)。 (2)

41、擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言擴(kuò)充了面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的語(yǔ)法和功能,增加了在數(shù)據(jù)庫(kù)中存儲(chǔ)和管理對(duì)象的機(jī)制。,11.8.2 設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng),設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng),既需要設(shè)計(jì)數(shù)據(jù)格式又需要設(shè)計(jì)相應(yīng)的服務(wù)。 1. 設(shè)計(jì)數(shù)據(jù)格式 設(shè)計(jì)數(shù)據(jù)格式的方法與所使用的數(shù)據(jù)存儲(chǔ)管理模式密切相關(guān),下面分別介紹適用于每種數(shù)據(jù)存儲(chǔ)管理模式的設(shè)計(jì)方法: (1) 文件系統(tǒng) 定義第一范式表:列出每個(gè)類(lèi)的屬性表;把屬性表規(guī)范成第一范式,從而得到第一范式表的定義。,為每個(gè)第一范式表定義一個(gè)文件。 測(cè)量性能和需要的存儲(chǔ)容量。 修改原設(shè)計(jì)的第一范式,以滿(mǎn)足性能和存儲(chǔ)需求。 必要時(shí)把泛化結(jié)構(gòu)的屬性壓縮在單個(gè)文件中,以減少文件數(shù)量。 必

42、要時(shí)把某些屬性組合在一起,并用某種編碼值表示這些屬性,而不再分別使用獨(dú)立的域表示每個(gè)屬性。這樣做可以減少所需要的存儲(chǔ)空間,但是增加了處理時(shí)間。,(2) 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng) 定義第三范式表:列出每個(gè)類(lèi)的屬性表;把屬性表規(guī)范成第三范式,從而得出第三范式表的定義。 為每個(gè)第三范式表定義一個(gè)數(shù)據(jù)庫(kù)表。 測(cè)量性能和需要的存儲(chǔ)容量。 修改先前設(shè)計(jì)的第三范式,以滿(mǎn)足性能和存儲(chǔ)需求。,(3) 面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng) 擴(kuò)展的關(guān)系數(shù)據(jù)庫(kù)途徑:使用與關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)相同的方法。 擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言途徑:不需要規(guī)范化屬性的步驟,因?yàn)閿?shù)據(jù)庫(kù)管理系統(tǒng)本身具有把對(duì)象值映射成存儲(chǔ)值的功能。,2. 設(shè)計(jì)相應(yīng)的服務(wù) 如

43、果某個(gè)類(lèi)的對(duì)象需要存儲(chǔ)起來(lái),則在這個(gè)類(lèi)中增加一個(gè)屬性和服務(wù),用于完成存儲(chǔ)對(duì)象自身的工作。應(yīng)該把為此目的增加的屬性和服務(wù)作為“隱含”的屬性和服務(wù),即無(wú)須在面向?qū)ο笤O(shè)計(jì)模型的屬性和服務(wù)層中顯式地表示它們,僅需在關(guān)于類(lèi)與對(duì)象的文檔中描述它們。 下面介紹使用不同數(shù)據(jù)存儲(chǔ)管理模式時(shí)的設(shè)計(jì)要點(diǎn)。,(1) 文件系統(tǒng) 被存儲(chǔ)的對(duì)象需要知道打開(kāi)哪個(gè)(些)文件,怎樣把文件定位到正確的記錄上,怎樣檢索出舊值(如果有的話),以及怎樣用現(xiàn)有值更新它們。 此外,還應(yīng)該定義一個(gè)ObjectServer(對(duì)象服務(wù)器)類(lèi),并創(chuàng)建它的實(shí)例。該類(lèi)提供下列服務(wù): 通知對(duì)象保存自身; 檢索已存儲(chǔ)的對(duì)象(查找,讀值,創(chuàng)建并初始化對(duì)象),

44、把這些對(duì)象提供給其他子系統(tǒng)使用。,(2) 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng) 被存儲(chǔ)的對(duì)象,應(yīng)該知道訪問(wèn)哪些數(shù)據(jù)庫(kù)表,怎樣訪問(wèn)所需要的行,怎樣檢索出舊值(如果有的話),以及怎樣用現(xiàn)有值更新它們。 此外,還應(yīng)該定義一個(gè)ObjectServer類(lèi),并聲明它的對(duì)象。該類(lèi)提供下列服務(wù): 通知對(duì)象保存自身; 檢索已存儲(chǔ)的對(duì)象(查找,讀值,創(chuàng)建并初始化對(duì)象),以便由其他子系統(tǒng)使用這些對(duì)象。,(3) 面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng) 擴(kuò)展的關(guān)系數(shù)據(jù)庫(kù)途徑:與使用關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)時(shí)方法相同。 擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言途徑:無(wú)須增加服務(wù),這種數(shù)據(jù)庫(kù)管理系統(tǒng)已經(jīng)給每個(gè)對(duì)象提供了“存儲(chǔ)自己”的行為。只需給需要長(zhǎng)期保存的對(duì)象加個(gè)標(biāo)記,然后

45、由面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)負(fù)責(zé)存儲(chǔ)和恢復(fù)這類(lèi)對(duì)象。,11.8.3 例子,為具體說(shuō)明數(shù)據(jù)管理子系統(tǒng)的設(shè)計(jì)方法,讓我們?cè)倏纯磮D11.7所示的ATM系統(tǒng)。 從圖中可以看出,惟一的永久性數(shù)據(jù)存儲(chǔ)放在分行計(jì)算機(jī)中。因?yàn)楸仨毐3謹(jǐn)?shù)據(jù)的一致性和完整性,而且常常有多個(gè)并發(fā)事務(wù)同時(shí)訪問(wèn)這些數(shù)據(jù),因此,采用成熟的商品化關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)存儲(chǔ)數(shù)據(jù)。應(yīng)該把每個(gè)事務(wù)作為一個(gè)不可分割的批操作來(lái)處理,由事務(wù)封鎖賬戶(hù)直到該事務(wù)結(jié)束為止。,在這個(gè)例子中,需要存儲(chǔ)的對(duì)象主要是賬戶(hù)類(lèi)的對(duì)象。為了支持?jǐn)?shù)據(jù)管理子系統(tǒng)的實(shí)現(xiàn),賬戶(hù)類(lèi)對(duì)象必須知道自己是怎樣存儲(chǔ)的,有兩種方法可以達(dá)到這個(gè)目的。 (1) 每個(gè)對(duì)象自己保存自己 賬戶(hù)類(lèi)對(duì)象在接到“

46、存儲(chǔ)自己”的通知后,知道怎樣把自身存儲(chǔ)起來(lái)(需要增加一個(gè)屬性和一個(gè)服務(wù)來(lái)定義上述行為)。 (2) 由數(shù)據(jù)管理子系統(tǒng)負(fù)責(zé)存儲(chǔ)對(duì)象,賬戶(hù)類(lèi)對(duì)象在接到“存儲(chǔ)自己”的通知后,知道應(yīng)該向數(shù)據(jù)管理子系統(tǒng)發(fā)送什么消息,以便由數(shù)據(jù)管理子系統(tǒng)把它的狀態(tài)保存起來(lái),為此也需要增加屬性和服務(wù)來(lái)定義上述行為。使用這種方法的優(yōu)點(diǎn),是無(wú)須修改問(wèn)題域子系統(tǒng)。 如上一小節(jié)所述,應(yīng)該定義一個(gè)數(shù)據(jù)管理類(lèi)ObjectServer,并聲明它的對(duì)象。這個(gè)類(lèi)提供下列服務(wù): 通知對(duì)象保存自身或保存需長(zhǎng)期存儲(chǔ)的對(duì)象的狀態(tài); 檢索已存儲(chǔ)的對(duì)象并使之“復(fù)活”。,11.9 設(shè)計(jì)類(lèi)中的服務(wù) 11.9.1 設(shè)計(jì)類(lèi)中應(yīng)有的服務(wù),需要綜合考慮對(duì)象模型、動(dòng)態(tài)

47、模型和功能模型,才能正確確定類(lèi)中應(yīng)有的服務(wù)。對(duì)象模型是進(jìn)行對(duì)象設(shè)計(jì)的基本框架。但是,面向?qū)ο蠓治龅贸龅膶?duì)象模型,通常只在每個(gè)類(lèi)中列出很少幾個(gè)最核心的服務(wù)。設(shè)計(jì)者必須把動(dòng)態(tài)模型中對(duì)象的行為以及功能模型中的數(shù)據(jù)處理,轉(zhuǎn)換成由適當(dāng)?shù)念?lèi)所提供的服務(wù)。,一張狀態(tài)圖描繪了一類(lèi)對(duì)象的生命周期,圖中的狀態(tài)轉(zhuǎn)換是執(zhí)行對(duì)象服務(wù)的結(jié)果。對(duì)象的許多服務(wù)都與對(duì)象接收到的事件密切相關(guān),事實(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ì)象在不同狀

48、態(tài)可以接受同樣事件,而且在不同狀態(tài)接收到同樣事件時(shí)其行為不同,則實(shí)現(xiàn)服務(wù)的算法中需要有一個(gè)依賴(lài)于狀態(tài)的DO-CASE型控制結(jié)構(gòu)。,功能模型指明了系統(tǒng)必須提供的服務(wù)。狀態(tài)圖中狀態(tài)轉(zhuǎn)換所觸發(fā)的動(dòng)作,在功能模型中有時(shí)可能擴(kuò)展成一張數(shù)據(jù)流圖。數(shù)據(jù)流圖中的某些處理可能與對(duì)象提供的服務(wù)相對(duì)應(yīng),下列規(guī)則有助于確定操作的目標(biāo)對(duì)象(即應(yīng)該在該對(duì)象所屬的類(lèi)中定義這個(gè)服務(wù)): (1) 如果某個(gè)處理的功能是從輸入流中抽取一個(gè)值,則該輸入流就是目標(biāo)對(duì)象。 (2) 如果某個(gè)處理具有類(lèi)型相同的輸入流和輸出流,而且輸出流實(shí)質(zhì)上是輸入流的另一種形式,則該輸入輸出流就是目標(biāo)對(duì)象。,(3) 如果某個(gè)處理從多個(gè)輸入流得出輸出值,則該

49、處理是輸出類(lèi)中定義的一個(gè)服務(wù)。 (4) 如果某個(gè)處理把對(duì)輸入流處理的結(jié)果輸出給數(shù)據(jù)存儲(chǔ)或動(dòng)作對(duì)象,則該數(shù)據(jù)存儲(chǔ)或動(dòng)作對(duì)象就是目標(biāo)對(duì)象。 當(dāng)一個(gè)處理涉及多個(gè)對(duì)象時(shí),為確定把它作為哪個(gè)對(duì)象的服務(wù),設(shè)計(jì)者必須判斷哪個(gè)對(duì)象在這個(gè)處理中起主要作用。通常在起主要作用的對(duì)象類(lèi)中定義這個(gè)服務(wù)。下面兩條規(guī)則有助于確定處理的歸屬:,如果處理影響或修改了一個(gè)對(duì)象,則最好把該處理與處理的目標(biāo)(而不是觸發(fā)者)聯(lián)系在一起。 考察處理涉及的對(duì)象類(lèi)及這些類(lèi)之間的關(guān)聯(lián),從中找出處于中心地位的類(lèi)。如果其他類(lèi)和關(guān)聯(lián)圍繞這個(gè)中心類(lèi)構(gòu)成星形,則這個(gè)中心類(lèi)就是處理的目標(biāo)。,11.9.2 設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法,在面向?qū)ο笤O(shè)計(jì)過(guò)程中還應(yīng)該進(jìn)一

50、步設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法,主要應(yīng)該完成以下幾項(xiàng)工作。 1. 設(shè)計(jì)實(shí)現(xiàn)服務(wù)的算法 設(shè)計(jì)實(shí)現(xiàn)服務(wù)的算法時(shí),應(yīng)該考慮下列幾個(gè)因素: (1) 算法復(fù)雜度。通常選用復(fù)雜度較低(即效率較高)的算法,但也不要過(guò)分追求高效率,應(yīng)以能滿(mǎn)足用戶(hù)需求為準(zhǔn)。,(2) 容易理解與容易實(shí)現(xiàn)。容易理解與容易實(shí)現(xiàn)的要求往往與高效率有矛盾,設(shè)計(jì)者應(yīng)該對(duì)這兩個(gè)因素適當(dāng)折衷。 (3) 易修改。應(yīng)該盡可能預(yù)測(cè)將來(lái)可能做的修改,并在設(shè)計(jì)時(shí)預(yù)先做些準(zhǔn)備。 2. 選擇數(shù)據(jù)結(jié)構(gòu) 在分析階段,僅需考慮系統(tǒng)中需要的信息的邏輯結(jié)構(gòu),在面向?qū)ο笤O(shè)計(jì)過(guò)程中,則需要選擇能夠方便、有效地實(shí)現(xiàn)算法的物理數(shù)據(jù)結(jié)構(gòu)。,3. 定義內(nèi)部類(lèi)和內(nèi)部操作 在面向?qū)ο笤O(shè)計(jì)過(guò)程

51、中,可能需要增添一些在需求陳述中沒(méi)有提到的類(lèi),這些新增加的類(lèi),主要用來(lái)存放在執(zhí)行算法過(guò)程中所得出的某些中間結(jié)果。 此外,復(fù)雜操作往往可以用簡(jiǎn)單對(duì)象上的更低層操作來(lái)定義。因此,在分解高層操作時(shí)常常引入新的低層操作。在面向?qū)ο笤O(shè)計(jì)過(guò)程中應(yīng)該定義這些新增加的低層操作。,11.10 設(shè)計(jì)關(guān)聯(lián),在對(duì)象模型中,關(guān)聯(lián)是聯(lián)結(jié)不同對(duì)象的紐帶,它指定了對(duì)象相互間的訪問(wèn)路徑。在面向?qū)ο笤O(shè)計(jì)過(guò)程中,設(shè)計(jì)人員必須確定實(shí)現(xiàn)關(guān)聯(lián)的具體策略。既可以選定一個(gè)全局性的策略統(tǒng)一實(shí)現(xiàn)所有關(guān)聯(lián),也可以分別為每個(gè)關(guān)聯(lián)選擇具體的實(shí)現(xiàn)策略,以與它在應(yīng)用系統(tǒng)中的使用方式相適應(yīng)。 為了更好地設(shè)計(jì)實(shí)現(xiàn)關(guān)聯(lián)的途徑,首先應(yīng)該分析使用關(guān)聯(lián)的方式。,1.

52、 關(guān)聯(lián)的遍歷 在應(yīng)用系統(tǒng)中,使用關(guān)聯(lián)有兩種可能的方式:?jiǎn)蜗虮闅v和雙向遍歷。在應(yīng)用系統(tǒng)中,某些關(guān)聯(lián)只需要單向遍歷,這種單向關(guān)聯(lián)實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,另外一些關(guān)聯(lián)可能需要雙向遍歷,雙向關(guān)聯(lián)實(shí)現(xiàn)起來(lái)稍微麻煩一些。 在使用原型法開(kāi)發(fā)軟件的時(shí)候,原型中所有關(guān)聯(lián)都應(yīng)該是雙向的,以便于增加新的行為,快速地?cái)U(kuò)充和修改原型。,2. 實(shí)現(xiàn)單向關(guān)聯(lián) 用指針可以方便地實(shí)現(xiàn)單向關(guān)聯(lián)。如果關(guān)聯(lián)的重?cái)?shù)是一元的(如圖11.8所示),則實(shí)現(xiàn)關(guān)聯(lián)的指針是一個(gè)簡(jiǎn)單指針;如果重?cái)?shù)是多元的,則需要用一個(gè)指針集合實(shí)現(xiàn)關(guān)聯(lián)(參見(jiàn)圖11.9)。,圖11.8 用指針實(shí)現(xiàn)單向關(guān)聯(lián),圖11.9 用指針實(shí)現(xiàn)雙向關(guān)聯(lián),3. 實(shí)現(xiàn)雙向關(guān)聯(lián) 許多關(guān)聯(lián)都需要雙

53、向遍歷,當(dāng)然,兩個(gè)方向遍歷的頻度往往并不相同。實(shí)現(xiàn)雙向關(guān)聯(lián)有下列3種方法: (1) 只用屬性實(shí)現(xiàn)一個(gè)方向的關(guān)聯(lián),當(dāng)需要反向遍歷時(shí)就執(zhí)行一次正向查找。如果兩個(gè)方向遍歷的頻度相差很大,而且需要盡量減少存儲(chǔ)開(kāi)銷(xiāo)和修改時(shí)的開(kāi)銷(xiāo),則這是一種很有效的實(shí)現(xiàn)雙向關(guān)聯(lián)的方法。,圖11.10 用對(duì)象實(shí)現(xiàn)關(guān)聯(lián),(2) 兩個(gè)方向的關(guān)聯(lián)都用屬性實(shí)現(xiàn)。具體實(shí)現(xiàn)方法已在前面講過(guò),如圖11.9所示。這種方法能實(shí)現(xiàn)快速訪問(wèn),但是,如果修改了一個(gè)屬性,則相關(guān)的屬性也必須隨之修改,才能保持該關(guān)聯(lián)鏈的一致性。當(dāng)訪問(wèn)次數(shù)遠(yuǎn)遠(yuǎn)多于修改次數(shù)時(shí),這種實(shí)現(xiàn)方法很有效。 (3) 用獨(dú)立的關(guān)聯(lián)對(duì)象實(shí)現(xiàn)雙向關(guān)聯(lián)。關(guān)聯(lián)對(duì)象不屬于相互關(guān)聯(lián)的任何一個(gè)類(lèi),

54、它是獨(dú)立的關(guān)聯(lián)類(lèi)的實(shí)例,如圖11.10所示。 4. 關(guān)聯(lián)對(duì)象的實(shí)現(xiàn),可以引入一個(gè)關(guān)聯(lián)類(lèi)來(lái)保存描述關(guān)聯(lián)性質(zhì)的信息,關(guān)聯(lián)中的每個(gè)連接對(duì)應(yīng)著關(guān)聯(lián)類(lèi)的一個(gè)對(duì)象。實(shí)現(xiàn)關(guān)聯(lián)對(duì)象的方法取決于關(guān)聯(lián)的重?cái)?shù)。對(duì)于一對(duì)一關(guān)聯(lián)來(lái)說(shuō),關(guān)聯(lián)對(duì)象可以與參與關(guān)聯(lián)的任一個(gè)對(duì)象合并。對(duì)于一對(duì)多關(guān)聯(lián)來(lái)說(shuō),關(guān)聯(lián)對(duì)象可以與“多”端對(duì)象合并。如果是多對(duì)多關(guān)聯(lián),則關(guān)聯(lián)鏈的性質(zhì)不可能只與一個(gè)參與關(guān)聯(lián)的對(duì)象有關(guān),通常用一個(gè)獨(dú)立的關(guān)聯(lián)類(lèi)來(lái)保存描述關(guān)聯(lián)性質(zhì)的信息,這個(gè)類(lèi)的每個(gè)實(shí)例表示一條具體的關(guān)聯(lián)鏈及該鏈的屬性。,11.11 設(shè)計(jì)優(yōu)化 11.11.1 確定優(yōu)先級(jí),系統(tǒng)的各項(xiàng)質(zhì)量指標(biāo)并不是同等重要的,設(shè)計(jì)人員必須確定各項(xiàng)質(zhì)量指標(biāo)的相對(duì)重要性(即確定

55、優(yōu)先級(jí)),以便在優(yōu)化設(shè)計(jì)時(shí)制定折衷方案。,系統(tǒng)的整體質(zhì)量與設(shè)計(jì)人員所制定的折衷方案密切相關(guān)。最終產(chǎn)品成功與否,在很大程度上取決于是否選擇好了系統(tǒng)目標(biāo)。 在折衷方案中設(shè)置的優(yōu)先級(jí)應(yīng)該是模糊的。事實(shí)上,不可能指定精確的優(yōu)先級(jí)數(shù)值(例如,速度48%,內(nèi)存25%,費(fèi)用8%,可修改性19%)。 最常見(jiàn)的情況,是在效率和清晰性之間尋求適當(dāng)?shù)恼壑苑桨?。下面兩小?jié)分別講述在優(yōu)化設(shè)計(jì)時(shí)提高效率的技術(shù),以及建立良好的繼承結(jié)構(gòu)的方法。,11.11.2 提高效率的幾項(xiàng)技術(shù),1. 增加冗余關(guān)聯(lián)以提高訪問(wèn)效率 在面向?qū)ο蠓治鲞^(guò)程中,應(yīng)該避免在對(duì)象模型中存在冗余的關(guān)聯(lián),因?yàn)槿哂嚓P(guān)聯(lián)不僅沒(méi)有增添任何信息,反而會(huì)降低模型的清晰

56、程度。但是,在面向?qū)ο笤O(shè)計(jì)過(guò)程中,應(yīng)當(dāng)考慮用戶(hù)的訪問(wèn)模式,及不同類(lèi)型的訪問(wèn)彼此間的依賴(lài)關(guān)系時(shí),就會(huì)發(fā)現(xiàn),分析階段確定的關(guān)聯(lián)可能并沒(méi)有構(gòu)成效率最高的訪問(wèn)路徑。下面用設(shè)計(jì)公司雇員技能數(shù)據(jù)庫(kù)的例子,說(shuō)明分析訪問(wèn)路徑及提高訪問(wèn)效率的方法。,假設(shè)某公司共有2000名雇員,平均每名雇員會(huì)10種技能,則簡(jiǎn)單的嵌套查詢(xún)將遍歷雇員對(duì)象2000次,針對(duì)每名雇員平均再遍歷技能對(duì)象10次。如果全公司僅有5名雇員精通日語(yǔ),則查詢(xún)命中率僅有1/4000。,圖11.11是從面向?qū)ο蠓治瞿P椭姓〉囊徊糠?。公司?lèi)中的服務(wù)find_skill返回具有指定技能的雇員集合。例如,用戶(hù)可能詢(xún)問(wèn)公司中會(huì)講日語(yǔ)的雇員有哪些人。,公司、雇

57、員及技能之間的關(guān)聯(lián)鏈,提高訪問(wèn)效率的一種方法是使用哈希(Hash)表:“具有技能”這個(gè)關(guān)聯(lián)不再利用無(wú)序表實(shí)現(xiàn),而是改用哈希表實(shí)現(xiàn)。只要“會(huì)講日語(yǔ)”是用惟一一個(gè)技能對(duì)象表示,這樣改進(jìn)后就會(huì)使查詢(xún)次數(shù)由20000次減少到2000次。,但是,當(dāng)僅有極少數(shù)對(duì)象滿(mǎn)足查詢(xún)條件時(shí),查詢(xún)命中率仍然很低。在這種情況下,更有效的提高查詢(xún)效率的改進(jìn)方法是,給那些需要經(jīng)常查詢(xún)的對(duì)象建立索引。例如,針對(duì)上述例子,可以增加一個(gè)額外的限定關(guān)聯(lián)“精通語(yǔ)言”,用來(lái)聯(lián)系公司與雇員這兩類(lèi)對(duì)象,如圖11.12所示。利用適當(dāng)?shù)娜哂嚓P(guān)聯(lián),可以立即查到精通某種具體語(yǔ)言的雇員,而無(wú)須多余的訪問(wèn)。當(dāng)然,索引也必然帶來(lái)開(kāi)銷(xiāo):占用內(nèi)存空間,而且每當(dāng)修改基關(guān)聯(lián)時(shí)也必須相應(yīng)地修改索引。因此,應(yīng)該只給那些經(jīng)常執(zhí)行并且開(kāi)銷(xiāo)大、命中率低的查詢(xún)建立索引。,雇員技能數(shù)據(jù)庫(kù)建立索引,2. 調(diào)整查詢(xún)次序 改進(jìn)了對(duì)象模型的結(jié)構(gòu),從而

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論