軟件工程電子課件第9章 面向?qū)ο笤O(shè)計(jì)_第1頁(yè)
軟件工程電子課件第9章 面向?qū)ο笤O(shè)計(jì)_第2頁(yè)
軟件工程電子課件第9章 面向?qū)ο笤O(shè)計(jì)_第3頁(yè)
軟件工程電子課件第9章 面向?qū)ο笤O(shè)計(jì)_第4頁(yè)
軟件工程電子課件第9章 面向?qū)ο笤O(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩95頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

軟件工程電子課件第9章面向?qū)ο笤O(shè)計(jì)4.對(duì)象的高內(nèi)聚和弱耦合

內(nèi)聚衡量一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度。也可以把內(nèi)聚定義為:設(shè)計(jì)中使用的一個(gè)構(gòu)件內(nèi)的各個(gè)元素,對(duì)完成一個(gè)定義明確的目的所做出的貢獻(xiàn)程度。在設(shè)計(jì)時(shí)應(yīng)該力求做到高內(nèi)聚。在面向?qū)ο笤O(shè)計(jì)中存在下述3種內(nèi)聚。

(1)服務(wù)內(nèi)聚

一個(gè)服務(wù)應(yīng)該完成一個(gè)且僅完成一個(gè)功能。9.1面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則(2)類內(nèi)聚

設(shè)計(jì)類的原則是,一個(gè)類應(yīng)該只有一個(gè)用途,它的屬性和服務(wù)應(yīng)該是高內(nèi)聚的。類的屬性和服務(wù)應(yīng)該全都是完成該類對(duì)象的任務(wù)所必需的,其中不包含無(wú)用的屬性或服務(wù)。(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í)的正確抽取。9.1面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則耦合指一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連的緊密程度。在面向?qū)ο蠓椒ㄖ?,?duì)象是最基本的模塊,因此,耦合主要指不同對(duì)象之間相互關(guān)聯(lián)的緊密程度。弱耦合是優(yōu)秀設(shè)計(jì)的一個(gè)重要標(biāo)準(zhǔn),因?yàn)檫@有助于使得系統(tǒng)中某一部分的變化對(duì)其他部分的影響降到最低程度。一般來(lái)說(shuō),對(duì)象之間的耦合可分為兩大類:(1)交互耦合

如果對(duì)象之間的耦合通過(guò)消息連接來(lái)實(shí)現(xiàn),則這種耦合就是交互耦合。為使交互耦合盡可能松散,應(yīng)該遵守下述準(zhǔn)則。

盡量降低消息連接的復(fù)雜程度。應(yīng)該盡量減少消息中包含的參數(shù)個(gè)數(shù),降低參數(shù)的復(fù)雜程度。

減少對(duì)象發(fā)送(或接收)的消息數(shù)。9.1面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則(2)繼承耦合

與交互耦合相反,繼承耦合應(yīng)該提高繼承耦合程度。繼承是一般化類與特殊類之間耦合的一種形式。從本質(zhì)上看,通過(guò)繼承關(guān)系結(jié)合起來(lái)的基類和派生類,構(gòu)成了系統(tǒng)中粒度更大的模塊,因此,它們彼此之間應(yīng)該結(jié)合得越緊密越好。為獲得緊密的繼承耦合,特殊類應(yīng)該確實(shí)是對(duì)它的一般化類的一種具體化,也就是說(shuō),它們之間在邏輯上應(yīng)該存在“isa”的關(guān)系。9.1面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則5.可擴(kuò)充性第一,繼承關(guān)系有助于復(fù)用已有定義,使開(kāi)發(fā)新定義更加容易。第二,在面向?qū)ο蟮恼Z(yǔ)言中,類型系統(tǒng)的多態(tài)性也支持可擴(kuò)充的設(shè)計(jì)。6.可重用性

軟件重用是提高軟件開(kāi)發(fā)生產(chǎn)率和目標(biāo)系統(tǒng)質(zhì)量的重要途徑,重用基本上從設(shè)計(jì)階段開(kāi)始。重用有兩方面的含義:一是盡量使用已有的類(包括開(kāi)發(fā)環(huán)境提供的類庫(kù),及以往開(kāi)發(fā)類似系統(tǒng)時(shí)創(chuàng)建的類),二是如果確實(shí)需要?jiǎng)?chuàng)建新類,則在設(shè)計(jì)這些新類的協(xié)議時(shí),應(yīng)該考慮將來(lái)的可重復(fù)使用性。9.1面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則9.2啟發(fā)規(guī)則1.設(shè)計(jì)結(jié)果應(yīng)該清晰易懂

使設(shè)計(jì)結(jié)果清晰、易讀、易懂,是提高軟件可維護(hù)性和可重用性的重要措施。(1)用詞一致

應(yīng)該使名字與它所代表的事物一致,而且應(yīng)該盡量使用人們習(xí)慣的名字。不同類中相似服務(wù)的名字應(yīng)該相同。(2)使用已有的協(xié)議

如果開(kāi)發(fā)同一軟件的其他設(shè)計(jì)人員已經(jīng)建立了類的協(xié)議,或者在所使用的類庫(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è)類的用途應(yīng)該是有限的,而且通過(guò)類名應(yīng)該可以較容易地推想出它的用途。9.2啟發(fā)規(guī)則2.一般/特殊結(jié)構(gòu)的深度應(yīng)適當(dāng)

應(yīng)該使類等級(jí)中包含的層次數(shù)適當(dāng)。一般來(lái)說(shuō),在一個(gè)中等規(guī)模(大約包含100個(gè)類)的系統(tǒng)中,類等級(jí)層次數(shù)應(yīng)保持為7±2。不應(yīng)該僅僅從方便編碼的角度出發(fā)隨意創(chuàng)建派生類,應(yīng)該使一般/特殊結(jié)構(gòu)與領(lǐng)域知識(shí)或常識(shí)保持一致。9.2啟發(fā)規(guī)則3.設(shè)計(jì)簡(jiǎn)單的類

應(yīng)該盡量設(shè)計(jì)小而簡(jiǎn)單的類,以便于開(kāi)發(fā)和管理。當(dāng)類比較龐大的時(shí)候,要記住它的所有服務(wù)是非常困難的。為保持類的簡(jiǎn)單,應(yīng)該注意以下幾點(diǎn)。(1)避免包含過(guò)多的屬性

屬性過(guò)多通常表明這個(gè)類過(guò)分復(fù)雜了,它所完成的功能可能太多了。(2)有明確的定義

為了使類的定義明確,分配給每個(gè)類的任務(wù)應(yīng)該簡(jiǎn)單,最好能用一兩個(gè)簡(jiǎn)單語(yǔ)句描述它的任務(wù)。9.2啟發(fā)規(guī)則(3)盡量簡(jiǎn)化對(duì)象之間的合作關(guān)系

