軟件工程導(dǎo)論第五章總體設(shè)計(jì)_第1頁(yè)
軟件工程導(dǎo)論第五章總體設(shè)計(jì)_第2頁(yè)
軟件工程導(dǎo)論第五章總體設(shè)計(jì)_第3頁(yè)
軟件工程導(dǎo)論第五章總體設(shè)計(jì)_第4頁(yè)
軟件工程導(dǎo)論第五章總體設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩109頁(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)介

軟件工程第5章總體設(shè)計(jì)1總體設(shè)計(jì)(概要設(shè)計(jì)或初步設(shè)計(jì))總體設(shè)計(jì)的基本目的就是回答下面這個(gè)問(wèn)題:“概括地說(shuō),系統(tǒng)應(yīng)該如何實(shí)現(xiàn)?”2總體設(shè)計(jì)首先尋找實(shí)現(xiàn)目標(biāo)系統(tǒng)的各種不同的方案(數(shù)據(jù)流圖是極好的出發(fā)點(diǎn))。分析員從這些供選擇的方案中選取若干個(gè)合理的方案,為每個(gè)合理的方案都準(zhǔn)備一份系統(tǒng)流程圖,列出組成系統(tǒng)的所有物理元素,進(jìn)行成本/效益分析,并且制定實(shí)現(xiàn)這個(gè)方案的進(jìn)度計(jì)劃。分析員從中選出一個(gè)最佳方案向用戶和使用部門(mén)負(fù)責(zé)人推薦。如果負(fù)責(zé)人接受了推薦的方案,分析員應(yīng)該進(jìn)一步為這個(gè)最佳方案設(shè)計(jì)軟件結(jié)構(gòu)。3總體設(shè)計(jì)的必要性可以站在全局高度上,花較少成本,從較抽象的層次上分析對(duì)比多種可能的系統(tǒng)實(shí)現(xiàn)方案和軟件結(jié)構(gòu);從中選出最佳方案和最合理的軟件結(jié)構(gòu),從而用較低成本開(kāi)發(fā)出較高質(zhì)量的軟件系統(tǒng)。45.1設(shè)計(jì)過(guò)程總體設(shè)計(jì)過(guò)程通常由兩個(gè)主要階段組成:系統(tǒng)設(shè)計(jì)階段:確定系統(tǒng)的具體實(shí)現(xiàn)方案;結(jié)構(gòu)設(shè)計(jì)階段:確定軟件結(jié)構(gòu)。5

1.設(shè)想供選擇的方案在總體設(shè)計(jì)階段分析員應(yīng)該考慮各種可能的實(shí)現(xiàn)方案,并且力求從中選出最佳方案。數(shù)據(jù)流圖是總體設(shè)計(jì)的極好的出發(fā)點(diǎn)。2.選取合理的方案通常至少選取低成本、中等成本和高成本的三種方案。對(duì)每個(gè)合理的方案分析員都應(yīng)該準(zhǔn)備下列4份資料:系統(tǒng)流程圖;組成系統(tǒng)的物理元素清單;成本/效益分析;實(shí)現(xiàn)這個(gè)系統(tǒng)的進(jìn)度計(jì)劃。典型的總體設(shè)計(jì)過(guò)程包括下述9個(gè)步驟63.推薦最佳方案綜合分析對(duì)比各種合理方案的利弊,推薦一個(gè)最佳的方案,并且為推薦的方案制定詳細(xì)的實(shí)現(xiàn)計(jì)劃。在使用部門(mén)的負(fù)責(zé)人也接受了分析員所推薦的方案之后,將進(jìn)入總體設(shè)計(jì)過(guò)程的下一個(gè)重要階段——結(jié)構(gòu)設(shè)計(jì)。74.功能分解為確定軟件結(jié)構(gòu),首先需要從實(shí)現(xiàn)角度把復(fù)雜的功能進(jìn)一步分解。結(jié)合算法描述仔細(xì)分析數(shù)據(jù)流圖中的每個(gè)處理,如果一個(gè)處理的功能過(guò)分復(fù)雜,必須把它的功能適當(dāng)?shù)胤纸獬梢幌盗斜容^簡(jiǎn)單的功能。85.設(shè)計(jì)軟件結(jié)構(gòu)

設(shè)計(jì)軟件的體系結(jié)構(gòu)需要在對(duì)需求分析階段生成的數(shù)據(jù)流圖進(jìn)一步分析和精化的基礎(chǔ)上:(1)將系統(tǒng)按照功能劃分為模塊;通常程序中的一個(gè)模塊完成一個(gè)適當(dāng)?shù)淖庸δ堋?/p>

(2)確定模塊之間的調(diào)用關(guān)系及其接口;應(yīng)該把模塊組織成良好的層次系統(tǒng)。

