




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 軟件工程軟件工程 第第5章章 總體設(shè)計總體設(shè)計 2 總體設(shè)計總體設(shè)計(概要設(shè)計或初步設(shè)計概要設(shè)計或初步設(shè)計) n總體設(shè)計的基本目的就是回答下面這個問題: “概括地說,系統(tǒng)應(yīng)該如何實現(xiàn)?” 3 總體設(shè)計總體設(shè)計 n首先尋找實現(xiàn)目標(biāo)系統(tǒng)的各種不同的方案(數(shù)據(jù)流圖是極好 的出發(fā)點)。 n分析員從這些供選擇的方案中選取若干個合理的方案,為每 個合理的方案都準(zhǔn)備一份系統(tǒng)流程圖,列出組成系統(tǒng)的所有 物理元素,進行成本/效益分析,并且制定實現(xiàn)這個方案的 進度計劃。 n分析員從中選出一個最佳方案向用戶和使用部門負(fù)責(zé)人推薦。 n如果負(fù)責(zé)人接受了推薦的方案,分析員應(yīng)該進一步為這個最 佳方案設(shè)計軟件結(jié)構(gòu)。 4
2、總體設(shè)計的必要性總體設(shè)計的必要性 n可以站在全局高度上,花較少成本,從較抽 象的層次上分析對比多種可能的系統(tǒng)實現(xiàn)方 案和軟件結(jié)構(gòu); n從中選出最佳方案和最合理的軟件結(jié)構(gòu),從 而用較低成本開發(fā)出較高質(zhì)量的軟件系統(tǒng)。 5 5.1 設(shè)計過程設(shè)計過程 n總體設(shè)計過程通常由兩個主要階段組成: 系統(tǒng)設(shè)計階段:確定系統(tǒng)的具體實現(xiàn)方案; 結(jié)構(gòu)設(shè)計階段:確定軟件結(jié)構(gòu)。 6 n 1. 設(shè)想供選擇的方案 在總體設(shè)計階段分析員應(yīng)該考慮各種可能的實現(xiàn) 方案,并且力求從中選出最佳方案。 數(shù)據(jù)流圖是總體設(shè)計的極好的出發(fā)點。 2. 選取合理的方案 通常至少選取低成本、中等成本和高成本的三種 方案。 對每個合理的方案分析員都應(yīng)
3、該準(zhǔn)備下列4份資 料:系統(tǒng)流程圖;組成系統(tǒng)的物理元素清單;成 本/效益分析;實現(xiàn)這個系統(tǒng)的進度計劃。 典型的總體設(shè)計過程包括下述9個步驟 7 3. 推薦最佳方案 綜合分析對比各種合理方案的利弊,推薦 一個最佳的方案,并且為推薦的方案制定 詳細(xì)的實現(xiàn)計劃。 在使用部門的負(fù)責(zé)人也接受了分析員所推 薦的方案之后,將進入總體設(shè)計過程的下 一個重要階段結(jié)構(gòu)設(shè)計。 8 4.功能分解 為確定軟件結(jié)構(gòu),首先需要從實現(xiàn)角度把 復(fù)雜的功能進一步分解。結(jié)合算法描述仔 細(xì)分析數(shù)據(jù)流圖中的每個處理,如果一個 處理的功能過分復(fù)雜,必須把它的功能適 當(dāng)?shù)胤纸獬梢幌盗斜容^簡單的功能。 9 5. 設(shè)計軟件結(jié)構(gòu) 設(shè)計軟件的體系結(jié)
4、構(gòu)需要在對需求分析階段生成的數(shù)據(jù)流圖進一步分 析和精化的基礎(chǔ)上: (1)將系統(tǒng)按照功能劃分為模塊;通常程序中的一個模塊完成一個適當(dāng) 的子功能。 (2)確定模塊之間的調(diào)用關(guān)系及其接口;應(yīng)該把模塊組織成良好的層次 系統(tǒng)。 (3)對劃分的結(jié)果進行優(yōu)化和調(diào)整。良好的軟件結(jié)構(gòu)設(shè)計對詳細(xì)設(shè)計及 編碼階段的工作都是至關(guān)重要的。 軟件結(jié)構(gòu)(即由模塊組成的層次系統(tǒng))可以用層次圖或結(jié)構(gòu)圖來描繪。 如果數(shù)據(jù)流圖已經(jīng)細(xì)化到適當(dāng)?shù)膶哟危瑒t可以直接從數(shù)據(jù)流圖映射出軟 件結(jié)構(gòu)。 10 6. 設(shè)計數(shù)據(jù)庫 對于需要使用數(shù)據(jù)庫的那些應(yīng)用系統(tǒng),軟件工程 師應(yīng)該在需求分析階段所確定的系統(tǒng)數(shù)據(jù)需求的 基礎(chǔ)上,進一步設(shè)計數(shù)據(jù)庫。 7.
5、制定測試計劃 在軟件開發(fā)的早期階段考慮測試問題,能促使軟 件設(shè)計人員在設(shè)計時注意提高軟件的可測試性。 11 8. 書寫文檔 應(yīng)該用正式的文檔記錄總體設(shè)計的結(jié)果,在這個階段應(yīng)該 完成的文檔通常有下述幾種: 系統(tǒng)說明:數(shù)據(jù)流圖、成本/效益分析,用層次圖等描述的 軟件構(gòu)件,用IPO圖簡要描述各個模塊的算法,模塊的接 口等。 用戶手冊:根據(jù)總體設(shè)計階段的結(jié)果,修改在需求階段產(chǎn) 生的初步的用戶手冊。 測試計劃:包括測試策略、測試方案、預(yù)期的測試結(jié)果, 測試進度計劃等。 詳細(xì)的實現(xiàn)計劃 數(shù)據(jù)庫設(shè)計結(jié)果:由數(shù)據(jù)模型(E-R圖)轉(zhuǎn)換成數(shù)據(jù)庫的設(shè)計 結(jié)果。 12 9. 審查和復(fù)審 最后應(yīng)該對總體設(shè)計的結(jié)果進行嚴(yán)
6、格的技術(shù)審查, 在技術(shù)審查通過之后再由使用部門的負(fù)責(zé)人從管 理角度進行復(fù)審。 13 5.2 設(shè)計原理設(shè)計原理 n5.2.1 模塊化 模塊化:把程序劃分成獨立命名且可獨立訪問的模塊,每個 模塊完成一個子功能,這些模塊集成起來構(gòu)成一個整體,可 以完成指定的功能以滿足用戶的需求。 模塊是由邊界元素限定的相鄰程序元素的序列,而且有一個 總體標(biāo)識符代表它。模塊是構(gòu)成程序的基本構(gòu)件。 過程、函數(shù)、子程序和宏等,都可作為模塊。 面向?qū)ο蠓椒▽W(xué)中的對象是模塊,對象內(nèi)的方法(或稱為服 務(wù))也是模塊。 14 模塊化的根據(jù)模塊化的根據(jù) “各個擊破”的結(jié)論把復(fù)雜的問題分解成許多 容易解決的小問題,原來的問題也就容易解
7、決了。 15 n首先,我們設(shè)C(x)為問題x所對應(yīng)的復(fù)雜度函數(shù),E(x) 為解決問題x所需要的工作量函數(shù)。對于兩個問題P1和 P2,如果: n C(P1) C(P2) n 即問題P1的復(fù)雜度比P2高,則顯然有: n E(P1) E(P2) n 即解決問題P1比P2所需的工作量大。 16 在人們解決問題的過程中,發(fā)現(xiàn)存在有另一個有趣的規(guī)律: C(P1+P2) C(P1)+C(P2) 即解決由多個問題復(fù)合而成的大問題的復(fù)雜度大于單獨解決 各個問題的復(fù)雜度之和。也就是說,對于一個復(fù)雜問題,將 其分解成多個小問題分別解決比較容易。由此我們可以推出: E(P1+P2) E(P1)+E(P2) 即將復(fù)雜問
8、題分解成若干個小問題,各個擊破,所需要的工 作量小于直接解決復(fù)雜問題所需的工作量。 17 模塊化的好處: 1、可以降低軟件開發(fā)的難度; 、可以使程序結(jié)構(gòu)清晰,增加易讀性和 易修改性; 、模塊化還有利于提高代碼的可重用性 及團隊合作開發(fā)大型軟件的可行性。 18 模塊化和軟件成本圖模塊化和軟件成本圖 當(dāng)然不是!雖然 增加程序中的模塊 數(shù)可以降低開發(fā)每 個模塊的工作量, 但同時卻增加了設(shè) 計模塊接口的工作 量。通過圖5.1所 示的模塊數(shù)與軟件 開發(fā)成本的關(guān)系圖 中可以看出,當(dāng)劃當(dāng)劃 分的模塊數(shù)處于最分的模塊數(shù)處于最 小成本區(qū)時,開發(fā)小成本區(qū)時,開發(fā) 軟件的總成本最低。軟件的總成本最低。 19 5.2
9、.2 抽象抽象 抽象: 抽象是人類在解決復(fù)雜問題時經(jīng)常采用的一種思維 方式,它是指將現(xiàn)實世界中具有共性的一類事物的 相似的、本質(zhì)的方面集中概括起來,而暫時忽略它 們之間的細(xì)節(jié)差異。結(jié)構(gòu)化程序中自頂向下、逐步 求精的模塊劃分思想正是人類思維中運用抽象方法 解決復(fù)雜問題的體現(xiàn)。 20 軟件工程過程的每一步都是對軟件解法的抽象層次的 精化: 在可行性研究階段,軟件作為系統(tǒng)的一個完整 部件; 在需求分析期間,軟件解法是使用在問題環(huán)境 內(nèi)熟悉的方式描述的; 當(dāng)由總體設(shè)計向詳細(xì)設(shè)計過渡時,抽象的程度 也就隨之減少; 最后,當(dāng)源程序?qū)懗鰜硪院?,也就達到了抽象 的最低層。 21 5.2.3 逐步求精逐步求精
10、定義:為了能集中精力解決主要問題而盡量推遲 對問題細(xì)節(jié)的考慮。 人類的認(rèn)知過程遵守Miller法則:一個人在任何時 候都只能把注意力集中在(72)個知識塊上。 逐步求精確保每個問題都將解決,而且每個問題將在 適當(dāng)?shù)臅r候被解決,在任何時候一個人都不需要同時 處理7個以上的知識塊。 22 復(fù)習(xí)回顧:問題復(fù)習(xí)回顧:問題1 模塊化的好處?模塊化的好處? 1、可以降低軟件開發(fā)的難度;、可以降低軟件開發(fā)的難度; 、可以使程序結(jié)構(gòu)清晰,增加易讀性、可以使程序結(jié)構(gòu)清晰,增加易讀性 和易修改性;和易修改性; 、模塊化還有利于提高代碼的可重用、模塊化還有利于提高代碼的可重用 性及團隊合作開發(fā)大型軟件的可行性。性及
11、團隊合作開發(fā)大型軟件的可行性。 23 、降低了軟件開發(fā)中每個階段的工作難度; 、簡化了軟件的設(shè)計和實現(xiàn)過程; 、有助于提高軟件的可讀性、可測試性和可 維護性; 、在程序設(shè)計中運用抽象的方法還能夠提高 代碼的可重用性。 復(fù)習(xí)回顧:問題復(fù)習(xí)回顧:問題2: 采用自頂向下采用自頂向下逐步求精逐步求精、由、由抽象抽象到具體到具體 的思維方式好處?的思維方式好處? 24 (1)信息隱藏:設(shè)計和確定模塊,使得一個模塊內(nèi) 包含的信息(過程和數(shù)據(jù))對于不需要這些信息的模 塊來說,是不能訪問的。 信息隱蔽的目的:主要是為了提高模塊的獨立性,減 少將一個模塊中的錯誤擴散到其他模塊的機會。但是 需要強調(diào)一點,信息隱蔽
12、并不意味著某個模塊中的內(nèi) 部信息對其他模塊來說是完全不可見或不能使用的, 而是說模塊之間的信息傳遞只能通過合法的調(diào)用接口 來實現(xiàn)。顯然,信息隱蔽對提高軟件的可讀性和可維 護性都是非常重要的。 5.2.4 信息隱藏和局部化信息隱藏和局部化 25 (2)局部化:是指把一些關(guān)系密切的軟件元素 物理地放得彼此靠近。如模塊中的局部數(shù)據(jù)元素 是局部化的一個例子。 局部化和信息隱藏概念是密切相關(guān)的,局部化有 助于信息隱藏。 26 模塊的獨立性是指軟件系統(tǒng)中每個模塊只模塊的獨立性是指軟件系統(tǒng)中每個模塊只 涉及軟件要求的具體的子功能,而和軟件系統(tǒng)涉及軟件要求的具體的子功能,而和軟件系統(tǒng) 中其他模塊的接口是簡單的
13、。中其他模塊的接口是簡單的。 5.2.5 模塊獨立模塊獨立 不同模塊之間不同模塊之間 互連程度互連程度 的度量。的度量。 模塊的獨立程度可以模塊的獨立程度可以 由兩個定性標(biāo)準(zhǔn)度量,由兩個定性標(biāo)準(zhǔn)度量, 這兩個標(biāo)準(zhǔn)分別稱為這兩個標(biāo)準(zhǔn)分別稱為 耦合和內(nèi)聚耦合和內(nèi)聚。 27 模塊獨立是模塊化、抽象、信息隱藏和局部化概念 的直接結(jié)果。 模塊的獨立性的優(yōu)點: 比較容易開發(fā)出有效模塊化(即具有獨立的模塊) 的軟件。 獨立的模塊比較容易測試和維護。 28 1) 耦合性耦合性 n耦合性是對一個軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系緊密程耦合性是對一個軟件結(jié)構(gòu)內(nèi)部不同模塊間聯(lián)系緊密程 度的度量指標(biāo)。度的度量指標(biāo)。 n決定耦
14、合性高低的主要因素決定耦合性高低的主要因素 由于模塊間的聯(lián)系是通過模塊接口實現(xiàn)的,因此,模由于模塊間的聯(lián)系是通過模塊接口實現(xiàn)的,因此,模 塊耦合性的高低主要取決于塊耦合性的高低主要取決于模塊接口的復(fù)雜程度、調(diào)用模模塊接口的復(fù)雜程度、調(diào)用模 塊的方式塊的方式以及以及通過模塊接口的數(shù)據(jù)通過模塊接口的數(shù)據(jù)。模塊間的耦合性。模塊間的耦合性主要主要 可劃分可劃分為如下幾種類型。為如下幾種類型。 低低 數(shù)據(jù)數(shù)據(jù) 耦合耦合 高高 耦合性耦合性 控制控制 耦合耦合 特征耦特征耦 合合 公共公共 耦合耦合 內(nèi)容內(nèi)容 耦合耦合 29 注意! 在軟件設(shè)計中應(yīng)該追求盡可能松散耦合的系統(tǒng)。 否則影響系統(tǒng)的可理解性、可測
15、性、可靠性和可 維護性。 30 耦合程度強弱的區(qū)分耦合程度強弱的區(qū)分 n無耦合:如果兩個模塊中的每一個都能獨立 地工作而不需要另一個模塊的存在,那么它 們彼此完全獨立,模塊間無任何連接。 31 (2) (2) 數(shù)據(jù)耦合。數(shù)據(jù)耦合。若兩個模塊之間僅通過模塊參數(shù)交換信若兩個模塊之間僅通過模塊參數(shù)交換信 息,且交換的信息全部為簡單數(shù)據(jù),則稱這種耦合為數(shù)據(jù)耦息,且交換的信息全部為簡單數(shù)據(jù),則稱這種耦合為數(shù)據(jù)耦 合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)據(jù)耦合。合。數(shù)據(jù)耦合的耦合性最低,通常軟件中都包含有數(shù)據(jù)耦合。 數(shù)據(jù)耦合的例子如下所示:數(shù)據(jù)耦合的例子如下所示: int int sum(int a
16、,int b)sum(int a,int b) int c;int c; c=a+b; c=a+b; return(c); return(c); main()main() int x,y;int x,y; printf(x+y= %d, printf(x+y= %d,sum(x,y)sum(x,y);); /* *主函數(shù)與主函數(shù)與sumsum函數(shù)之間即為數(shù)據(jù)耦合關(guān)系函數(shù)之間即為數(shù)據(jù)耦合關(guān)系* */ / 32 (3) (3) 控制耦合??刂岂詈?。若模塊之間交換的信息中包含有控制信息若模塊之間交換的信息中包含有控制信息( (盡管盡管 有時控制信息是以數(shù)據(jù)的形式出現(xiàn)的有時控制信息是以數(shù)據(jù)的形式出現(xiàn)的
17、) ),則稱這種耦合為控制耦合??刂?,則稱這種耦合為控制耦合??刂?耦合是中等程度的耦合,它會增加程序的復(fù)雜性??刂岂詈系睦尤缦滤詈鲜侵械瘸潭鹊鸟詈希鼤黾映绦虻膹?fù)雜性。控制耦合的例子如下所 示:示: void void outputoutput(flag)(flag) if (if (flagflag) printf(OK! );) printf(OK! ); else printf(NO! ); else printf(NO! ); main()main() int flag; int flag; outputoutput( (flagflag);); / /* *主函數(shù)與主函數(shù)與o
18、utputoutput函數(shù)之間即為控制耦合關(guān)系函數(shù)之間即為控制耦合關(guān)系* */ / A 模塊 flag f1 B f2fn 33 (4)特征耦合:當(dāng)把整個數(shù)據(jù)結(jié)構(gòu)作為參數(shù)傳遞而 被調(diào)用的模塊只需要使用其中一部分?jǐn)?shù)據(jù)元素。 int int sum(struc stu)sum(struc stu) int c,a,b;int c,a,b; a=stu.math;a=stu.math; b=stu.english;b=stu.english; c=a+b; c=a+b; return(c); return(c); main()main() int x,y;int x,y; struc student
19、 stu=“Tom”,18,97,95 struc student stu=“Tom”,18,97,95 printf(“ printf(“總分總分= %d,= %d,sum(stu)sum(stu);); /* *主函數(shù)與主函數(shù)與sumsum函數(shù)之間即為特征耦合關(guān)系函數(shù)之間即為特征耦合關(guān)系* */ / struct student char name20; int age; int math; int english; ; 34 (5) (5) 公共環(huán)境耦合。公共環(huán)境耦合。若兩個或多個模塊通過引用公共數(shù)據(jù)相互聯(lián)系, 則稱這種耦合為公共耦合。例如,在程序中定義了全局變量,并在多個 模塊中對全局
20、變量進行了引用,則引用全局變量的多個模塊間就具有了 公共耦合關(guān)系。 全局全局 數(shù)據(jù)區(qū)數(shù)據(jù)區(qū) A B C D E F B、C、E 為公共耦合 35 (6)內(nèi)容耦合:)內(nèi)容耦合:一個模塊訪問另一個模塊的內(nèi) 部數(shù)據(jù);一個模塊不通過正常入口而轉(zhuǎn)到另一 個模塊的內(nèi)部;兩個模塊有一部分程序代碼重 疊;一個模塊有多個入口(這意味著一個模塊有 幾種功能)。 n最不希望要的耦合! 36 耦合耦合采取下述設(shè)計原則采取下述設(shè)計原則 n耦合是影響軟件復(fù)雜程度的一個重要因 素。應(yīng)該采取下述設(shè)計原則: 盡量使用數(shù)據(jù)耦合, 少用控制耦合和特征耦合, 限制公共環(huán)境耦合的范圍, 完全不用內(nèi)容耦合。 37 課堂練習(xí):課堂練習(xí):
21、兩個模塊都是用同一張數(shù)據(jù)表,這種耦合屬于()兩個模塊都是用同一張數(shù)據(jù)表,這種耦合屬于() A. 數(shù)據(jù)耦合數(shù)據(jù)耦合 B. 控制耦合控制耦合 C. 公共環(huán)境耦合公共環(huán)境耦合 D. 內(nèi)容耦合內(nèi)容耦合 38 課堂思考:課堂思考: 請問如何將下面的控制耦合轉(zhuǎn)變成數(shù)據(jù)耦合?請問如何將下面的控制耦合轉(zhuǎn)變成數(shù)據(jù)耦合? A 模塊 flag f1 B f2fn A 模塊 f1f2fn flag 數(shù)據(jù)耦合數(shù)據(jù)耦合 控制耦合控制耦合 39 內(nèi)聚內(nèi)聚 內(nèi)聚標(biāo)志一個模塊內(nèi)各個元素彼此結(jié)合的緊密 程度,它是信息隱藏和局部化概念的自然擴展。 理想內(nèi)聚的模塊只做一件事情!理想內(nèi)聚的模塊只做一件事情! 設(shè)計時應(yīng)該力求做到高內(nèi)聚,
22、通常中等程度的 內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差 不多;不要使用低內(nèi)聚。 40 內(nèi)聚內(nèi)聚 n內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往 往意味著模塊間的松耦合。內(nèi)聚和耦合都是進 行模塊化設(shè)計的有力工具。 n經(jīng)實踐證明,保證模塊的高內(nèi)聚性比低耦合性 更為重要,在軟件設(shè)計時應(yīng)將更多的注意力集 中在提高模塊的內(nèi)聚性上。模塊的內(nèi)聚性主要 可劃分為如下幾種不同的類型。 41 低內(nèi)聚低內(nèi)聚 n偶然內(nèi)聚:偶然內(nèi)聚:如果一個模塊完成一組任務(wù),這些任務(wù)彼 此間即使有關(guān)系,關(guān)系也是很松散的。 n邏輯內(nèi)聚:邏輯內(nèi)聚: 一個模塊完成的任務(wù)在邏輯上屬于相同或 相似的一類。 n時間內(nèi)聚:時間內(nèi)聚:一個模塊包含的任務(wù)
23、必須在同一段時間內(nèi) 執(zhí)行。 調(diào)用模塊 判定 讀 一 個 記 錄 寫 一 個 記 錄 被調(diào)用模塊 邏輯內(nèi)聚 42 中內(nèi)聚中內(nèi)聚 n過程內(nèi)聚 一個模塊內(nèi)的處理元素是相關(guān)的,而且必須 以特定次序執(zhí)行。 n通信內(nèi)聚 模塊中所有元素都使用同一個輸入數(shù)據(jù)和 (或)產(chǎn)生同一個輸出數(shù)據(jù)。 43 高內(nèi)聚高內(nèi)聚 n順序內(nèi)聚 一個模塊內(nèi)的處理元素和同一個功能密切相 關(guān),而且這些處理必須順序執(zhí)行(通常一個 處理元素的輸出數(shù)據(jù)作為下一個處理元素的 輸入數(shù)據(jù))。 n功能內(nèi)聚 模塊內(nèi)所有處理元素屬于一個整體,完成一 個單一的功能。 44 n上述七種內(nèi)聚的優(yōu)劣評分(分值越高,內(nèi) 聚程度越好),將得到如下結(jié)果: 功能內(nèi)聚10分
24、時間內(nèi)聚3分 順序內(nèi)聚9分邏輯內(nèi)聚1分 通信內(nèi)聚7分偶然內(nèi)聚0分 過程內(nèi)聚5分 低低 功能功能 內(nèi)聚內(nèi)聚 順序順序 內(nèi)聚內(nèi)聚 通信通信 內(nèi)聚內(nèi)聚 過程過程 內(nèi)聚內(nèi)聚 時間時間 內(nèi)聚內(nèi)聚 邏輯邏輯 內(nèi)聚內(nèi)聚 耦然耦然 內(nèi)聚內(nèi)聚 高高 強強弱弱 內(nèi)聚性內(nèi)聚性 模塊獨立性模塊獨立性 45 人們在開發(fā)計算機軟件的長期實踐中積累了 豐富的經(jīng)驗,總結(jié)這些經(jīng)驗得出了一些啟發(fā) 式規(guī)則。往往能幫助他們找到改進軟件設(shè)計 提高軟件質(zhì)量的途徑。 體系結(jié)構(gòu)設(shè)計的啟發(fā)規(guī)則有如下7點。 5.3 啟發(fā)規(guī)則啟發(fā)規(guī)則 46 1. 改進軟件結(jié)構(gòu),提高模塊獨立性 設(shè)計出軟件的初步結(jié)構(gòu)以后,應(yīng)該審查分析 這個結(jié)構(gòu),通過模塊分解或合并,
25、力求降低 耦合提高內(nèi)聚。 例如,多個模塊公有的一個子功能可以獨立 成一個模塊,由這些模塊調(diào)用;有時可以通 過分解或合并模塊以減少控制信息的傳遞及 對全程數(shù)據(jù)的引用,并且降低接口的復(fù)雜程 度。 47 2. 模塊規(guī)模應(yīng)該適中 n經(jīng)驗表明,一個模塊的規(guī)模不應(yīng)過大,最 好能寫在一頁紙內(nèi)(通常不超過60行語句)。 48 3. 深度、寬度、扇出和扇入都應(yīng)適當(dāng) 軟件結(jié)構(gòu)中的深度和寬度不宜過大軟件結(jié)構(gòu)中的深度和寬度不宜過大! (1)深度:表示軟件結(jié)構(gòu)中控制的層數(shù), 它往往能粗略地標(biāo)志一個系統(tǒng)的大小和復(fù)雜 程度。如果層數(shù)過多則應(yīng)該考慮是否有許多 管理模塊過分簡單了,能否適當(dāng)合并。 (2)寬度:是軟件結(jié)構(gòu)內(nèi)同一個
26、層次上的 模塊總數(shù)的最大值。一般說來,寬度越大系 統(tǒng)越復(fù)雜。對寬度影響最大的因素是模塊的 扇出。 49 如下圖所示的軟件結(jié)構(gòu)圖中,深度為5,寬度為8。 n影響深度的因素:深度在程序中表現(xiàn)為模塊的嵌套調(diào)用, 嵌套的層數(shù)越多,程序就越復(fù)雜,程序的可理解性也就隨之 下降。深度過大可通過將結(jié)構(gòu)中過于簡單的模塊分層與上一 級模塊合并來解決; n影響寬度的因素:對寬度影響最大的因素是模塊的扇出, 即模塊可以調(diào)用的下級模塊數(shù)越多,軟件結(jié)構(gòu)的寬度就越大。 而寬度過大則可通過增加中間層來解決。 顯然,軟件結(jié)構(gòu)中的深度和寬度是相互對立的兩個方面, 降低深度會引起寬度的增加,而降低寬度又會帶來深度的增 加。 50
27、(3)扇出:是一個模塊直接控制(調(diào)用)的模 塊數(shù)目。 扇出過大:意味著模塊過分復(fù)雜,需要控制和協(xié)調(diào) 過多的下級模塊,應(yīng)該適當(dāng)增加中間層次的控制模 塊。 n扇出過?。?例如總是1)也不好,可以把下級模塊 進一步分解成若干個子功能模塊,或者合并到它的 上級模塊中去。經(jīng)驗表明,一個設(shè)計得好的典型系 統(tǒng)的平均扇出通常是3或4。 n分解模塊或合并模塊必須符合問題結(jié)構(gòu),不能違 背模塊獨立原理。 51 (4)扇入:一個模塊的扇入表明有多少個 上級模塊直接調(diào)用它。 n扇入越大則共享該模塊的上級模塊數(shù)目越 多,這是有好處的,但是,不能違背模塊獨 立原理單純追求高扇入。 n 觀察大量軟件系統(tǒng)后發(fā)現(xiàn),設(shè)計得很好的
28、軟件結(jié)構(gòu)通常頂層扇出比較高,中層扇出較 少, 底層模塊有高扇入。 52 圖5.5 模塊的扇入和扇出 (a) 扇入;(b) 扇出 M 1 M 2 M n M (a)(b) M 1 M 2 M k M 53 三種情形需要關(guān)注: n若模塊的扇入越大,則說明共享該模塊的上級模 塊數(shù)越多,或者說該模塊在程序中的重用性越高, 這正是程序設(shè)計所追求的目標(biāo)之一。(類似重構(gòu)里 的方法抽?。?n 若模塊的扇出若過大,如在一個模塊中要調(diào)用八 個下級模塊,則會使該模塊的調(diào)用控制過于復(fù)雜。 這種現(xiàn)象發(fā)生的原因通常都是由于設(shè)計階段,模塊 細(xì)化的過程中,分解速度過快造成的。最常見的解 決辦法是通過在此模塊和下級模塊間增加一
29、個中間 層來控制模塊分解的速度。 n 若模塊的扇出過小若模塊的扇出過小,如扇出為1(下級模塊層中只 有一個模塊),在系統(tǒng)設(shè)計中通常是不可取的。常見 的解決方法是考慮將其合并到上級模塊中。但若合 并會影響模塊的獨立性,則將其保留下來也未嘗不 可。根據(jù)實踐經(jīng)驗,設(shè)計良好的典型系統(tǒng)中,模塊 的平均扇出通常為3或4。 n 54 圖5.6 軟件結(jié)構(gòu)圖示例 經(jīng)過對大量軟件系統(tǒng)的研究后發(fā)現(xiàn),在設(shè)計良好的軟件 結(jié)構(gòu)中,通常頂層的扇出數(shù)較大,中間層的扇出數(shù)較小,底頂層的扇出數(shù)較大,中間層的扇出數(shù)較小,底 層的扇入數(shù)較大層的扇入數(shù)較大,如圖5.6所示 55 4. 模塊的作用域應(yīng)該在控制域之內(nèi)模塊的作用域應(yīng)該在控制
30、域之內(nèi) (1)模塊的作用域:受該模塊內(nèi)一個判定影響的 所有模塊的集合。 n在一個設(shè)計得很好的系統(tǒng)中,所有受判定影響的 模塊應(yīng)該都從屬于做出判定的那個模塊,最好局限 于做出判定的那個模塊本身及它的直屬下級模塊。 否則軟件難以理解,并可能出現(xiàn)控制耦合。 n(2)模塊的控制域:這個模塊本身以及所有直接 或間接從屬于它的模塊的集合。 n 56 圖5.2 模塊的作用域和控制域 模塊A的控制域 是A、B、C、D、 E、F模塊的集合。 要實現(xiàn)作用域是 控制域的子集, 需要修改軟件結(jié) 構(gòu),如判定從A 移到M或?qū)移 到A下。 若模塊A做出的判定影響G, 會出現(xiàn)什么問題? 57 5. 力爭降低模塊接口的復(fù)雜程度
31、 模塊接口復(fù)雜是軟件發(fā)生錯誤的一個主要原 因。應(yīng)該仔細(xì)設(shè)計模塊接口,使得信息傳遞 簡單并且和模塊的功能一致。 如:quad_root(TBL,X)是求一元二次方程根 的模塊,其中數(shù)組TBL傳送方程的系數(shù),用 數(shù)組X來傳回求得的根。不利于于理解和維 護,而且開發(fā)期也易發(fā)生錯誤。 改成quad_root(a,b,c,root1,root2)簡單接口。 58 6. 設(shè)計單入口單出口的模塊 不要使模塊間出現(xiàn)內(nèi)容耦合。當(dāng)從頂部進入 模塊并且從底部退出來時,軟件是比較容易 理解的,因此也是比較容易維護的。 59 7. 模塊功能應(yīng)該可以預(yù)測 如果一個模塊可以當(dāng)做一個黑盒子,也就是 說,只要輸入的數(shù)據(jù)相同就產(chǎn)
32、生同樣的輸出, 這個模塊的功能就是可以預(yù)測的。 以上列出的7條啟發(fā)式規(guī)則多數(shù)是經(jīng)驗規(guī)律, 對改進設(shè)計,提高軟件質(zhì)量,往往有重要的 參考價值。 60 (1)層次圖用來描繪軟件的層次結(jié)構(gòu),很適于在自 頂向下設(shè)計軟件的過程中使用。 n層次圖中的一個矩形框代表一個模塊,方框間的連 線表示調(diào)用關(guān)系。 n層次方框圖方框間的連線表示組成關(guān)系。(P68) 5.4 描繪軟件結(jié)構(gòu)的圖形工具描繪軟件結(jié)構(gòu)的圖形工具 5.4.1 層次圖和層次圖和HIPO圖圖 61 圖5.3 正文加工系統(tǒng)的層次圖 62 領(lǐng)導(dǎo)層輔助決策系領(lǐng)導(dǎo)層輔助決策系 統(tǒng)統(tǒng) 查詢查詢輔助決策輔助決策 物物 資資 信信 息息 重重 點點 供供 料料 信信
33、 息息 商商 情情 信信 息息 人人 員員 狀狀 況況 合合 同同 監(jiān)監(jiān) 視視 財財 務(wù)務(wù) 信信 息息 計計 劃劃 執(zhí)執(zhí) 行行 情情 況況 工工 程程 進進 展展 情情 況況 超超 儲儲 低低 儲儲 情情 況況 經(jīng)經(jīng) 營營 指指 標(biāo)標(biāo) 歷歷 年年 對對 比比 價價 格格 預(yù)預(yù) 測測 物物 資資 用用 量量 預(yù)預(yù) 測測 庫庫 存存 定定 額額 核核 定定 庫庫 存存 結(jié)結(jié) 構(gòu)構(gòu) 分分 析析 經(jīng)經(jīng) 濟濟 采采 購購 批批 量量 保保 本本 保保 利利 分分 析析 63 64 65 層次圖很適于在自頂向下設(shè)計軟件的過程中 使用。 (2)帶編號的層次圖:HIPO圖 (層次圖加 輸入/處理/輸出圖”的英
34、文縮寫)。 為了能使層次圖具有可追蹤性,除了最頂層 的方框之外,每個方框都加了編號,稱為 HIPO圖 。 66 圖5.4 帶編號的層次圖(H圖) 67 68 69 計算 出勤 獎 1.1.2.1 計算 業(yè)績 獎 1.1.2.2 計算工 資檔案 各基本 數(shù)據(jù)項 之和 1.1.1 計算 獎金 1.1.2 計算應(yīng) 發(fā)工資 1.1 計算 水電 扣款 1.2.1 計算 缺勤 扣款 1.2.2 計算 所得 稅扣 款 1.2.3 計算 扣款 1.2 計算實 發(fā)工資 1.3 計算 工資 1 查詢 職工 賬號 2.1 生成 工資 存款 清單 2.2 工資 轉(zhuǎn)存 2 打印工 資清單 3 工資計算系統(tǒng) 圖5.3 工
35、資計算系統(tǒng)的H圖 每一個矩形框代表一個模塊, 圖中最頂層的矩形框表示系統(tǒng) 中的主控模塊,矩形框之間的 連線用于表示模塊之間的調(diào)用 關(guān)系。適用于自頂向下進行分 解的軟件結(jié)構(gòu)設(shè)計方法。 70 n結(jié)構(gòu)圖中一個方框代表一個模塊,框內(nèi)注 明模塊的名字或主要功能。 n方框之間的箭頭(或直線)表示模塊的調(diào)用關(guān) 系。位于上方的方框代表的模塊調(diào)用下方的 模塊。 5.4.2 結(jié)構(gòu)圖(用于結(jié)構(gòu)圖(用于描繪軟件結(jié)構(gòu))描繪軟件結(jié)構(gòu)) 71 表表5.1 5.1 結(jié)構(gòu)圖中的基本符號結(jié)構(gòu)圖中的基本符號 A BC A BC 符 號含 義 用于表示模塊,方框中標(biāo)明模塊的名稱 用于描述模塊之間的調(diào)用關(guān)系 用于表示模塊調(diào)用過程中傳遞
36、的信息,箭頭上標(biāo)明信息的名稱; 箭頭尾部為空心圓表示傳遞的信息是數(shù)據(jù),若為實心圓則表示傳 遞的是控制信息 表示模塊A選擇調(diào)用模塊B或模塊C.判定為真時調(diào)用B,為假時調(diào) 用C 表示模塊A循環(huán)調(diào)用模塊B和模塊C 72 圖5.5 結(jié)構(gòu)圖的例子產(chǎn)生最佳解的一般結(jié)構(gòu) 尾部是空心圓表 示傳遞的是數(shù)據(jù)。 實心圓表示傳遞 的是控制信息。 73 結(jié)構(gòu)圖可以作為檢查設(shè)計正確性和評價模塊 獨立性的好方法: n傳送的每個數(shù)據(jù)元素都是完成模塊功能所 必須的嗎? n完成模塊功能必須的每個數(shù)據(jù)元素都傳送 來了嗎? n所有數(shù)據(jù)元素都只和單一的功能有關(guān)嗎? 如果發(fā)現(xiàn)結(jié)構(gòu)圖上模塊間的聯(lián)系不容易解釋, 則應(yīng)該考慮是否設(shè)計上有問題。
37、 74 面向數(shù)據(jù)流的設(shè)計方法定義了一些不同的 “映射”,利用這些映射可以把數(shù)據(jù)流圖變 換成軟件結(jié)構(gòu)。 因為任何軟件系統(tǒng)都可以用數(shù)據(jù)流圖表示, 所以面向數(shù)據(jù)流的設(shè)計方法理論上可以設(shè)計 任何軟件的結(jié)構(gòu)。通常所說的結(jié)構(gòu)化設(shè)計方 法(簡稱SD方法),也就是基于數(shù)據(jù)流的設(shè)計 方法。 5.5 面向數(shù)據(jù)流的設(shè)計方法面向數(shù)據(jù)流的設(shè)計方法 75 面向數(shù)據(jù)流的設(shè)計方法把信息流映射成軟件 結(jié)構(gòu)。信息流有變換流和事務(wù)流兩種類型。 1. 變換流 n信息沿輸入通路進入系統(tǒng),同時由外部形 式變換成內(nèi)部形式; n進入系統(tǒng)的信息通過變換中心,經(jīng)加工處 理; n再沿輸出通路變換成外部形式離開軟件系 統(tǒng)。 5.5.1 概念概念 7
38、6 圖5.8 變換流 77 2. 事務(wù)流 數(shù)據(jù)沿輸入通路到達一個處理T(事務(wù)中 心),處理T根據(jù)輸入數(shù)據(jù)的類型在若干個 動作序列中選出一個來執(zhí)行,稱為事務(wù)流。 78 圖5.9 事務(wù)流 處理T稱為事務(wù) 中心,它完成下 述任務(wù): n接收輸入數(shù)據(jù) (事務(wù)); (2) 分析每個事務(wù)以 確定它的類型; (3) 根據(jù)事務(wù)類型選 取一條活動通路。 79 圖5.10面向數(shù)據(jù)流方法的設(shè)計過程 圖5.10說明了使用 面向數(shù)據(jù)流方法 逐步設(shè)計的一般 過程。 3. 設(shè)計過程 80 變換分析是一系列設(shè)計步驟的總稱,經(jīng)過這 些步驟把具有變換流特點的數(shù)據(jù)流圖按預(yù)先 確定的模式映射成軟件結(jié)構(gòu)。 1. 例子 在設(shè)計汽車數(shù)字儀表
39、板時,將軟件做在只讀存 儲器中,成為設(shè)備的一部分,從而使設(shè)備具 有某些“智能”。 進行面向數(shù)據(jù)流的變換分析示例。 5.5.2 變換分析變換分析 81 假設(shè)的儀表板將完成下述功能: (1) 通過模數(shù)轉(zhuǎn)換實現(xiàn)傳感器和微處理機接口; (2) 在發(fā)光二極管面板上顯示數(shù)據(jù); (3) 指示每小時英里數(shù)(mph),行駛的里程,每 加侖油行駛的英里數(shù)(mpg)等等; (4) 指示加速或減速; (5) 超速警告:如果車速超過55英里/小時,則 發(fā)出超速警告鈴聲。 在軟件需求分析階段應(yīng)該建立起必要的文檔資 料,特別是數(shù)據(jù)流圖。 82 2. 設(shè)計步驟(開發(fā)給軟件的整體表示,即軟件結(jié)構(gòu)) 第1步 復(fù)查基本系統(tǒng)模型。
40、復(fù)查的目的是確保系統(tǒng)的輸入數(shù)據(jù)和輸出數(shù)據(jù)符合 實際。 第2步 復(fù)查并精化數(shù)據(jù)流圖。 確保數(shù)據(jù)流圖給出了目標(biāo)系統(tǒng)的正確的邏輯模型, 并且應(yīng)該使數(shù)據(jù)流圖中每個處理都代表一個規(guī)模適 中相對獨立的子功能。 在需求分析階段產(chǎn)生的數(shù)字儀表板系統(tǒng)的數(shù)據(jù)流圖 如圖5.11所示。 83 圖5.11數(shù)字儀表板系統(tǒng)的數(shù)據(jù)流圖 84 第3步 確定數(shù)據(jù)流圖具有變換特性還是事務(wù) 特性。 從圖5.11看出,數(shù)據(jù)沿著兩條輸入通路進入 系統(tǒng),然后沿著5條通路離開,沒有明顯的 事務(wù)中心。因此可以認(rèn)為這個信息流具有變 換流的總特征。 85 第4步 確定輸入流和輸出流的邊界,從而孤 立出變換中心。 輸入流和輸出流的邊界和對它們的解釋
41、有關(guān), 也就是說,不同的設(shè)計人員可能會在流內(nèi)選 取稍微不同的點作為邊界的位置。 86 圖5.12具有邊界的數(shù)據(jù)流圖 輸入通路 變換中心 輸出通路 87 第5步 完成“第一級分解”。 軟件結(jié)構(gòu)代表對控制的自頂向下的分配,所 謂分解就是分配控制的過程。 對于變換流的情況,數(shù)據(jù)流圖被映射成一個 特殊的軟件結(jié)構(gòu),這個結(jié)構(gòu)控制輸入、變換 和輸出等信息處理過程。 88 圖5.13 第一級分解的方法 控制模塊 Cm協(xié)調(diào)下 述從屬的 控制功能 輸入信息 處理控制 模塊Ca,協(xié) 調(diào)對所有 輸入數(shù)據(jù) 的接收 變換中心 控制模塊 Ct,管理對 內(nèi)部形式 的數(shù)據(jù)的 所有操作 輸出信息 處理控制 模塊Ce, 協(xié)調(diào)輸出
42、信息的產(chǎn) 生過程 89 圖5.14 數(shù)字儀表板系統(tǒng)的第一級分解 90 第6步 完成“第二級分解”。 把數(shù)據(jù)流圖中的每個處理映射成軟件結(jié)構(gòu)中一個適 當(dāng)?shù)哪K。 圖5.15表示進行第二級分解的普遍途徑。 91 圖5.15 第二級分解的方法 從變換中心的邊界開 始沿著輸入通路向外 移動,把輸入通路中 每個處理映射成軟件 結(jié)構(gòu)中Ca控制下的一 個低層模塊。 92 圖5.12具有邊界的數(shù)據(jù)流圖 輸入通路 獲取輸入結(jié)構(gòu) 從變換中心的邊界開 始沿著輸入通路向外 移動,把輸入通路中 每個處理映射成軟件 結(jié)構(gòu)中Ca控制下的一 個低層模塊。 93 圖5.16 未經(jīng)精化的輸入結(jié)構(gòu) 從變換中心的邊界開 始沿著輸入通路
43、向外 移動,把輸入通路中 每個處理映射成軟件 結(jié)構(gòu)中Ca控制下的一 個低層模塊。 94 圖5.12具有邊界的數(shù)據(jù)流圖 變換中心 把變換中心 內(nèi)的每個處 理映射成受 Ct控制的一 個模塊 獲取變換結(jié)構(gòu) 95 圖5.17 未經(jīng)精化的變換結(jié)構(gòu) 把變換中心 內(nèi)的每個處 理映射成受 Ct控制的一 個模塊 96 圖5.12具有邊界的數(shù)據(jù)流圖 輸出通路 沿輸出通路向外移 動,把輸出通路中 每個處理映射成直 接或間接受模塊 Ce控制的一個低 層模塊 獲取輸出結(jié)構(gòu) 97 圖5.18 未經(jīng)精化的輸出結(jié)構(gòu) 沿輸出通路向外移 動,把輸出通路中 每個處理映射成直 接或間接受模塊 Ce控制的一個低 層模塊 98 n。 第7步 使用設(shè)計度量和啟發(fā)式規(guī)則對第一次 分割得到的軟件結(jié)構(gòu)進一步精化。 99 為了得到一個易于實現(xiàn)、易于測試和易于維 護的軟件結(jié)構(gòu),應(yīng)該對初步分割得到的模塊 進行再分解或合并。 具體到數(shù)字儀表板的例子,可做如下某些可 能的修改: (1)輸入結(jié)構(gòu)中的模塊“轉(zhuǎn)換成rpm”和 “收集sps”可以合并; (2)模塊“確定加速/減速”可以放在模塊 “計算mph”下面,以減少耦合; (3)模塊“加速/減速顯示”可以相應(yīng)地放 在模塊“顯示mph”的下面。 100 圖5.19 經(jīng)過修改的精化后的數(shù)字儀表
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同范本免責(zé)條款
- 辦低保申請書
- 售房平臺合同范本
- 義馬租房合同范本
- 啤酒購銷合同范本
- 初三里程碑:啟航人生新征程
- 代加工招標(biāo)合同范本
- 印刷居間服務(wù)合同范本
- 人防工程物業(yè)管理合同范例
- 公路與房屋租賃合同范本
- 第16課數(shù)據(jù)管理與編碼(教案)四年級全一冊信息技術(shù)人教版
- 2024中考物理真題匯編:電與磁(含解析)
- 2024年小客車指標(biāo)借用協(xié)議3篇
- 骨科術(shù)后譫妄患者的護理
- 《肺動靜脈瘺》課件
- 約定工資結(jié)清協(xié)議書(2篇)
- 特殊作業(yè)安全管理監(jiān)護人專項培訓(xùn)課件
- 湖北省荊州市英語初一上學(xué)期期末試題與參考答案(2024年)
- 鶴壁海格龍升3萬噸溴系列新材料產(chǎn)品環(huán)評資料環(huán)境影響
- 2024屆全國新高考英語復(fù)習(xí)-讀后續(xù)寫微寫作
- 顳下頜關(guān)節(jié)疾病(口腔頜面外科學(xué)課件)
評論
0/150
提交評論