如果需要多個(gè)對(duì)象協(xié)同配合才能做好一件事,則破壞了類的簡(jiǎn)明性和清晰性。(4)不要提供太多服務(wù)

一個(gè)類提供的服務(wù)過(guò)多,同樣表明這個(gè)類過(guò)分復(fù)雜。典型地,一個(gè)類提供的公共服務(wù)不超過(guò)7個(gè)。在開(kāi)發(fā)大型軟件系統(tǒng)時(shí),遵循上述啟發(fā)規(guī)則也會(huì)帶來(lái)另一個(gè)問(wèn)題;設(shè)計(jì)出大量較小的類,這同樣會(huì)帶來(lái)一定復(fù)雜性。解決這個(gè)問(wèn)題的辦法,是把系統(tǒng)中的類按邏輯分組,也就是劃分“主題”。9.2啟發(fā)規(guī)則4.使用簡(jiǎn)單的協(xié)議

一般來(lái)說(shuō),消息中的參數(shù)不要超過(guò)3個(gè)。當(dāng)然,不超過(guò)3個(gè)的限制也不是絕對(duì)的。但是,經(jīng)驗(yàn)表明,通過(guò)復(fù)雜消息相互關(guān)聯(lián)的對(duì)象是緊耦合的,對(duì)一個(gè)對(duì)象的修改往往導(dǎo)致其他對(duì)象的修改。5.使用簡(jiǎn)單的服務(wù)

面向?qū)ο笤O(shè)計(jì)出來(lái)的類中的服務(wù)通常都很小,一般只有3~5行源程序語(yǔ)句,可以用僅含一個(gè)動(dòng)詞和一個(gè)賓語(yǔ)的簡(jiǎn)單句子描述它的功能。9.2啟發(fā)規(guī)則6.把設(shè)計(jì)變動(dòng)減至最小

通常,設(shè)計(jì)的質(zhì)量越高,設(shè)計(jì)結(jié)果保持不變的時(shí)間也越長(zhǎng)。即使出現(xiàn)必須修改設(shè)計(jì)的情況,也應(yīng)該使修改的范圍盡可能小。理想的設(shè)計(jì)變動(dòng)曲線如圖9-1所示。

在設(shè)計(jì)的早期階段,變動(dòng)較大,隨著時(shí)間推移,設(shè)計(jì)方案日趨成熟,改動(dòng)也越來(lái)越小了。圖9-1中所示的峰值與出現(xiàn)設(shè)計(jì)錯(cuò)誤或發(fā)生非預(yù)期變動(dòng)的情況相對(duì)應(yīng)。峰值越高,表明設(shè)計(jì)質(zhì)量越差,可重用性也越差。9.2啟發(fā)規(guī)則圖9-1理想的設(shè)計(jì)變動(dòng)情況9.2啟發(fā)規(guī)則9.3軟件重用9.3.1概述1、重用2、軟件成分的重用級(jí)別(1)代碼重用(2)設(shè)計(jì)結(jié)果重用(3)分析結(jié)果重用3、典型的可重用軟件成分項(xiàng)目計(jì)劃成本估計(jì)體系結(jié)構(gòu)需求模型和規(guī)格說(shuō)明設(shè)計(jì)源代碼用戶文檔和技術(shù)文檔用戶界面數(shù)據(jù)測(cè)試用例9.3.1概述9.3.2類構(gòu)件可重用軟件構(gòu)件應(yīng)具備的特點(diǎn)模塊獨(dú)立性強(qiáng)。具有高度可塑性。接口清晰、簡(jiǎn)明、可靠。類構(gòu)件的重用方式實(shí)例重用繼承重用多態(tài)重用9.3.3軟件重用的效益近幾年來(lái)軟件產(chǎn)業(yè)界的實(shí)例研究表明,通過(guò)積極的軟件重用能夠獲得可觀的商業(yè)效益,產(chǎn)品質(zhì)量、開(kāi)發(fā)生產(chǎn)率和整體成本都得到了改善。質(zhì)量生產(chǎn)率成本9.4劃分子系統(tǒng)人類解決復(fù)雜問(wèn)題時(shí)普遍采用的策略是“分而治之,各個(gè)擊破”。同樣,軟件工程師在設(shè)計(jì)比較復(fù)雜的應(yīng)用系統(tǒng)時(shí)普遍采用的策略,也是首先把系統(tǒng)分解成若干個(gè)比較小的部分,然后再分別設(shè)計(jì)每個(gè)部分。系統(tǒng)的主要組成部分稱為子系統(tǒng),通常根據(jù)所提供的功能來(lái)劃分子系統(tǒng)。各個(gè)子系統(tǒng)之間應(yīng)該具有盡可能簡(jiǎn)單、明確的接口。接口確定了交互形式和通過(guò)子系統(tǒng)邊界的信息流,但是無(wú)須規(guī)定子系統(tǒng)內(nèi)部的實(shí)現(xiàn)算法。在劃分和設(shè)計(jì)子系統(tǒng)時(shí),應(yīng)該盡量減少子系統(tǒng)彼此間的依賴性。采用面向?qū)ο蠓椒ㄔO(shè)計(jì)軟件系統(tǒng)時(shí),面向?qū)ο笤O(shè)計(jì)模型(即求解域的對(duì)象模型),與面向?qū)ο蠓治瞿P停磫?wèn)題域的對(duì)象模型)一樣,也由主題、類與對(duì)象、結(jié)構(gòu)、屬性和服務(wù)5個(gè)層次組成。我們可以把面向?qū)ο笤O(shè)計(jì)模型的4大組成部分想象成整個(gè)模型的4個(gè)垂直切片。典型的面向?qū)ο笤O(shè)計(jì)模型可以用圖9-2表示。9.4劃分子系統(tǒng)圖9-2典型的面向?qū)ο笤O(shè)計(jì)模型9.4劃分子系統(tǒng)9.4.1子系統(tǒng)之間的兩種交互方式1.客戶—供應(yīng)商關(guān)系

在這種關(guān)系中,作為“客戶”的子系統(tǒng)調(diào)用作為“供應(yīng)商”的子系統(tǒng),后者完成某些服務(wù)工作并返回結(jié)果。使用這種交互方案,作為客戶的子系統(tǒng)必須了解作為供應(yīng)商的子系統(tǒng)的接口,然而后者卻無(wú)須了解前者的接口,因?yàn)槿魏谓换バ袨槎际怯汕罢唑?qū)動(dòng)的。2.平等伙伴關(guān)系

在這種關(guān)系中,每個(gè)子系統(tǒng)都可能調(diào)用其他子系統(tǒng),因此,每個(gè)子系統(tǒng)都必須了解其他子系統(tǒng)的接口。由于各個(gè)子系統(tǒng)需要相互了解對(duì)方的接口,因此這種組織系統(tǒng)的方案比起客戶—供應(yīng)商方案來(lái),子系統(tǒng)之間的交互更復(fù)雜,而且這種交互方式還可能存在通信環(huán)路,從而使系統(tǒng)難于理解,容易發(fā)生不易察覺(jué)的設(shè)計(jì)錯(cuò)誤。