(3)對(duì)劃分的結(jié)果進(jìn)行優(yōu)化和調(diào)整。良好的軟件結(jié)構(gòu)設(shè)計(jì)對(duì)詳細(xì)設(shè)計(jì)及編碼階段的工作都是至關(guān)重要的。軟件結(jié)構(gòu)(即由模塊組成的層次系統(tǒng))可以用層次圖或結(jié)構(gòu)圖來(lái)描繪。如果數(shù)據(jù)流圖已經(jīng)細(xì)化到適當(dāng)?shù)膶哟?,則可以直接從數(shù)據(jù)流圖映射出軟件結(jié)構(gòu)。96.設(shè)計(jì)數(shù)據(jù)庫(kù)對(duì)于需要使用數(shù)據(jù)庫(kù)的那些應(yīng)用系統(tǒng),軟件工程師應(yīng)該在需求分析階段所確定的系統(tǒng)數(shù)據(jù)需求的基礎(chǔ)上,進(jìn)一步設(shè)計(jì)數(shù)據(jù)庫(kù)。7.制定測(cè)試計(jì)劃在軟件開(kāi)發(fā)的早期階段考慮測(cè)試問(wèn)題,能促使軟件設(shè)計(jì)人員在設(shè)計(jì)時(shí)注意提高軟件的可測(cè)試性。108.書(shū)寫(xiě)文檔應(yīng)該用正式的文檔記錄總體設(shè)計(jì)的結(jié)果,在這個(gè)階段應(yīng)該完成的文檔通常有下述幾種:系統(tǒng)說(shuō)明:數(shù)據(jù)流圖、成本/效益分析,用層次圖等描述的軟件構(gòu)件,用IPO圖簡(jiǎn)要描述各個(gè)模塊的算法,模塊的接口等。用戶手冊(cè):根據(jù)總體設(shè)計(jì)階段的結(jié)果,修改在需求階段產(chǎn)生的初步的用戶手冊(cè)。

測(cè)試計(jì)劃:包括測(cè)試策略、測(cè)試方案、預(yù)期的測(cè)試結(jié)果,測(cè)試進(jìn)度計(jì)劃等。詳細(xì)的實(shí)現(xiàn)計(jì)劃數(shù)據(jù)庫(kù)設(shè)計(jì)結(jié)果:由數(shù)據(jù)模型(E-R圖)轉(zhuǎn)換成數(shù)據(jù)庫(kù)的設(shè)計(jì)結(jié)果。119.審查和復(fù)審最后應(yīng)該對(duì)總體設(shè)計(jì)的結(jié)果進(jìn)行嚴(yán)格的技術(shù)審查,在技術(shù)審查通過(guò)之后再由使用部門(mén)的負(fù)責(zé)人從管理角度進(jìn)行復(fù)審。125.2設(shè)計(jì)原理5.2.1模塊化模塊化:把程序劃分成獨(dú)立命名且可獨(dú)立訪問(wèn)的模塊,每個(gè)模塊完成一個(gè)子功能,這些模塊集成起來(lái)構(gòu)成一個(gè)整體,可以完成指定的功能以滿足用戶的需求。模塊是由邊界元素限定的相鄰程序元素的序列,而且有一個(gè)總體標(biāo)識(shí)符代表它。模塊是構(gòu)成程序的基本構(gòu)件。過(guò)程、函數(shù)、子程序和宏等,都可作為模塊。面向?qū)ο蠓椒▽W(xué)中的對(duì)象是模塊,對(duì)象內(nèi)的方法(或稱為服務(wù))也是模塊。13模塊化的根據(jù)“各個(gè)擊破”的結(jié)論——把復(fù)雜的問(wèn)題分解成許多容易解決的小問(wèn)題,原來(lái)的問(wèn)題也就容易解決了。14首先,我們?cè)O(shè)C(x)為問(wèn)題x所對(duì)應(yīng)的復(fù)雜度函數(shù),E(x)為解決問(wèn)題x所需要的工作量函數(shù)。對(duì)于兩個(gè)問(wèn)題P1和P2,如果:

C(P1)>C(P2)

即問(wèn)題P1的復(fù)雜度比P2高,則顯然有:

E(P1)>E(P2)

即解決問(wèn)題P1比P2所需的工作量大。15在人們解決問(wèn)題的過(guò)程中,發(fā)現(xiàn)存在有另一個(gè)有趣的規(guī)律:C(P1+P2)>C(P1)+C(P2)即解決由多個(gè)問(wèn)題復(fù)合而成的大問(wèn)題的復(fù)雜度大于單獨(dú)解決各個(gè)問(wèn)題的復(fù)雜度之和。也就是說(shuō),對(duì)于一個(gè)復(fù)雜問(wèn)題,將其分解成多個(gè)小問(wèn)題分別解決比較容易。由此我們可以推出:E(P1+P2)>E(P1)+E(P2)即將復(fù)雜問(wèn)題分解成若干個(gè)小問(wèn)題,各個(gè)擊破,所需要的工作量小于直接解決復(fù)雜問(wèn)題所需的工作量。16模塊化的好處:

1、可以降低軟件開(kāi)發(fā)的難度;2、可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性;3、模塊化還有利于提高代碼的可重用性及團(tuán)隊(duì)合作開(kāi)發(fā)大型軟件的可行性。問(wèn)題:模塊是不是越多越好?17模塊化和軟件成本圖當(dāng)然不是!!雖然增加程序中的模塊數(shù)可以降低開(kāi)發(fā)每個(gè)模塊的工作量,但同時(shí)卻增加了設(shè)計(jì)模塊接口的工作量。通過(guò)圖5.1所示的模塊數(shù)與軟件開(kāi)發(fā)成本的關(guān)系圖中可以看出,當(dāng)劃分的模塊數(shù)處于最小成本區(qū)時(shí),開(kāi)發(fā)軟件的總成本最低。185.2.2抽象抽象:抽象是人類(lèi)在解決復(fù)雜問(wèn)題時(shí)經(jīng)常采用的一種思維方式,它是指將現(xiàn)實(shí)世界中具有共性的一類(lèi)事物的相似的、本質(zhì)的方面集中概括起來(lái),而暫時(shí)忽略它們之間的細(xì)節(jié)差異。結(jié)構(gòu)化程序中自頂向下、逐步求精的模塊劃分思想正是人類(lèi)思維中運(yùn)用抽象方法解決復(fù)雜問(wèn)題的體現(xiàn)。19軟件工程過(guò)程的每一步都是對(duì)軟件解法的抽象層次的精化:在可行性研究階段,軟件作為系統(tǒng)的一個(gè)完整部件;在需求分析期間,軟件解法是使用在問(wèn)題環(huán)境內(nèi)熟悉的方式描述的;當(dāng)由總體設(shè)計(jì)向詳細(xì)設(shè)計(jì)過(guò)渡時(shí),抽象的程度也就隨之減少;最后,當(dāng)源程序?qū)懗鰜?lái)以后,也就達(dá)到了抽象的最低層。205.2.3逐步求精定義:為了能集中精力解決主要問(wèn)題而盡量推遲對(duì)問(wèn)題細(xì)節(jié)的考慮。人類(lèi)的認(rèn)知過(guò)程遵守Miller法則:一個(gè)人在任何時(shí)候都只能把注意力集中在(7±2)個(gè)知識(shí)塊上。逐步求精確保每個(gè)問(wèn)題都將解決,而且每個(gè)問(wèn)題將在適當(dāng)?shù)臅r(shí)候被解決,在任何時(shí)候一個(gè)人都不需要同時(shí)處理7個(gè)以上的知識(shí)塊。21復(fù)習(xí)回顧:?jiǎn)栴}1