總的說(shuō)來(lái),單向交互比雙向交互更容易理解,也更容易設(shè)計(jì)和修改,因此,應(yīng)該盡量使用客戶—供應(yīng)商關(guān)系。9.4.1子系統(tǒng)之間的兩種交互方式9.4.2組織系統(tǒng)的兩種方案1.水平層次組織

這種組織方案把軟件系統(tǒng)組織成一個(gè)層次系統(tǒng),每層是一個(gè)子系統(tǒng)。上層在下層的基礎(chǔ)上建立,下層為實(shí)現(xiàn)上層功能而提供必要的服務(wù)。每一層內(nèi)所包含的對(duì)象,彼此間相互獨(dú)立,而處于不同層次上的對(duì)象,彼此間往往有關(guān)聯(lián)。

層次結(jié)構(gòu)又可進(jìn)一步劃分成兩種模式:封閉式和開(kāi)放式。所謂封閉式,就是每層子系統(tǒng)僅僅使用其直接下層提供的服務(wù)在開(kāi)放模式中,某層子系統(tǒng)可以使用處于其下面的任何一層子系統(tǒng)所提供的服務(wù)。2.垂直塊狀組織

這種組織方案把軟件系統(tǒng)垂直地分解成若干個(gè)相對(duì)獨(dú)立的、弱耦合的子系統(tǒng),一個(gè)子系統(tǒng)相當(dāng)于一塊,每塊提供一種類型的服務(wù)。

利用層次和塊的各種可能的組合,可以成功地由多個(gè)子系統(tǒng)組成一個(gè)完整的軟件系統(tǒng)。當(dāng)混合使用層次結(jié)構(gòu)和塊狀結(jié)構(gòu)時(shí),同一層次可以由若干塊組成,而同一塊也可以分為若干層。例如,圖9-3所示為一個(gè)應(yīng)用系統(tǒng)的組織結(jié)構(gòu),這個(gè)應(yīng)用系統(tǒng)采用了層次與塊狀的混合結(jié)構(gòu)。9.4.2組織系統(tǒng)的兩種方案圖9-3典型應(yīng)用系統(tǒng)的組織結(jié)構(gòu)9.4.2組織系統(tǒng)的兩種方案9.4.3設(shè)計(jì)系統(tǒng)的拓?fù)浣Y(jié)構(gòu)由子系統(tǒng)組成完整的系統(tǒng)時(shí),典型的拓?fù)浣Y(jié)構(gòu)有管道形、樹(shù)形、星形等。設(shè)計(jì)者應(yīng)該采用與問(wèn)題結(jié)構(gòu)相適應(yīng)的、盡可能簡(jiǎn)單的拓?fù)浣Y(jié)構(gòu),以減少子系統(tǒng)之間的交互數(shù)量。9.5設(shè)計(jì)子系統(tǒng)9.5.1設(shè)計(jì)問(wèn)題域子系統(tǒng)使用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件時(shí),在分析與設(shè)計(jì)之間并沒(méi)有明確的分界線,對(duì)于問(wèn)題域子系統(tǒng)來(lái)說(shuō),情況更是如此。通過(guò)面向?qū)ο蠓治鏊贸龅膯?wèn)題域精確模型,為設(shè)計(jì)問(wèn)題域子系統(tǒng)奠定了良好的基礎(chǔ),建立了完整的框架使用面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)軟件,能夠保持問(wèn)題域組織框架的穩(wěn)定性,從而便于追蹤分析、設(shè)計(jì)和編程的結(jié)果。在設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中所做的細(xì)節(jié)修改(如增加具體類,增加屬性或服務(wù)),并不影響開(kāi)發(fā)結(jié)果的穩(wěn)定性,因?yàn)橄到y(tǒng)的總體框架是基于問(wèn)題域的。對(duì)于需求可能隨時(shí)間變化的系統(tǒng)來(lái)說(shuō),穩(wěn)定性是至關(guān)重要的。穩(wěn)定性也是能夠在類似系統(tǒng)中重用分析、設(shè)計(jì)和編程結(jié)果的關(guān)鍵因素。為更好地支持系統(tǒng)在其生命期中的擴(kuò)充,也同樣需要穩(wěn)定性。下面介紹在面向?qū)ο笤O(shè)計(jì)過(guò)程中,可能對(duì)面向?qū)ο蠓治鏊贸龅膯?wèn)題域模型作的補(bǔ)充或修改。1.按照需求信息的最新變動(dòng)調(diào)整并修改模型

有兩種情況會(huì)導(dǎo)致修改通過(guò)面向?qū)ο蠓治鏊_定的系統(tǒng)需求:一是用戶需求或外部環(huán)境發(fā)生了變化;二是分析員對(duì)問(wèn)題域理解不透徹或缺乏領(lǐng)域?qū)<規(guī)椭灾旅嫦驅(qū)ο蠓治瞿P筒荒芡暾?、?zhǔn)確地反映用戶的真實(shí)需求。9.5.1設(shè)計(jì)問(wèn)題域子系統(tǒng)2.調(diào)整和組合問(wèn)題域中的類

代碼重用從設(shè)計(jì)階段開(kāi)始,在研究面向?qū)ο蠓治鼋Y(jié)果時(shí)就應(yīng)該尋找使用已有類的方法。若因?yàn)闆](méi)有合適的類可以重用而確實(shí)需要?jiǎng)?chuàng)建新的類,則在設(shè)計(jì)這些新類的協(xié)議時(shí),必須考慮到將來(lái)的可重用性。①選擇有可能被重用的已有類,標(biāo)出這些候選類中對(duì)本問(wèn)題無(wú)用的屬性和服務(wù),盡量重用那些能使無(wú)用的屬性和服務(wù)降到最低程度的類;②在被重用的已有類和問(wèn)題域類之間添加歸納關(guān)系;③標(biāo)出問(wèn)題域類中從已有類繼承來(lái)的屬性和服務(wù),現(xiàn)在已經(jīng)無(wú)須在問(wèn)題域類內(nèi)定義它們了;④修改與問(wèn)題域類相關(guān)的關(guān)聯(lián),必要時(shí)改為與被重用的已有類相關(guān)的關(guān)聯(lián)。9.5.1設(shè)計(jì)問(wèn)題域子系統(tǒng)3.調(diào)整對(duì)象模型中的繼承的支持級(jí)別

在面向?qū)ο笤O(shè)計(jì)過(guò)程中,設(shè)計(jì)者往往通過(guò)引入一個(gè)根類而把問(wèn)題域類組合在一起。事實(shí)上,這是在沒(méi)有更先進(jìn)的組合機(jī)制可用時(shí)才采用的一種組合方法。4.改進(jìn)系統(tǒng)的性能

在設(shè)計(jì)過(guò)程中常常發(fā)現(xiàn),一些具體類需要有一個(gè)公共的協(xié)議,也就是說(shuō),它們都需要定義一組類似的服務(wù)(很可能還需要相應(yīng)的屬性)。在這種情況下可以引入一個(gè)附加類(例如,根類),以便建立這個(gè)協(xié)議(即命名公共服務(wù)集合,這些服務(wù)在具體類中仔細(xì)定義)。9.5.1設(shè)計(jì)問(wèn)題域子系統(tǒng)5.增加底層細(xì)節(jié)

圖9-4所示描繪了第7章給出的ATM系統(tǒng)的問(wèn)題域子系統(tǒng)的結(jié)構(gòu)。在面向?qū)ο笤O(shè)計(jì)過(guò)程中,我們把ATM系統(tǒng)的問(wèn)題域子系統(tǒng),進(jìn)一步劃分成了3個(gè)更小的子系統(tǒng),它們分別是ATM站子系統(tǒng)、中央計(jì)算機(jī)子系統(tǒng)和分行計(jì)算機(jī)子系統(tǒng)。它們的拓?fù)浣Y(jié)構(gòu)為星形,以中央計(jì)算機(jī)為中心向外輻射,同所有ATM站及分行計(jì)算機(jī)通信。物理連接用專用電話線實(shí)現(xiàn)。9.5.1設(shè)計(jì)問(wèn)題域子系統(tǒng)圖9-4ATM系統(tǒng)問(wèn)題域子系統(tǒng)的結(jié)構(gòu)9.5.1設(shè)計(jì)問(wèn)題域子系統(tǒng)9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)在面向?qū)ο蠓治鲞^(guò)程中,已經(jīng)對(duì)用戶界面需求作了初步分析。在面向?qū)ο笤O(shè)計(jì)過(guò)程中,則應(yīng)該對(duì)系統(tǒng)的人—機(jī)交互子系統(tǒng)進(jìn)行詳細(xì)設(shè)計(jì),以確定人—機(jī)交互的細(xì)節(jié),其中包括指定窗口和報(bào)表的形式、設(shè)計(jì)命令層次等項(xiàng)內(nèi)容。由于對(duì)人—機(jī)界面的評(píng)價(jià),在很大程度上由人的主觀因素決定,因此,使用由原型支持的系統(tǒng)化的設(shè)計(jì)策略,是成功地設(shè)計(jì)人—機(jī)交互子系統(tǒng)的關(guān)鍵。1、設(shè)計(jì)人機(jī)交互界面的準(zhǔn)則(1)一致性

使用一致的術(shù)語(yǔ),一致的步驟,一致的動(dòng)作。(2)減少步驟

應(yīng)使用戶為做某件事情而需敲擊鍵盤的次數(shù)、點(diǎn)按鼠標(biāo)的次數(shù)、或者下拉菜單的距離,都減至最少。還應(yīng)使得技術(shù)水平不同的用戶,為獲得有意義的結(jié)果所需使用的時(shí)間都減至最少。特別應(yīng)該為熟練用戶提供簡(jiǎn)捷的操作方法(如熱鍵)。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)(3)及時(shí)提供反饋信息

每當(dāng)用戶等待系統(tǒng)完成一項(xiàng)工作時(shí),系統(tǒng)都應(yīng)該向用戶提供有意義的、及時(shí)的反饋信息,以便用戶能夠知道系統(tǒng)目前已經(jīng)完成該項(xiàng)工作的多大比例。(4)提供撤銷命令

人在與系統(tǒng)交互的過(guò)程中難免會(huì)犯錯(cuò)誤,因此,應(yīng)該提供“撤銷(undo)”命令,以便用戶及時(shí)撤銷錯(cuò)誤動(dòng)作,消除錯(cuò)誤動(dòng)作造成的后果。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)(5)無(wú)須記憶

不應(yīng)該要求用戶記住在某個(gè)窗口中顯示的信息,然后再用到另一個(gè)窗口中,這是軟件系統(tǒng)的責(zé)任而不是用戶的任務(wù)。

在設(shè)計(jì)人—機(jī)交互部分時(shí)應(yīng)該力求達(dá)到下述目標(biāo):用戶在使用該系統(tǒng)時(shí)用于思考人—機(jī)交互方法所花費(fèi)的時(shí)間減至最少,而用于做他實(shí)際想做的工作所用的時(shí)間達(dá)到最大值。更理想的情況是,人—機(jī)交互界面能夠增強(qiáng)用戶的能力。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)(6)易學(xué)

人—機(jī)交互界面應(yīng)該易學(xué)易用,應(yīng)該提供聯(lián)機(jī)參考資料,以便用戶在遇到困難時(shí)可隨時(shí)參閱。

人—機(jī)交互界面不僅應(yīng)該方便、高效,還應(yīng)該使人在使用時(shí)感到心情愉快,能夠從中獲得樂(lè)趣,從而吸引人去使用它。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)2、設(shè)計(jì)人—機(jī)交互子系統(tǒng)的策略(1)分類用戶

人—機(jī)交互界面是給用戶使用的。顯然。為設(shè)計(jì)好人—機(jī)交互子系統(tǒng),設(shè)計(jì)者應(yīng)該認(rèn)真研究使用它的用戶。應(yīng)該深入到用戶的工作現(xiàn)場(chǎng),仔細(xì)觀察用戶是怎樣做他們的工作的,這對(duì)設(shè)計(jì)好人—機(jī)交互界面非常必要。通常從下列幾個(gè)不同角度進(jìn)行分類。

按技能水平分類(新手/初級(jí)/中級(jí)/高級(jí))。

按職務(wù)分類(總經(jīng)理/經(jīng)理/職員)。

按所屬集團(tuán)分類(職員/顧客)。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)(2)描述用戶

應(yīng)該仔細(xì)了解將來(lái)使用系統(tǒng)的每類用戶的情況,把獲得的下列各項(xiàng)信息記錄下來(lái)。

用戶類型。

使用系統(tǒng)欲達(dá)到的目的。

特征(年齡、性別、受教育程度、使用系統(tǒng)的權(quán)限等)。

關(guān)鍵的成功因素(需求、愛(ài)好、習(xí)慣等)。

技能水平。

完成本職工作的腳本。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)(3)設(shè)計(jì)命令層次1)研究現(xiàn)有的人—機(jī)交互含義和準(zhǔn)則現(xiàn)在的Windows已經(jīng)成了微機(jī)上圖形用戶界面事實(shí)上的工業(yè)標(biāo)準(zhǔn),所有Windows應(yīng)用程序的基本外觀及給用戶的感受都是相同的。Windows程序通常還遵守廣大用戶習(xí)以為常的許多約定。設(shè)計(jì)圖形用戶界面時(shí),應(yīng)該保持與普通Windows應(yīng)用程序界面相一致,并遵守廣大用戶習(xí)慣的約定,這樣才會(huì)被用戶接受和喜受。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)2)確定初始的命令層次