模塊化的好處?

1、可以降低軟件開(kāi)發(fā)的難度;2、可以使程序結(jié)構(gòu)清晰,增加易讀性和易修改性;3、模塊化還有利于提高代碼的可重用性及團(tuán)隊(duì)合作開(kāi)發(fā)大型軟件的可行性。221、降低了軟件開(kāi)發(fā)中每個(gè)階段的工作難度;2、簡(jiǎn)化了軟件的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程;3、有助于提高軟件的可讀性、可測(cè)試性和可維護(hù)性;4、在程序設(shè)計(jì)中運(yùn)用抽象的方法還能夠提高代碼的可重用性。復(fù)習(xí)回顧:?jiǎn)栴}2:采用自頂向下逐步求精、由抽象到具體的思維方式好處?23(1)信息隱藏:設(shè)計(jì)和確定模塊,使得一個(gè)模塊內(nèi)包含的信息(過(guò)程和數(shù)據(jù))對(duì)于不需要這些信息的模塊來(lái)說(shuō),是不能訪問(wèn)的。信息隱蔽的目的:主要是為了提高模塊的獨(dú)立性,減少將一個(gè)模塊中的錯(cuò)誤擴(kuò)散到其他模塊的機(jī)會(huì)。但是需要強(qiáng)調(diào)一點(diǎn),信息隱蔽并不意味著某個(gè)模塊中的內(nèi)部信息對(duì)其他模塊來(lái)說(shuō)是完全不可見(jiàn)或不能使用的,而是說(shuō)模塊之間的信息傳遞只能通過(guò)合法的調(diào)用接口來(lái)實(shí)現(xiàn)。顯然,信息隱蔽對(duì)提高軟件的可讀性和可維護(hù)性都是非常重要的。5.2.4信息隱藏和局部化

24(2)局部化:是指把一些關(guān)系密切的軟件元素物理地放得彼此靠近。如模塊中的局部數(shù)據(jù)元素是局部化的一個(gè)例子。局部化和信息隱藏概念是密切相關(guān)的,局部化有助于信息隱藏。25模塊的獨(dú)立性是指軟件系統(tǒng)中每個(gè)模塊只涉及軟件要求的具體的子功能,而和軟件系統(tǒng)中其他模塊的接口是簡(jiǎn)單的。耦合

內(nèi)聚

5.2.5模塊獨(dú)立不同模塊之間互連程度的度量。模塊功能強(qiáng)度的度量。模塊的獨(dú)立程度可以由兩個(gè)定性標(biāo)準(zhǔn)度量,這兩個(gè)標(biāo)準(zhǔn)分別稱為耦合和內(nèi)聚。26模塊獨(dú)立是模塊化、抽象、信息隱藏和局部化概念的直接結(jié)果。模塊的獨(dú)立性的優(yōu)點(diǎn):比較容易開(kāi)發(fā)出有效模塊化(即具有獨(dú)立的模塊)的軟件。獨(dú)立的模塊比較容易測(cè)試和維護(hù)。271)耦合性耦合性是對(duì)一個(gè)軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系緊密程度的度量指標(biāo)。決定耦合性高低的主要因素由于模塊間的聯(lián)系是通過(guò)模塊接口實(shí)現(xiàn)的,因此,模塊耦合性的高低主要取決于模塊接口的復(fù)雜程度、調(diào)用模塊的方式以及通過(guò)模塊接口的數(shù)據(jù)。模塊間的耦合性主要可劃分為如下幾種類(lèi)型。低數(shù)據(jù)耦合高耦合性控制耦合特征耦合公共耦合內(nèi)容耦合28

注意??!在軟件設(shè)計(jì)中應(yīng)該追求盡可能松散耦合的系統(tǒng)。否則影響系統(tǒng)的可理解性、可測(cè)性、可靠性和可維護(hù)性。29耦合程度強(qiáng)弱的區(qū)分無(wú)耦合:如果兩個(gè)模塊中的每一個(gè)都能獨(dú)立地工作而不需要另一個(gè)模塊的存在,那么它們彼此完全獨(dú)立,模塊間無(wú)任何連接。30

(2)數(shù)據(jù)耦合。若兩個(gè)模塊之間僅通過(guò)模塊參數(shù)交換信息,且交換的信息全部為簡(jiǎn)單數(shù)據(jù),則稱這種耦合為數(shù)據(jù)耦合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)據(jù)耦合。數(shù)據(jù)耦合的例子如下所示:int