所謂命令層次,實(shí)質(zhì)上是使用過(guò)程抽象機(jī)制組織起來(lái)的、可供選用的服務(wù)的表示形式。設(shè)計(jì)命令層次時(shí),通常先從對(duì)服務(wù)的過(guò)程抽象著手,然后再進(jìn)一步修改它們,以適合具體應(yīng)用環(huán)境的需要。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)3)精化命令層次從以下因素考慮來(lái)精華命令層次:

次序:仔細(xì)選擇每個(gè)服務(wù)的名字,并在命令層的每一部分內(nèi)把服務(wù)排好次序。排序時(shí)或者把最常用的服務(wù)放在最前面,或者按照用戶習(xí)慣的工作步驟排序。

整體—部分關(guān)系:尋找在這些服務(wù)中存在的整體—部分模式,這樣做有助于在命令層中分組組織服務(wù)。

寬度和深度:由于人的短期記憶能力有限,命令層次的寬度和深度都不應(yīng)該過(guò)大。

操作步驟:應(yīng)該用盡量少的單擊、拖動(dòng)和擊鍵組合來(lái)表達(dá)命令,而且應(yīng)該為高級(jí)用戶提供簡(jiǎn)捷的操作方法。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)(4)設(shè)計(jì)人機(jī)交互類

人—機(jī)交互類與所使用的操作系統(tǒng)及編程語(yǔ)言密切相關(guān),如在Windows環(huán)境下運(yùn)行的VisualC++語(yǔ)言提供了MFC類庫(kù)。設(shè)計(jì)人—機(jī)交互類時(shí),僅需從MFC類庫(kù)中選出一些適用的類,然后從這些類派生出符合自己需要的類。9.5.2設(shè)計(jì)人機(jī)交互子系統(tǒng)9.5.3設(shè)計(jì)任務(wù)管理子系統(tǒng)1.確定事件驅(qū)動(dòng)型任務(wù)

某些任務(wù)是由事件驅(qū)動(dòng)的,這類任務(wù)可能主要完成通信工作。這類任務(wù)的工作過(guò)程如下:任務(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í)鐘驅(qū)動(dòng)型任務(wù)的工作過(guò)程如下:任務(wù)設(shè)置了喚醒時(shí)間后進(jìn)入睡眠狀態(tài);任務(wù)睡眠(不消耗處理器時(shí)間)等待來(lái)自系統(tǒng)的中斷;一旦接收到這種中斷,任務(wù)就被喚醒并做它的工作,通知有關(guān)的對(duì)象,然后該任務(wù)又回到睡眠狀態(tài)。9.5.3設(shè)計(jì)任務(wù)管理子系統(tǒng)3.確定優(yōu)先任務(wù)和關(guān)鍵任務(wù)

優(yōu)先任務(wù)可以滿足高優(yōu)先級(jí)或低優(yōu)先級(jí)的處理需求。

高優(yōu)先級(jí):某些服務(wù)具有很高的優(yōu)先級(jí),為了在嚴(yán)格限定的時(shí)間內(nèi)完成這種服務(wù),可能需要把這類服務(wù)分離成獨(dú)立的任務(wù)。

低優(yōu)先級(jí):與高優(yōu)先級(jí)相反,有些服務(wù)是低優(yōu)先級(jí)的,屬于低優(yōu)先級(jí)處理(通常指那些背景處理)。設(shè)計(jì)時(shí)可能用額外的任務(wù)把這樣的處理分離出來(lái)。

關(guān)鍵任務(wù)是有關(guān)系統(tǒng)成功或失敗的關(guān)鍵處理,這類處理通常都有嚴(yán)格的可靠性要求。在設(shè)計(jì)過(guò)程中可能用額外的任務(wù)把這樣的關(guān)鍵處理分離出來(lái),以滿足高可靠性處理的要求。對(duì)高可靠性處理應(yīng)該精心設(shè)計(jì)和編碼,并且應(yīng)該嚴(yán)格測(cè)試。9.5.3設(shè)計(jì)任務(wù)管理子系統(tǒng)4.確定協(xié)調(diào)任務(wù)

當(dāng)系統(tǒng)中存在3個(gè)以上任務(wù)時(shí),就應(yīng)該增加一個(gè)任務(wù),用它作為協(xié)調(diào)任務(wù)。引入?yún)f(xié)調(diào)任務(wù)會(huì)增加系統(tǒng)的總開(kāi)銷(增加從一個(gè)任務(wù)到另一個(gè)任務(wù)的轉(zhuǎn)換時(shí)間),但是引入?yún)f(xié)調(diào)任務(wù)有助于把不同任務(wù)之間的協(xié)調(diào)控制封裝起來(lái)。使用狀態(tài)轉(zhuǎn)換矩陣可以比較方便地描述該任務(wù)的行為。這類任務(wù)應(yīng)該僅做協(xié)調(diào)工作,不要讓它再承擔(dān)其他服務(wù)工作。9.5.3設(shè)計(jì)任務(wù)管理子系統(tǒng)5.盡量減少任務(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ù)的難度。9.5.3設(shè)計(jì)任務(wù)管理子系統(tǒng)6.確定資源需求

使用多處理器或固件,主要是為了滿足高性能的需求。設(shè)計(jì)者應(yīng)該綜合考慮各種因素,以決定哪些子系統(tǒng)用硬件實(shí)現(xiàn),哪些子系統(tǒng)用軟件實(shí)現(xiàn)。使用硬件實(shí)現(xiàn)某些子系統(tǒng)的兩個(gè)主要原因如下:

現(xiàn)有的硬件完全能滿足某些方面的需求。例如,買一塊浮點(diǎn)運(yùn)算卡比用軟件實(shí)現(xiàn)浮點(diǎn)運(yùn)算要容易得多。

專用硬件比通用的CPU性能更高。例如,目前在信號(hào)處理系統(tǒng)中廣泛使用固件實(shí)現(xiàn)快速傅里葉變換。9.5.3設(shè)計(jì)任務(wù)管理子系統(tǒng)9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)1、選擇數(shù)據(jù)存儲(chǔ)管理模式(1).文件管理系統(tǒng)文件管理系統(tǒng)是操作系統(tǒng)的一個(gè)組成部分,使用它長(zhǎng)期保存數(shù)據(jù)具有成本低、簡(jiǎn)單等特點(diǎn)。但是,文件操作的級(jí)別低,為提供適當(dāng)?shù)某橄蠹?jí)別還必須編寫額外的代碼。此外,不同操作系統(tǒng)的文件管理系統(tǒng)往往有明顯差異。(2).關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)