sum(int

a,intb){intc;c=a+b;return(c);}main(){intx,y;

printf("x+y=%d",sum(x,y));}/*主函數(shù)與sum函數(shù)之間即為數(shù)據(jù)耦合關(guān)系*/…31

(3)控制耦合。若模塊之間交換的信息中包含有控制信息(盡管有時(shí)控制信息是以數(shù)據(jù)的形式出現(xiàn)的),則稱這種耦合為控制耦合??刂岂詈鲜侵械瘸潭鹊鸟詈希鼤?huì)增加程序的復(fù)雜性??刂岂詈系睦尤缦滤荆簐oidoutput(flag){if(flag)printf("OK!");elseprintf("NO!");}main(){intflag;output(flag);}/*主函數(shù)與output函數(shù)之間即為控制耦合關(guān)系*/A模塊flagf1Bf2fn……32(4)特征耦合:當(dāng)把整個(gè)數(shù)據(jù)結(jié)構(gòu)作為參數(shù)傳遞而被調(diào)用的模塊只需要使用其中一部分?jǐn)?shù)據(jù)元素。int

sum(struc

stu){int

c,a,b;a=stu.math;b=stu.english;c=a+b;return(c);}main(){intx,y;

strucstudentstu={“Tom”,18,97,95}

printf(“總分=%d",sum(stu));}/*主函數(shù)與sum函數(shù)之間即為特征耦合關(guān)系*/…structstudent{charname[20];

intage;

intmath;

int

english;}; 33(5)公共環(huán)境耦合。若兩個(gè)或多個(gè)模塊通過(guò)引用公共數(shù)據(jù)相互聯(lián)系,則稱這種耦合為公共耦合。例如,在程序中定義了全局變量,并在多個(gè)模塊中對(duì)全局變量進(jìn)行了引用,則引用全局變量的多個(gè)模塊間就具有了公共耦合關(guān)系。全局?jǐn)?shù)據(jù)區(qū)ABCDEFB、C、E

為公共耦合34(6)內(nèi)容耦合:一個(gè)模塊訪問(wèn)另一個(gè)模塊的內(nèi)部數(shù)據(jù);一個(gè)模塊不通過(guò)正常入口而轉(zhuǎn)到另一個(gè)模塊的內(nèi)部;兩個(gè)模塊有一部分程序代碼重疊;一個(gè)模塊有多個(gè)入口(這意味著一個(gè)模塊有幾種功能)。最不希望要的耦合??!35耦合采取下述設(shè)計(jì)原則耦合是影響軟件復(fù)雜程度的一個(gè)重要因素。應(yīng)該采取下述設(shè)計(jì)原則:盡量使用數(shù)據(jù)耦合,少用控制耦合和特征耦合,限制公共環(huán)境耦合的范圍,完全不用內(nèi)容耦合。36課堂練習(xí):兩個(gè)模塊都是用同一張數(shù)據(jù)表,這種耦合屬于()

A.數(shù)據(jù)耦合 B.控制耦合

C.公共環(huán)境耦合 D.內(nèi)容耦合37課堂思考:請(qǐng)問(wèn)如何將下面的控制耦合轉(zhuǎn)變成數(shù)據(jù)耦合?A模塊flagf1Bf2fn……A模塊…f1f2fn……flag數(shù)據(jù)耦合控制耦合38內(nèi)聚

內(nèi)聚標(biāo)志一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,它是信息隱藏和局部化概念的自然擴(kuò)展。理想內(nèi)聚的模塊只做一件事情!設(shè)計(jì)時(shí)應(yīng)該力求做到高內(nèi)聚,通常中等程度的內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差不多;不要使用低內(nèi)聚。39內(nèi)聚內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往往意味著模塊間的松耦合。內(nèi)聚和耦合都是進(jìn)行模塊化設(shè)計(jì)的有力工具。經(jīng)實(shí)踐證明,保證模塊的高內(nèi)聚性比低耦合性更為重要,在軟件設(shè)計(jì)時(shí)應(yīng)將更多的注意力集中在提高模塊的內(nèi)聚性上。模塊的內(nèi)聚性主要可劃分為如下幾種不同的類(lèi)型。40低內(nèi)聚偶然內(nèi)聚:如果一個(gè)模塊完成一組任務(wù),這些任務(wù)彼此間即使有關(guān)系,關(guān)系也是很松散的。邏輯內(nèi)聚:一個(gè)模塊完成的任務(wù)在邏輯上屬于相同或相似的一類(lèi)。時(shí)間內(nèi)聚:一個(gè)模塊包含的任務(wù)必須在同一段時(shí)間內(nèi)執(zhí)行。調(diào)用模塊判定讀一個(gè)記錄寫(xiě)一個(gè)記錄被調(diào)用模塊邏輯內(nèi)聚41中內(nèi)聚過(guò)程內(nèi)聚一個(gè)模塊內(nèi)的處理元素是相關(guān)的,而且必須以特定次序執(zhí)行。通信內(nèi)聚模塊中所有元素都使用同一個(gè)輸入數(shù)據(jù)和(或)產(chǎn)生同一個(gè)輸出數(shù)據(jù)。42高內(nèi)聚順序內(nèi)聚一個(gè)模塊內(nèi)的處理元素和同一個(gè)功能密切相關(guān),而且這些處理必須順序執(zhí)行(通常一個(gè)處理元素的輸出數(shù)據(jù)作為下一個(gè)處理元素的輸入數(shù)據(jù))。功能內(nèi)聚模塊內(nèi)所有處理元素屬于一個(gè)整體,完成一個(gè)單一的功能。43上述七種內(nèi)聚的優(yōu)劣評(píng)分(分值越高,內(nèi)聚程度越好),將得到如下結(jié)果:功能內(nèi)聚 10分 時(shí)間內(nèi)聚 3分順序內(nèi)聚 9分 邏輯內(nèi)聚 1分通信內(nèi)聚 7分 偶然內(nèi)聚 0分過(guò)程內(nèi)聚 5分低功能內(nèi)聚順序內(nèi)聚通信內(nèi)聚過(guò)程內(nèi)聚時(shí)間內(nèi)聚邏輯內(nèi)聚耦然內(nèi)聚高強(qiáng)弱