關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的理論基礎(chǔ)是關(guān)系代數(shù),它不僅理論基礎(chǔ)堅(jiān)實(shí)而且有下列一些主要優(yōu)點(diǎn)。

提供了各種最基本的數(shù)據(jù)管理功能(如中斷恢復(fù)、多用戶共享、多應(yīng)用共享、完整性、事務(wù)支持等)。

為多種應(yīng)用提供了一致的接口。

標(biāo)準(zhǔn)化的語(yǔ)言(大多數(shù)商品化關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都使用SQL)。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)但是,為了做到通用與一致,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)通常都相當(dāng)復(fù)雜,且有下述一些具體缺點(diǎn)。

運(yùn)行開(kāi)銷大:即使只完成簡(jiǎn)單的事務(wù)(如只修改表中的一行),也需要較長(zhǎng)的時(shí)間。

不能滿足高級(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ù)類型豐富或操作不標(biāo)準(zhǔn)的應(yīng)用中。

與程序設(shè)計(jì)語(yǔ)言的連接不自然:SQL支持面向集合的操作,是一種非過(guò)程性語(yǔ)言。然而大多數(shù)程序設(shè)計(jì)語(yǔ)言本質(zhì)上卻是過(guò)程性的,每次只能處理一個(gè)記錄。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)(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ǔ)言。擴(kuò)展的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)是在關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)上,增加了抽象數(shù)據(jù)類型和繼承機(jī)制,此外還增加了創(chuàng)建及管理類和對(duì)象的通用服務(wù)。擴(kuò)展的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,擴(kuò)充了面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的語(yǔ)法和功能,增加了在數(shù)據(jù)庫(kù)中存儲(chǔ)和管理對(duì)象的機(jī)制。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)2、設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)(1).設(shè)計(jì)數(shù)據(jù)格式設(shè)計(jì)數(shù)據(jù)格式的方法與所使用的數(shù)據(jù)存儲(chǔ)管理模式密切相關(guān),下面分別介紹適用于每種數(shù)據(jù)存儲(chǔ)管理模式的設(shè)計(jì)方法。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)1)文件系統(tǒng)

定義第一范式表:列出每個(gè)類的屬性表;把屬性表規(guī)范成第一范式,從而得到第一范式表的定義。

為每個(gè)第一范式表定義一個(gè)文件。

測(cè)量性能和需要的存儲(chǔ)容量。

修改原設(shè)計(jì)的第一范式,以滿足性能和存儲(chǔ)需求。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)2)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)

定義第三范式表:列出每個(gè)類的屬性表;把屬性表規(guī)范成第三范式,從而得出第三范式表的定義。

為每個(gè)第三范式表定義一個(gè)數(shù)據(jù)庫(kù)表。

測(cè)量性能和需要的存儲(chǔ)容量。

修改先前設(shè)計(jì)的第三范式,以滿足性能和存儲(chǔ)需求。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)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ǔ)值的功能。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)(2).設(shè)計(jì)相應(yīng)的服務(wù)

如果某個(gè)類的對(duì)象需要存儲(chǔ)起來(lái),則在這個(gè)類中增加一個(gè)屬性和服務(wù),用于完成存儲(chǔ)對(duì)象自身的工作。應(yīng)該把為此目的增加的屬性和服務(wù)作為“隱含”的屬性和服務(wù),即無(wú)須在面向?qū)ο笤O(shè)計(jì)模型的屬性和服務(wù)層中顯式地表示它們,僅需在關(guān)于類與對(duì)象的文檔中描述它們。

這樣設(shè)計(jì)之后,對(duì)象將知道怎樣存儲(chǔ)自己。用于“存儲(chǔ)自己”的屬性和服務(wù),在問(wèn)題域子系統(tǒng)和數(shù)據(jù)管理子系統(tǒng)之間構(gòu)成一座必要的橋梁。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)下面介紹使用不同數(shù)據(jù)存儲(chǔ)管理模式時(shí)的設(shè)計(jì)要點(diǎn)。1)文件系統(tǒng)

被存儲(chǔ)的對(duì)象需要知道打開(kāi)哪個(gè)(些)文件,怎樣把文件定位到正確的記錄上,怎樣檢索出舊值(如果有的話),以及怎樣用現(xiàn)有值更新它們。

此外,還應(yīng)該定義一個(gè)ObjectServer(對(duì)象服務(wù)器)類,并創(chuàng)建它的實(shí)例。該類提供下列服務(wù):

通知對(duì)象保存自身;

檢索已存儲(chǔ)的對(duì)象(查找,讀值,創(chuàng)建并初始化對(duì)象),以便把這些對(duì)象提供給其他子系統(tǒng)使用。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(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類,并聲明它的對(duì)象。該類提供下列服務(wù):

通知對(duì)象保存自身;

檢索已存儲(chǔ)的對(duì)象(查找,讀值,創(chuàng)建并初始化對(duì)象),以便由其他子系統(tǒng)使用這些對(duì)象。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)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)記,然后由面向?qū)ο髷?shù)據(jù)庫(kù)管理系統(tǒng)負(fù)責(zé)存儲(chǔ)和恢復(fù)這類對(duì)象。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)3、例子為具體說(shuō)明數(shù)據(jù)管理子系統(tǒng)的設(shè)計(jì)方法,讓我們?cè)倏纯磮D9-4所示的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ù)封鎖賬戶直到該事務(wù)結(jié)束為止。在這個(gè)例子中,需要存儲(chǔ)的對(duì)象主要是賬戶類的對(duì)象。為了支持?jǐn)?shù)據(jù)管理子系統(tǒng)的實(shí)現(xiàn),賬戶類對(duì)象必須知道自己是怎樣存儲(chǔ)的,有兩種方法可以達(dá)到這個(gè)目的。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)1.每個(gè)對(duì)象自己保存自己

賬戶類對(duì)象在接到“存儲(chǔ)自己”的通知后,知道怎樣把自身存儲(chǔ)起來(lái)(需要增加一個(gè)屬性和一個(gè)服務(wù)來(lái)定義上述行為)。2.由數(shù)據(jù)管理子系統(tǒng)負(fù)責(zé)存儲(chǔ)對(duì)象