內(nèi)聚性模塊獨(dú)立性44人們?cè)陂_(kāi)發(fā)計(jì)算機(jī)軟件的長(zhǎng)期實(shí)踐中積累了豐富的經(jīng)驗(yàn),總結(jié)這些經(jīng)驗(yàn)得出了一些啟發(fā)式規(guī)則。往往能幫助他們找到改進(jìn)軟件設(shè)計(jì)提高軟件質(zhì)量的途徑。體系結(jié)構(gòu)設(shè)計(jì)的啟發(fā)規(guī)則有如下7點(diǎn)。5.3啟發(fā)規(guī)則451.改進(jìn)軟件結(jié)構(gòu),提高模塊獨(dú)立性設(shè)計(jì)出軟件的初步結(jié)構(gòu)以后,應(yīng)該審查分析這個(gè)結(jié)構(gòu),通過(guò)模塊分解或合并,力求降低耦合提高內(nèi)聚。例如,多個(gè)模塊公有的一個(gè)子功能可以獨(dú)立成一個(gè)模塊,由這些模塊調(diào)用;有時(shí)可以通過(guò)分解或合并模塊以減少控制信息的傳遞及對(duì)全程數(shù)據(jù)的引用,并且降低接口的復(fù)雜程度。462.模塊規(guī)模應(yīng)該適中經(jīng)驗(yàn)表明,一個(gè)模塊的規(guī)模不應(yīng)過(guò)大,最好能寫(xiě)在一頁(yè)紙內(nèi)(通常不超過(guò)60行語(yǔ)句)。473.深度、寬度、扇出和扇入都應(yīng)適當(dāng)軟件結(jié)構(gòu)中的深度和寬度不宜過(guò)大!!(1)深度:表示軟件結(jié)構(gòu)中控制的層數(shù),它往往能粗略地標(biāo)志一個(gè)系統(tǒng)的大小和復(fù)雜程度。如果層數(shù)過(guò)多則應(yīng)該考慮是否有許多管理模塊過(guò)分簡(jiǎn)單了,能否適當(dāng)合并。(2)寬度:是軟件結(jié)構(gòu)內(nèi)同一個(gè)層次上的模塊總數(shù)的最大值。一般說(shuō)來(lái),寬度越大系統(tǒng)越復(fù)雜。對(duì)寬度影響最大的因素是模塊的扇出。48如下圖所示的軟件結(jié)構(gòu)圖中,深度為5,寬度為8。影響深度的因素:深度在程序中表現(xiàn)為模塊的嵌套調(diào)用,嵌套的層數(shù)越多,程序就越復(fù)雜,程序的可理解性也就隨之下降。深度過(guò)大可通過(guò)將結(jié)構(gòu)中過(guò)于簡(jiǎn)單的模塊分層與上一級(jí)模塊合并來(lái)解決;影響寬度的因素:對(duì)寬度影響最大的因素是模塊的扇出,即模塊可以調(diào)用的下級(jí)模塊數(shù)越多,軟件結(jié)構(gòu)的寬度就越大。而寬度過(guò)大則可通過(guò)增加中間層來(lái)解決。顯然,軟件結(jié)構(gòu)中的深度和寬度是相互對(duì)立的兩個(gè)方面,降低深度會(huì)引起寬度的增加,而降低寬度又會(huì)帶來(lái)深度的增加。49(3)扇出:是一個(gè)模塊直接控制(調(diào)用)的模塊數(shù)目。扇出過(guò)大:意味著模塊過(guò)分復(fù)雜,需要控制和協(xié)調(diào)過(guò)多的下級(jí)模塊,應(yīng)該適當(dāng)增加中間層次的控制模塊。扇出過(guò)小:(例如總是1)也不好,可以把下級(jí)模塊進(jìn)一步分解成若干個(gè)子功能模塊,或者合并到它的上級(jí)模塊中去。經(jīng)驗(yàn)表明,一個(gè)設(shè)計(jì)得好的典型系統(tǒng)的平均扇出通常是3或4。分解模塊或合并模塊必須符合問(wèn)題結(jié)構(gòu),不能違背模塊獨(dú)立原理。50(4)扇入:一個(gè)模塊的扇入表明有多少個(gè)上級(jí)模塊直接調(diào)用它。扇入越大則共享該模塊的上級(jí)模塊數(shù)目越多,這是有好處的,但是,不能違背模塊獨(dú)立原理單純追求高扇入。觀察大量軟件系統(tǒng)后發(fā)現(xiàn),設(shè)計(jì)得很好的軟件結(jié)構(gòu)通常頂層扇出比較高,中層扇出較少,底層模塊有高扇入。51圖5.5模塊的扇入和扇出(a)扇入;(b)扇出52三種情形需要關(guān)注:

若模塊的扇入越大,則說(shuō)明共享該模塊的上級(jí)模塊數(shù)越多,或者說(shuō)該模塊在程序中的重用性越高,這正是程序設(shè)計(jì)所追求的目標(biāo)之一。(類(lèi)似重構(gòu)里的方法抽取)

若模塊的扇出若過(guò)大,如在一個(gè)模塊中要調(diào)用八個(gè)下級(jí)模塊,則會(huì)使該模塊的調(diào)用控制過(guò)于復(fù)雜。這種現(xiàn)象發(fā)生的原因通常都是由于設(shè)計(jì)階段,模塊細(xì)化的過(guò)程中,分解速度過(guò)快造成的。最常見(jiàn)的解決辦法是通過(guò)在此模塊和下級(jí)模塊間增加一個(gè)中間層來(lái)控制模塊分解的速度。

若模塊的扇出過(guò)小,如扇出為1(下級(jí)模塊層中只有一個(gè)模塊),在系統(tǒng)設(shè)計(jì)中通常是不可取的。常見(jiàn)的解決方法是考慮將其合并到上級(jí)模塊中。但若合并會(huì)影響模塊的獨(dú)立性,則將其保留下來(lái)也未嘗不可。根據(jù)實(shí)踐經(jīng)驗(yàn),設(shè)計(jì)良好的典型系統(tǒng)中,模塊的平均扇出通常為3或4。

53圖5.6軟件結(jié)構(gòu)圖示例經(jīng)過(guò)對(duì)大量軟件系統(tǒng)的研究后發(fā)現(xiàn),在設(shè)計(jì)良好的軟件結(jié)構(gòu)中,通常頂層的扇出數(shù)較大,中間層的扇出數(shù)較小,底層的扇入數(shù)較大,如圖5.6所示544.模塊的作用域應(yīng)該在控制域之內(nèi)(1)模塊的作用域:受該模塊內(nèi)一個(gè)判定影響的所有模塊的集合。在一個(gè)設(shè)計(jì)得很好的系統(tǒng)中,所有受判定影響的模塊應(yīng)該都從屬于做出判定的那個(gè)模塊,最好局限于做出判定的那個(gè)模塊本身及它的直屬下級(jí)模塊。否則軟件難以理解,并可能出現(xiàn)控制耦合。(2)模塊的控制域:這個(gè)模塊本身以及所有直接或間接從屬于它的模塊的集合。

55圖5.2模塊的作用域和控制域模塊A的控制域是A、B、C、D、E、F模塊的集合。要實(shí)現(xiàn)作用域是控制域的子集,需要修改軟件結(jié)構(gòu),如判定從A移到M或?qū)移到A下。若模塊A做出的判定影響G,會(huì)出現(xiàn)什么問(wèn)題?565.力爭(zhēng)降低模塊接口的復(fù)雜程度模塊接口復(fù)雜是軟件發(fā)生錯(cuò)誤的一個(gè)主要原因。應(yīng)該仔細(xì)設(shè)計(jì)模塊接口,使得信息傳遞簡(jiǎn)單并且和模塊的功能一致。如:quad_root(TBL,X)是求一元二次方程根的模塊,其中數(shù)組TBL傳送方程的系數(shù),用數(shù)組X來(lái)傳回求得的根。不利于于理解和維護(hù),而且開(kāi)發(fā)期也易發(fā)生錯(cuò)誤。改成quad_root(a,b,c,root1,root2)簡(jiǎn)單接口。576.設(shè)計(jì)單入口單出口的模塊不要使模塊間出現(xiàn)內(nèi)容耦合。當(dāng)從頂部進(jìn)入模塊并且從底部退出來(lái)時(shí),軟件是比較容易理解的,因此也是比較容易維護(hù)的。587.模塊功能應(yīng)該可以預(yù)測(cè)如果一個(gè)模塊可以當(dāng)做一個(gè)黑盒子,也就是說(shuō),只要輸入的數(shù)據(jù)相同就產(chǎn)生同樣的輸出,這個(gè)模塊的功能就是可以預(yù)測(cè)的。以上列出的7條啟發(fā)式規(guī)則多數(shù)是經(jīng)驗(yàn)規(guī)律,對(duì)改進(jìn)設(shè)計(jì),提高軟件質(zhì)量,往往有重要的參考價(jià)值。59(1)層次圖用來(lái)描繪軟件的層次結(jié)構(gòu),很適于在自頂向下設(shè)計(jì)軟件的過(guò)程中使用。層次圖中的一個(gè)矩形框代表一個(gè)模塊,方框間的連線表示調(diào)用關(guān)系。層次方框圖方框間的連線表示組成關(guān)系。(P68)5.4描繪軟件結(jié)構(gòu)的圖形工具