賬戶類對(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)。9.5.4設(shè)計(jì)數(shù)據(jù)管理子系統(tǒng)9.6設(shè)計(jì)類中的服務(wù)9.6.1確定類中應(yīng)有的服務(wù)需要綜合考慮對(duì)象模型、動(dòng)態(tài)模型和功能模型,才能正確確定類中應(yīng)有的服務(wù)。對(duì)象模型是進(jìn)行對(duì)象設(shè)計(jì)的基本框架。但是,面向?qū)ο蠓治龅贸龅膶?duì)象模型,通常只在每個(gè)類中列出很少幾個(gè)最核心的服務(wù)。設(shè)計(jì)者必須把動(dòng)態(tài)模型中對(duì)象的行為以及功能模型中的數(shù)據(jù)處理,轉(zhuǎn)換成由適當(dāng)?shù)念愃峁┑姆?wù)。一張狀態(tài)圖描繪了一個(gè)對(duì)象的生命周期,圖中的狀態(tài)轉(zhuǎn)換是執(zhí)行對(duì)象服務(wù)的結(jié)果。功能模型指明了系統(tǒng)必須提供的服務(wù)。狀態(tài)圖中狀態(tài)轉(zhuǎn)換所觸發(fā)的動(dòng)作,在功能模型中有時(shí)可能擴(kuò)展成一張數(shù)據(jù)流圖。目標(biāo)對(duì)象的確定規(guī)則:①如果某個(gè)處理的功能是從輸入流中抽取一個(gè)值,則該輸入流就是目標(biāo)對(duì)象。②如果某個(gè)處理具有類型相同的輸入流和輸出流,而且輸出流實(shí)質(zhì)上是輸入流的另一種形式,則該輸入/輸出流就是目標(biāo)對(duì)象。③如果某個(gè)處理從多個(gè)輸入流得出輸出值,則該處理是輸出類中定義的一個(gè)服務(wù)。④如果某個(gè)處理把對(duì)輸入流處理的結(jié)果輸出給數(shù)據(jù)存儲(chǔ)或動(dòng)作對(duì)象,則該數(shù)據(jù)存儲(chǔ)或動(dòng)作對(duì)象就是目標(biāo)對(duì)象。9.6.1確定類中應(yīng)有的服務(wù)當(dāng)一個(gè)處理涉及多個(gè)對(duì)象時(shí),為確定把它作為哪個(gè)對(duì)象的服務(wù),設(shè)計(jì)者必須判斷哪個(gè)對(duì)象在這個(gè)處理中起主要作用。通常在起主要作用的對(duì)象類中定義這個(gè)服務(wù)。下面兩條規(guī)則有助于確定處理的歸屬。①如果處理影響或修改了一個(gè)對(duì)象,則最好把該處理與處理的目標(biāo)(而不是觸發(fā)者)聯(lián)系在一起。②考察處理涉及的對(duì)象類及這些類之間的關(guān)聯(lián),從中找出處于中心地位的類。如果其他類和關(guān)聯(lián)圍繞這個(gè)中心類構(gòu)成星形,則這個(gè)中心類就是處理的目標(biāo)。9.6.1確定類中應(yīng)有的服務(wù)9.6.2設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法1.設(shè)計(jì)實(shí)現(xiàn)服務(wù)的算法(1)算法復(fù)雜度

通常選用復(fù)雜度較低(即效率較高)的算法,但也不要過(guò)分追求高效率,應(yīng)以能滿足用戶需求為準(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)部類和內(nèi)部操作

在面向?qū)ο笤O(shè)計(jì)過(guò)程中,可能需要增添一些在需求陳述中沒(méi)有提到的類,這些新增加的類,主要用來(lái)存放在執(zhí)行算法過(guò)程中所得出的某些中間結(jié)果。9.6.2設(shè)計(jì)實(shí)現(xiàn)服務(wù)的方法9.7設(shè)計(jì)關(guān)聯(lián)9.7.1.關(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)稍微麻煩一些。1.實(shí)現(xiàn)單向關(guān)聯(lián)

用指針可以方便地實(shí)現(xiàn)單向關(guān)聯(lián)。如果關(guān)聯(lián)的重?cái)?shù)是一元的(見(jiàn)圖9-5),則實(shí)現(xiàn)關(guān)聯(lián)的指針是一個(gè)簡(jiǎn)單指針;如果重?cái)?shù)是多元的,則需要用一個(gè)指針集合實(shí)現(xiàn)關(guān)聯(lián)(見(jiàn)圖9-6)。圖9-5用指針實(shí)現(xiàn)單向關(guān)聯(lián)9.7.1.關(guān)聯(lián)的遍歷圖9-6用指針實(shí)現(xiàn)雙向關(guān)聯(lián)9.7.1.關(guān)聯(lián)的遍歷2.實(shí)現(xiàn)雙向關(guān)聯(lián)許多關(guān)聯(lián)都需要雙向遍歷,當(dāng)然,兩個(gè)方向遍歷的頻度往往并不相同。實(shí)現(xiàn)雙向關(guān)聯(lián)有下列3種方法。①只用屬性實(shí)現(xiàn)一個(gè)方向的關(guān)聯(lián),當(dāng)需要反向遍歷時(shí)就執(zhí)行一次正向查找;②兩個(gè)方向的關(guān)聯(lián)都用屬性實(shí)現(xiàn);③用獨(dú)立的關(guān)聯(lián)對(duì)象實(shí)現(xiàn)雙向關(guān)聯(lián)。關(guān)聯(lián)對(duì)象不屬于相互關(guān)聯(lián)的任何一個(gè)類,它是獨(dú)立的關(guān)聯(lián)類的實(shí)例,如圖9-7所示。9.7.1.關(guān)聯(lián)的遍歷圖9-7用對(duì)象實(shí)現(xiàn)關(guān)聯(lián)9.7.1.關(guān)聯(lián)的遍歷9.7.2.關(guān)聯(lián)對(duì)象的實(shí)現(xiàn)

前面曾經(jīng)講過(guò),可以引入一個(gè)關(guān)聯(lián)類來(lái)保存描述關(guān)聯(lián)性質(zhì)的信息,關(guān)聯(lián)中的每個(gè)連接對(duì)應(yīng)著關(guān)聯(lián)類的一個(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)保存描述徉聯(lián)性質(zhì)的信息,這個(gè)類的每個(gè)實(shí)例表示一條具體的關(guān)聯(lián)鏈及該鏈的屬性。9.8設(shè)計(jì)優(yōu)化9.8.1確定優(yōu)先級(jí)系統(tǒng)的各項(xiàng)質(zhì)量指標(biāo)并不是同等重要的,設(shè)計(jì)人員必須確定各項(xiàng)質(zhì)量指標(biāo)的相對(duì)重要性(即確定優(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ù)恼壑蟹桨浮?.8.2提高效率的技術(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)有增添關(guān)于問(wèn)題域的任何信息,反而會(huì)降低模型的清晰程度。下面用設(shè)計(jì)公司雇員技能數(shù)據(jù)庫(kù)的例子,說(shuō)明分析訪問(wèn)路徑及提高訪問(wèn)效率的方法。圖9-8所示為從面向?qū)ο蠓治瞿P椭姓〉囊徊糠帧9绢愔械姆?wù)find_skill返回具有指定技能的雇員集合。例如,用戶可能詢問(wèn)公司中會(huì)講日語(yǔ)的雇員有哪些人。圖9-8公司、雇員及技能之間的關(guān)聯(lián)鏈9.8.2提高效率的技術(shù)