5.4.1層次圖和HIPO圖60圖5.3正文加工系統(tǒng)的層次圖61領(lǐng)導(dǎo)層輔助決策系統(tǒng)查詢輔助決策物資信息重點(diǎn)供料信息商情信息人員狀況合同監(jiān)視財(cái)務(wù)信息計(jì)劃執(zhí)行情況工程進(jìn)展情況超儲(chǔ)低儲(chǔ)情況經(jīng)營(yíng)指標(biāo)歷年對(duì)比價(jià)格預(yù)測(cè)物資用量預(yù)測(cè)庫(kù)存定額核定庫(kù)存結(jié)構(gòu)分析經(jīng)濟(jì)采購(gòu)批量保本保利分析626364層次圖很適于在自頂向下設(shè)計(jì)軟件的過(guò)程中使用。(2)帶編號(hào)的層次圖:HIPO圖(層次圖加輸入/處理/輸出圖”的英文縮寫(xiě))。為了能使層次圖具有可追蹤性,除了最頂層的方框之外,每個(gè)方框都加了編號(hào),稱為HIPO圖。65圖5.4帶編號(hào)的層次圖(H圖)666768圖5.3工資計(jì)算系統(tǒng)的H圖每一個(gè)矩形框代表一個(gè)模塊,圖中最頂層的矩形框表示系統(tǒng)中的主控模塊,矩形框之間的連線用于表示模塊之間的調(diào)用關(guān)系。適用于自頂向下進(jìn)行分解的軟件結(jié)構(gòu)設(shè)計(jì)方法。69結(jié)構(gòu)圖中一個(gè)方框代表一個(gè)模塊,框內(nèi)注明模塊的名字或主要功能。方框之間的箭頭(或直線)表示模塊的調(diào)用關(guān)系。位于上方的方框代表的模塊調(diào)用下方的模塊。5.4.2結(jié)構(gòu)圖(用于描繪軟件結(jié)構(gòu))70表5.1結(jié)構(gòu)圖中的基本符號(hào)ABCABC符號(hào)含義用于表示模塊,方框中標(biāo)明模塊的名稱用于描述模塊之間的調(diào)用關(guān)系用于表示模塊調(diào)用過(guò)程中傳遞的信息,箭頭上標(biāo)明信息的名稱;箭頭尾部為空心圓表示傳遞的信息是數(shù)據(jù),若為實(shí)心圓則表示傳遞的是控制信息

表示模塊A選擇調(diào)用模塊B或模塊C.判定為真時(shí)調(diào)用B,為假時(shí)調(diào)用C表示模塊A循環(huán)調(diào)用模塊B和模塊C71圖5.5結(jié)構(gòu)圖的例子——產(chǎn)生最佳解的一般結(jié)構(gòu)尾部是空心圓表示傳遞的是數(shù)據(jù)。實(shí)心圓表示傳遞的是控制信息。72結(jié)構(gòu)圖可以作為檢查設(shè)計(jì)正確性和評(píng)價(jià)模塊獨(dú)立性的好方法:傳送的每個(gè)數(shù)據(jù)元素都是完成模塊功能所必須的嗎?完成模塊功能必須的每個(gè)數(shù)據(jù)元素都傳送來(lái)了嗎?所有數(shù)據(jù)元素都只和單一的功能有關(guān)嗎?如果發(fā)現(xiàn)結(jié)構(gòu)圖上模塊間的聯(lián)系不容易解釋,則應(yīng)該考慮是否設(shè)計(jì)上有問(wèn)題。73面向數(shù)據(jù)流的設(shè)計(jì)方法定義了一些不同的“映射”,利用這些映射可以把數(shù)據(jù)流圖變換成軟件結(jié)構(gòu)。因?yàn)槿魏诬浖到y(tǒng)都可以用數(shù)據(jù)流圖表示,所以面向數(shù)據(jù)流的設(shè)計(jì)方法理論上可以設(shè)計(jì)任何軟件的結(jié)構(gòu)。通常所說(shuō)的結(jié)構(gòu)化設(shè)計(jì)方法(簡(jiǎn)稱SD方法),也就是基于數(shù)據(jù)流的設(shè)計(jì)方法。5.5面向數(shù)據(jù)流的設(shè)計(jì)方法74面向數(shù)據(jù)流的設(shè)計(jì)方法把信息流映射成軟件結(jié)構(gòu)。信息流有變換流和事務(wù)流兩種類(lèi)型。1.變換流信息沿輸入通路進(jìn)入系統(tǒng),同時(shí)由外部形式變換成內(nèi)部形式;進(jìn)入系統(tǒng)的信息通過(guò)變換中心,經(jīng)加工處理;再沿輸出通路變換成外部形式離開(kāi)軟件系統(tǒng)。5.5.1概念75圖5.8變換流762.事務(wù)流數(shù)據(jù)沿輸入通路到達(dá)一個(gè)處理T(事務(wù)中心),處理T根據(jù)輸入數(shù)據(jù)的類(lèi)型在若干個(gè)動(dòng)作序列中選出一個(gè)來(lái)執(zhí)行,稱為事務(wù)流。77圖5.9事務(wù)流處理T稱為事務(wù)中心,它完成下述任務(wù):接收輸入數(shù)據(jù)(事務(wù));(2)分析每個(gè)事務(wù)以確定它的類(lèi)型;(3)根據(jù)事務(wù)類(lèi)型選取一條活動(dòng)通路。78圖5.10面向數(shù)據(jù)流方法的設(shè)計(jì)過(guò)程圖5.10說(shuō)明了使用面向數(shù)據(jù)流方法逐步設(shè)計(jì)的一般過(guò)程。3.設(shè)計(jì)過(guò)程79變換分析是一系列設(shè)計(jì)步驟的總稱,經(jīng)過(guò)這些步驟把具有變換流特點(diǎn)的數(shù)據(jù)流圖按預(yù)先確定的模式映射成軟件結(jié)構(gòu)。1.例子在設(shè)計(jì)汽車(chē)數(shù)字儀表板時(shí),將軟件做在只讀存儲(chǔ)器中,成為設(shè)備的一部分,從而使設(shè)備具有某些“智能”。進(jìn)行面向數(shù)據(jù)流的變換分析示例。5.5.2變換分析80假設(shè)的儀表板將完成下述功能:(1)通過(guò)模數(shù)轉(zhuǎn)換實(shí)現(xiàn)傳感器和微處理機(jī)接口;(2)在發(fā)光二極管面板上顯示數(shù)據(jù);(3)指示每小時(shí)英里數(shù)(mph),行駛的里程,每加侖油行駛的英里數(shù)(mpg)等等;(4)指示加速或減速;(5)超速警告:如果車(chē)速超過(guò)55英里/小時(shí),則發(fā)出超速警告鈴聲。在軟件需求分析階段應(yīng)該建立起必要的文檔資料,特別是數(shù)據(jù)流圖。812.設(shè)計(jì)步驟(開(kāi)發(fā)給軟件的整體表示,即軟件結(jié)構(gòu))第1步復(fù)查基本系統(tǒng)模型。復(fù)查的目的是確保系統(tǒng)的輸入數(shù)據(jù)和輸出數(shù)據(jù)符合實(shí)際。第2步復(fù)查并精化數(shù)據(jù)流圖。確保數(shù)據(jù)流圖給出了目標(biāo)系統(tǒng)的正確的邏輯模型,并且應(yīng)該使數(shù)據(jù)流圖中每個(gè)處理都代表一個(gè)規(guī)模適中相對(duì)獨(dú)立的子功能。在需求分析階段產(chǎn)生的數(shù)字儀表板系統(tǒng)的數(shù)據(jù)流圖如圖5.11所示。82圖5.11數(shù)字儀表板系統(tǒng)的數(shù)據(jù)流圖83第3步

確定數(shù)據(jù)流圖具有變換特性還是事務(wù)特性。從圖5.11看出,數(shù)據(jù)沿著兩條輸入通路進(jìn)入系統(tǒng),然后沿著5條通路離開(kāi),沒(méi)有明顯的事務(wù)中心。因此可以認(rèn)為這個(gè)信息流具有變換流的總特征。84第4步確定輸入流和輸出流的邊界,從而孤立出變換中心。輸入流和輸出流的邊界和對(duì)它們的解釋有關(guān),也就是說(shuō),不同的設(shè)計(jì)人員可能會(huì)在流內(nèi)選取稍微不同的點(diǎn)作為邊界的位置。85圖5.12具有邊界的數(shù)據(jù)流圖輸入通路變換中心輸出通路86第5步完成“第一級(jí)分解”。軟件結(jié)構(gòu)代表對(duì)控制的自頂向下的分配,所謂分解就是分配控制的過(guò)程。對(duì)于變換流的情況,數(shù)據(jù)流圖被映射成一個(gè)特殊的軟件結(jié)構(gòu),這個(gè)結(jié)構(gòu)控制輸入、變換和輸出等信息處理過(guò)程。87圖5.13第一級(jí)分解的方法控制模塊Cm協(xié)調(diào)下述從屬的控制功能輸入信息處理控制模塊Ca,協(xié)調(diào)對(duì)所有輸入數(shù)據(jù)的接收變換中心控制模塊Ct,管理對(duì)內(nèi)部形式的數(shù)據(jù)的所有操作輸出信息處理控制模塊Ce,協(xié)調(diào)輸出信息的產(chǎn)生過(guò)程88圖5.14數(shù)字儀表板系統(tǒng)的第一級(jí)分解89第6步完成“第二級(jí)分解”。把數(shù)據(jù)流圖中的每個(gè)處理映射成軟件結(jié)構(gòu)中一個(gè)適當(dāng)?shù)哪K。圖5.15表示進(jìn)行第二級(jí)分解的普遍途徑。90圖5.15第二級(jí)分解的方法從變換中心的邊界開(kāi)始沿著輸入通路向外移動(dòng),把輸入通路中每個(gè)處理映射成軟件結(jié)構(gòu)中Ca控制下的一個(gè)低層模塊。91圖5.12具有邊界的數(shù)據(jù)流圖輸入通路獲取輸入結(jié)構(gòu)從變換中心的邊界開(kāi)始沿著輸入通路向外移動(dòng),把輸入通路中每個(gè)處理映射成軟件結(jié)構(gòu)中Ca控制下的一個(gè)低層模塊。92圖5.16未經(jīng)精化的輸入結(jié)構(gòu)從變換中心的邊界開(kāi)始沿著輸入通路向外移動(dòng),把輸入通路中每個(gè)處理映射成軟件結(jié)構(gòu)中Ca控制下的一個(gè)低層模塊。93圖5.12具有邊界的數(shù)據(jù)流圖變換中心把變換中心內(nèi)的每個(gè)處理映射成受Ct控制的一個(gè)模塊獲取變換結(jié)構(gòu)94圖5.17未經(jīng)精化的變換結(jié)構(gòu)把變換中心內(nèi)的每個(gè)處理映射成受Ct控制的一個(gè)模塊95圖5.12具有邊界的數(shù)據(jù)流圖輸出通路沿輸出通路向外移動(dòng),把輸出通路中每個(gè)處理映射成直接或間接受模塊Ce控制的一個(gè)低層模塊獲取輸出結(jié)構(gòu)96圖5.18未經(jīng)精化的輸出結(jié)構(gòu)沿輸出通路向外移動(dòng),把輸出通路中每個(gè)處理映射成直接或間接受模塊Ce控制的一個(gè)低層模塊97。第7步使用設(shè)計(jì)度量和啟發(fā)式規(guī)則對(duì)第一次分割得到的軟件結(jié)構(gòu)進(jìn)一步精化。98為了得到一個(gè)易于實(shí)現(xiàn)、易于測(cè)試和易于維護(hù)的軟件結(jié)構(gòu),應(yīng)該對(duì)初步分割得到的模塊進(jìn)行再分解或合并。具體到數(shù)字儀表板的例子,可做如下某些可能的修改:(1)輸入結(jié)構(gòu)中的模塊“轉(zhuǎn)換成rpm”和“收集sps”可以合并;(2)模塊“確定加速/減速”可以放在模塊“計(jì)算mph”下面,以減少耦合;(3)模塊“加速/減速顯示”可以相應(yīng)地放在模塊

溫馨提示

  • 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)論