假設(shè)某公司共有2

000名雇員,平均每名雇員會(huì)10種技能,則簡(jiǎn)單的嵌套查詢將遍歷雇員對(duì)象2

000次,針對(duì)每名雇員平均再遍歷技能對(duì)象10次。如果全公司僅有5名雇員精通日語(yǔ),則查詢命中率僅有1/4

000。

提高訪問(wèn)效率的一種方法是使用哈希(hash)表:“具有技能”這個(gè)關(guān)聯(lián)不再利用無(wú)序表實(shí)現(xiàn),而是改用哈希表實(shí)現(xiàn)。只要“會(huì)講日語(yǔ)”是用唯一一個(gè)技能對(duì)象表示,這樣改進(jìn)后就會(huì)使查詢次數(shù)由20

000次減少到2

000次。9.8.2提高效率的技術(shù)

但是,當(dāng)只有極少數(shù)對(duì)象滿足查詢條件時(shí),查詢命中率仍然很低。這時(shí),提高查詢效率更有效的方法,是給那些需要經(jīng)常查詢的對(duì)象建立索引。例如,針對(duì)上述例子,可以增加一個(gè)額外的限定關(guān)聯(lián)“精通語(yǔ)言”,用來(lái)聯(lián)系公司與雇員這兩類對(duì)象,如圖9-9所示。利用適當(dāng)?shù)娜哂嚓P(guān)聯(lián),可以立即查到精通某種具體語(yǔ)言的雇員,而無(wú)須多余的訪問(wèn)。當(dāng)然,索引也必然帶來(lái)開(kāi)銷:占用內(nèi)存空間,而且每當(dāng)修改基關(guān)聯(lián)時(shí)也必須相應(yīng)地修改索引。因此,應(yīng)該只給那些經(jīng)常執(zhí)行并且開(kāi)銷大、命中率低的查詢建立索引。9.8.2提高效率的技術(shù)圖9-9為雇員技能數(shù)據(jù)庫(kù)建立索引9.8.2提高效率的技術(shù)2.調(diào)整查詢次序

改進(jìn)了對(duì)象模型的結(jié)構(gòu),從而優(yōu)化了常用的遍歷之后,接下來(lái)就應(yīng)該優(yōu)化算法了。優(yōu)化算法的一個(gè)途徑是盡量縮小查找范圍。例如,假設(shè)用戶在使用上述的雇員技能數(shù)據(jù)庫(kù)的過(guò)程中,希望找出既會(huì)講日語(yǔ),又會(huì)講法語(yǔ)的所有雇員。如果某公司只有5位雇員會(huì)講日語(yǔ),會(huì)講法語(yǔ)的雇員卻有200人,則應(yīng)該先查找會(huì)講日語(yǔ)的雇員,然后再?gòu)倪@些會(huì)講日語(yǔ)的雇員中查找同時(shí)又會(huì)講法語(yǔ)的人。9.8.2提高效率的技術(shù)3.保留派生屬性

通過(guò)某種運(yùn)算而從其他數(shù)據(jù)派生出來(lái)的數(shù)據(jù),是一種冗余數(shù)據(jù)。通常把這類數(shù)據(jù)“存儲(chǔ)”(或稱為“隱藏”)在計(jì)算它的表達(dá)式中。如果希望避免重復(fù)計(jì)算復(fù)雜表達(dá)式所帶來(lái)的開(kāi)銷,可以把這類冗余數(shù)據(jù)作為派生屬性保存起來(lái)。

派生屬性既可以在原有類中定義,也可以定義新類,并用新類的對(duì)象保存它們。每當(dāng)修改了基本對(duì)象之后,所有依賴于它的、保存派生屬性的對(duì)象也必須相應(yīng)地修改。9.8.2提高效率的技術(shù)9.8.3調(diào)整繼承關(guān)系在面向?qū)ο笤O(shè)計(jì)過(guò)程中,建立良好的繼承關(guān)系是優(yōu)化設(shè)計(jì)的一項(xiàng)重要內(nèi)容。繼承關(guān)系能夠?yàn)橐粋€(gè)類族定義一個(gè)協(xié)議,并能在類之間實(shí)現(xiàn)代碼共享以減少冗余。一個(gè)基類和它的子孫類在一起稱為一個(gè)類繼承。在面向?qū)ο笤O(shè)計(jì)中,建立良好的類繼承是非常重要的。利用類繼承能夠把若干個(gè)類組織成一個(gè)邏輯結(jié)構(gòu)。與建立繼承有關(guān)的問(wèn)題:1.抽象與具體

在設(shè)計(jì)類繼承時(shí),很少使用純粹自頂向下的方法。通常的作法是,首先創(chuàng)建一些滿足具體用途的類,然后對(duì)它們進(jìn)行歸納,一旦歸納出一些通用的類以后,往往可以根據(jù)需要再派生出具體類。在進(jìn)行了一些具體化(即專門化)的工作之后,也許就應(yīng)該再次歸納了。對(duì)于某些類繼承來(lái)說(shuō),這是一個(gè)持續(xù)不斷的演化過(guò)程。9.8.3調(diào)整繼承關(guān)系2.為提高繼承程度而修改類定義

如果在一組相似的類中存在公共的屬性和公共的行為,則可以把這些公共的屬性和行為抽取出來(lái)放在一個(gè)共同的祖先類中,供其子類繼承。在對(duì)現(xiàn)有類進(jìn)行歸納的時(shí)候,要注意下述兩點(diǎn):①不能違背領(lǐng)域知識(shí)和常識(shí);②應(yīng)該確?,F(xiàn)有類的協(xié)議(即同外部世界的接口)不變。9.8.3調(diào)整繼承關(guān)系3.利用委托實(shí)現(xiàn)行為共享

僅當(dāng)存在真實(shí)的一般/特殊關(guān)系(即子類確實(shí)是父類的一種特殊形式)時(shí),利用繼承機(jī)制實(shí)現(xiàn)行為共享才是合理的。有時(shí)程序員只想用繼承作為實(shí)現(xiàn)操作共享的一種手段,并不打算確?;惡团缮惥哂邢嗤男袨椤T谶@種情況下,如果從基類繼承的操作中包含了子類不應(yīng)有的行為,則可能引起麻煩。9.8.3調(diào)整繼承關(guān)系9.9設(shè)計(jì)模式9.9.1相關(guān)概念一般而言,一個(gè)模式有四個(gè)基本要素:1.模式名稱(PatternName)2.問(wèn)題(Problem)3.解決方案(Solution)4.效果(Consequences)9.9.2描述設(shè)計(jì)模式模式名和分類意圖別名動(dòng)機(jī)適用性

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論