總體設(shè)計(jì)概要設(shè)計(jì)

上傳人:san****019 文檔編號(hào):20975239 上傳時(shí)間:2021-04-21 格式:PPT 頁(yè)數(shù):109 大?。?05KB
收藏 版權(quán)申訴 舉報(bào) 下載
總體設(shè)計(jì)概要設(shè)計(jì)_第1頁(yè)
第1頁(yè) / 共109頁(yè)
總體設(shè)計(jì)概要設(shè)計(jì)_第2頁(yè)
第2頁(yè) / 共109頁(yè)
總體設(shè)計(jì)概要設(shè)計(jì)_第3頁(yè)
第3頁(yè) / 共109頁(yè)

下載文檔到電腦,查找使用更方便

14.9 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《總體設(shè)計(jì)概要設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《總體設(shè)計(jì)概要設(shè)計(jì)(109頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、第 5章 總 體 設(shè) 計(jì)5.1 設(shè)計(jì)過(guò)程5.2 設(shè)計(jì)原理5.3 啟發(fā)規(guī)則5.4 描繪軟件結(jié)構(gòu)的圖形工具5.5 面向數(shù)據(jù)流的設(shè)計(jì)方法5.6 小結(jié)習(xí)題 總體設(shè)計(jì)的基本目的就是回答“概括地說(shuō),系統(tǒng)應(yīng)該如何實(shí)現(xiàn)?”這個(gè)問(wèn)題,因此,總體設(shè)計(jì)又稱為概要設(shè)計(jì)或初步設(shè)計(jì)。通過(guò)這個(gè)階段的工作將劃分出組成系統(tǒng)的物理元素程序、文件、數(shù)據(jù)庫(kù)、人工過(guò)程和文檔等等,但是每個(gè)物理元素仍然處于黑盒子級(jí),這些黑盒子里的具體內(nèi)容將在以后仔細(xì)設(shè)計(jì)??傮w設(shè)計(jì)階段的另一項(xiàng)重要任務(wù)是設(shè)計(jì)軟件的結(jié)構(gòu),也就是要確定系統(tǒng)中每個(gè)程序是由哪些模塊組成的,以及這些模塊相互間的關(guān)系。 總體設(shè)計(jì)過(guò)程首先尋找實(shí)現(xiàn)目標(biāo)系統(tǒng)的各種不同的方案,需求分析階段得到

2、的數(shù)據(jù)流圖是設(shè)想各種可能方案的基礎(chǔ)。然后分析員從這些供選擇的方案中選取若干個(gè)合理的方案,為每個(gè)合理的方案都準(zhǔn)備一份系統(tǒng)流程圖,列出組成系統(tǒng)的所有物理元素,進(jìn)行成本/效益分析,并且制定實(shí)現(xiàn)這個(gè)方案的進(jìn)度計(jì)劃。分析員應(yīng)該綜合分析比較這些合理的方案,從中選出一個(gè)最佳方案向用戶和使用部門負(fù)責(zé)人推薦。如果用戶和使用部門的負(fù)責(zé)人接受了推薦的方案,分析員應(yīng)該進(jìn)一步為這個(gè)最佳方案設(shè)計(jì)軟件結(jié)構(gòu),通常,設(shè)計(jì)出初步的軟件結(jié)構(gòu)后還要多方改進(jìn),從而得到更合理的結(jié)構(gòu),進(jìn)行必要的數(shù)據(jù)庫(kù)設(shè)計(jì),確定測(cè)試要求并且制定測(cè)試計(jì)劃。 從上面的敘述中不難看出,在詳細(xì)設(shè)計(jì)之前先進(jìn)行總體設(shè)計(jì)的必要性:可以站在全局高度上,花較少成本,從較抽象

3、的層次上分析對(duì)比多種可能的系統(tǒng)實(shí)現(xiàn)方案和軟件結(jié)構(gòu),從中選出最佳方案和最合理的軟件結(jié)構(gòu),從而用較低成本開發(fā)出較高質(zhì)量的軟件系統(tǒng)。 總體設(shè)計(jì)過(guò)程通常由兩個(gè)主要階段組成:系統(tǒng)設(shè)計(jì)階段,確定系統(tǒng)的具體實(shí)現(xiàn)方案;結(jié)構(gòu)設(shè)計(jì)階段,確定軟件結(jié)構(gòu)。典型的總體設(shè)計(jì)過(guò)程包括下述9個(gè)步驟:1. 設(shè)想供選擇的方案在總體設(shè)計(jì)階段分析員應(yīng)該考慮各種可能的實(shí)現(xiàn)方案,并且力求從中選出最佳方案。在總體設(shè)計(jì)階段開始時(shí)只有系統(tǒng)的邏輯模型,分析員有充分的自由分析比較不同的物理實(shí)現(xiàn)方案,一旦選出了最佳的方案,將能大大提高系統(tǒng)的性能/價(jià)格比。5.1 設(shè)計(jì)過(guò)程 需求分析階段得出的數(shù)據(jù)流圖是總體設(shè)計(jì)的極好的出發(fā)點(diǎn)。設(shè)想供選擇的方案的一種常用的

4、方法是,設(shè)想把數(shù)據(jù)流圖中的處理分組的各種可能的方法,拋棄在技術(shù)上行不通的分組方法(例如,組內(nèi)不同處理的執(zhí)行時(shí)間不相容),余下的分組方法代表可能的實(shí)現(xiàn)策略,并且可以啟示供選擇的物理系統(tǒng)。 2. 選取合理的方案應(yīng)該從前一步得到的一系列供選擇的方案中選取若干個(gè)合理的方案,通常至少選取低成本、中等成本和高成本的三種方案。在判斷哪些方案合理時(shí)應(yīng)該考慮在問(wèn)題定義和可行性研究階段確定的工程規(guī)模和目標(biāo),有時(shí)可能還需要進(jìn)一步征求用戶的意見。對(duì)每個(gè)合理的方案分析員都應(yīng)該準(zhǔn)備下列4份資料:(1) 系統(tǒng)流程圖;(2) 組成系統(tǒng)的物理元素清單;(3) 成本/效益分析;(4) 實(shí)現(xiàn)這個(gè)系統(tǒng)的進(jìn)度計(jì)劃。 3. 推薦最佳方案

5、分析員應(yīng)該綜合分析對(duì)比各種合理方案的利弊,推薦一個(gè)最佳的方案,并且為推薦的方案制定詳細(xì)的實(shí)現(xiàn)計(jì)劃。制定詳細(xì)實(shí)現(xiàn)計(jì)劃的關(guān)鍵技術(shù)是本書第13章中將要介紹的工程網(wǎng)絡(luò)。用戶和有關(guān)的技術(shù)專家應(yīng)該認(rèn)真審查分析員所推薦的最佳系統(tǒng),如果該系統(tǒng)確實(shí)符合用戶的需要,并且是在現(xiàn)有條件下完全能夠?qū)崿F(xiàn)的,則應(yīng)該提請(qǐng)使用部門負(fù)責(zé)人進(jìn)一步審批。在使用部門的負(fù)責(zé)人也接受了分析員所推薦的方案之后,將進(jìn)入總體設(shè)計(jì)過(guò)程的下一個(gè)重要階段結(jié)構(gòu)設(shè)計(jì)。 4. 功能分解為了最終實(shí)現(xiàn)目標(biāo)系統(tǒng),必須設(shè)計(jì)出組成這個(gè)系統(tǒng)的所有程序和文件(或數(shù)據(jù)庫(kù))。對(duì)程序(特別是復(fù)雜的大型程序)的設(shè)計(jì),通常分為兩個(gè)階段完成:首先進(jìn)行結(jié)構(gòu)設(shè)計(jì),然后進(jìn)行過(guò)程設(shè)計(jì)。結(jié)構(gòu)

6、設(shè)計(jì)確定程序由哪些模塊組成,以及這些模塊之間的關(guān)系;過(guò)程設(shè)計(jì)確定每個(gè)模塊的處理過(guò)程。結(jié)構(gòu)設(shè)計(jì)是總體設(shè)計(jì)階段的任務(wù),過(guò)程設(shè)計(jì)是詳細(xì)設(shè)計(jì)階段的任務(wù)。 為確定軟件結(jié)構(gòu),首先需要從實(shí)現(xiàn)角度把復(fù)雜的功能進(jìn)一步分解。分析員結(jié)合算法描述仔細(xì)分析數(shù)據(jù)流圖中的每個(gè)處理,如果一個(gè)處理的功能過(guò)分復(fù)雜,必須把它的功能適當(dāng)?shù)胤纸獬梢幌盗斜容^簡(jiǎn)單的功能。一般說(shuō)來(lái),經(jīng)過(guò)分解之后應(yīng)該使每個(gè)功能對(duì)大多數(shù)程序員而言都是明顯易懂的。功能分解導(dǎo)致數(shù)據(jù)流圖的進(jìn)一步細(xì)化,同時(shí)還應(yīng)該用IPO圖或其他適當(dāng)?shù)墓ぞ吆?jiǎn)要描述細(xì)化后每個(gè)處理的算法。 5. 設(shè)計(jì)軟件結(jié)構(gòu)通常程序中的一個(gè)模塊完成一個(gè)適當(dāng)?shù)淖庸δ?。?yīng)該把模塊組織成良好的層次系統(tǒng),頂層模塊

7、調(diào)用它的下層模塊以實(shí)現(xiàn)程序的完整功能,每個(gè)下層模塊再調(diào)用更下層的模塊,從而完成程序的一個(gè)子功能,最下層的模塊完成最具體的功能。軟件結(jié)構(gòu)(即由模塊組成的層次系統(tǒng))可以用層次圖或結(jié)構(gòu)圖來(lái)描繪,第5.4節(jié)將介紹這些圖形工具。如果數(shù)據(jù)流圖已經(jīng)細(xì)化到適當(dāng)?shù)膶哟危瑒t可以直接從數(shù)據(jù)流圖映射出軟件結(jié)構(gòu),這就是第5.5節(jié)中將要講述的面向數(shù)據(jù)流的設(shè)計(jì)方法。 6. 設(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ù)。在數(shù)據(jù)庫(kù)課中已經(jīng)詳細(xì)講述了設(shè)計(jì)數(shù)據(jù)庫(kù)的方法,本書不再贅述。7. 制定測(cè)試計(jì)劃在軟件開發(fā)的早期階段考慮測(cè)試問(wèn)題,能促使軟件設(shè)計(jì)人員在設(shè)計(jì)

8、時(shí)注意提高軟件的可測(cè)試性。本書第7章將仔細(xì)討論軟件測(cè)試的目的和設(shè)計(jì)測(cè)試方案的各種技術(shù)方法。 8. 書寫文檔應(yīng)該用正式的文檔記錄總體設(shè)計(jì)的結(jié)果,在這個(gè)階段應(yīng)該完成的文檔通常有下述幾種:(1) 系統(tǒng)說(shuō)明主要內(nèi)容包括用系統(tǒng)流程圖描繪的系統(tǒng)構(gòu)成方案,組成系統(tǒng)的物理元素清單,成本/效益分析;對(duì)最佳方案的概括描述,精化的數(shù)據(jù)流圖,用層次圖或結(jié)構(gòu)圖描繪的軟件結(jié)構(gòu),用IPO圖或其他工具(例如,PDL語(yǔ)言)簡(jiǎn)要描述的各個(gè)模塊的算法,模塊間的接口關(guān)系,以及需求、功能和模塊三者之間的交叉參照關(guān)系等等。(2) 用戶手冊(cè)根據(jù)總體設(shè)計(jì)階段的結(jié)果,修改更正在需求分析階段產(chǎn)生的初步的用戶手冊(cè)。 (3) 測(cè)試計(jì)劃包括測(cè)試策略,

9、測(cè)試方案,預(yù)期的測(cè)試結(jié)果,測(cè)試進(jìn)度計(jì)劃等等。(4) 詳細(xì)的實(shí)現(xiàn)計(jì)劃(5) 數(shù)據(jù)庫(kù)設(shè)計(jì)結(jié)果9. 審查和復(fù)審最后應(yīng)該對(duì)總體設(shè)計(jì)的結(jié)果進(jìn)行嚴(yán)格的技術(shù)審查,在技術(shù)審查通過(guò)之后再由使用部門的負(fù)責(zé)人從管理角度進(jìn)行復(fù)審。 模塊是由邊界元素限定的相鄰程序元素(例如,數(shù)據(jù)說(shuō)明,可執(zhí)行的語(yǔ)句)的序列,而且有一個(gè)總體標(biāo)識(shí)符代表它。按照模塊的定義,過(guò)程、函數(shù)、子程序和宏等,都可作為模塊。面向?qū)ο蠓椒▽W(xué)中的對(duì)象是模塊,對(duì)象內(nèi)的方法(或稱為服務(wù))也是模塊。模塊是構(gòu)成程序的基本構(gòu)件。5.2 設(shè)計(jì)原理 5.2.1 模塊化 模塊化就是把程序劃分成獨(dú)立命名且可獨(dú)立訪問(wèn)的模塊,每個(gè)模塊完成一個(gè)子功能,把這些模塊集成起來(lái)構(gòu)成一個(gè)整體

10、,可以完成指定的功能滿足用戶的需求。有人說(shuō),模塊化是為了使一個(gè)復(fù)雜的大型程序能被人的智力所管理,軟件應(yīng)該具備的惟一屬性。如果一個(gè)大型程序僅由一個(gè)模塊組成,它將很難被人所理解。下面根據(jù)人類解決問(wèn)題的一般規(guī)律,論證上面的結(jié)論。設(shè)函數(shù)C(x)定義問(wèn)題x的復(fù)雜程度,函數(shù)E(x)確定解決問(wèn)題x需要的工作量(時(shí)間)。對(duì)于兩個(gè)問(wèn)題P1和P2,如果C(P1)C(P2) 顯然E(P1)E(P2)根據(jù)人類解決一般問(wèn)題的經(jīng)驗(yàn),另一個(gè)有趣的規(guī)律是C(P1+P2)C(P1)+C(P2)也就是說(shuō),如果一個(gè)問(wèn)題由P1和P2兩個(gè)問(wèn)題組合而成,那么它的復(fù)雜程度大于分別考慮每個(gè)問(wèn)題時(shí)的復(fù)雜程度之和。綜上所述,得到下面的不等式E(

11、P1+P2)E(P1)+E(P2)這個(gè)不等式導(dǎo)致“各個(gè)擊破”的結(jié)論把復(fù)雜的問(wèn)題分解成許多容易解決的小問(wèn)題,原來(lái)的問(wèn)題也就容易解決了。這就是模塊化的根據(jù)。 由上面的不等式似乎還能得出下述結(jié)論:如果無(wú)限地分割軟件,最后為了開發(fā)軟件而需要的工作量也就小得可以忽略了。事實(shí)上,還有另一個(gè)因素在起作用,從而使得上述結(jié)論不能成立。參看圖5.1,當(dāng)模塊數(shù)目增加時(shí)每個(gè)模塊的規(guī)模將減小,開發(fā)單個(gè)模塊需要的成本(工作量)確實(shí)減少了;但是,隨著模塊數(shù)目增加,設(shè)計(jì)模塊間接口所需要的工作量也將增加。根據(jù)這兩個(gè)因素,得出了圖中的總成本曲線。每個(gè)程序都相應(yīng)地有一個(gè)最適當(dāng)?shù)哪K數(shù)目M,使得系統(tǒng)的開發(fā)成本最小。 圖5.1 模塊化

12、和軟件成本 雖然目前還不能精確地決定M的數(shù)值,但是在考慮模塊化的時(shí)候總成本曲線確實(shí)是有用的指南。采用模塊化原理可以使軟件結(jié)構(gòu)清晰,不僅容易設(shè)計(jì)也容易閱讀和理解。因?yàn)槌绦蝈e(cuò)誤通常局限在有關(guān)的模塊及它們之間的接口中,所以模塊化使軟件容易測(cè)試和調(diào)試,因而有助于提高軟件的可靠性。因?yàn)樽儎?dòng)往往只涉及少數(shù)幾個(gè)模塊,所以模塊化能夠提高軟件的可修改性。模塊化也有助于軟件開發(fā)工程的組織管理,一個(gè)復(fù)雜的大型程序可以由許多程序員分工編寫不同的模塊,并且可以進(jìn)一步分配技術(shù)熟練的程序員編寫困難的模塊。 人類在認(rèn)識(shí)復(fù)雜現(xiàn)象的過(guò)程中使用的最強(qiáng)有力的思維工具是抽象。人們?cè)趯?shí)踐中認(rèn)識(shí)到,在現(xiàn)實(shí)世界中一定事物、狀態(tài)或過(guò)程之間總存

13、在著某些相似的方面(共性)。把這些相似的方面集中和概括起來(lái),暫時(shí)忽略它們之間的差異,這就是抽象?;蛘哒f(shuō)抽象就是抽出事物的本質(zhì)特性而暫時(shí)不考慮它們的細(xì)節(jié)。5.2.2 抽象 由于人類思維能力的限制,如果每次面臨的因素太多,是不可能做出精確思維的。處理復(fù)雜系統(tǒng)的惟一有效的方法是用層次的方式構(gòu)造和分析它。一個(gè)復(fù)雜的動(dòng)態(tài)系統(tǒng)首先可以用一些高級(jí)的抽象概念構(gòu)造和理解,這些高級(jí)概念又可以用一些較低級(jí)的概念構(gòu)造和理解,如此進(jìn)行下去,直至最低層次的具體元素。這種層次的思維和解題方式必須反映在定義動(dòng)態(tài)系統(tǒng)的程序結(jié)構(gòu)之中,每級(jí)的一個(gè)概念將以某種方式對(duì)應(yīng)于程序的一組成分。 考慮對(duì)任何問(wèn)題的模塊化解法時(shí),可以提出許多抽象

14、的層次。在抽象的最高層次使用問(wèn)題環(huán)境的語(yǔ)言,以概括的方式敘述問(wèn)題的解法;在較低抽象層次采用更過(guò)程化的方法,把面向問(wèn)題的術(shù)語(yǔ)和面向?qū)崿F(xiàn)的術(shù)語(yǔ)結(jié)合起來(lái)敘述問(wèn)題的解法;最后在最低的抽象層次用可直接實(shí)現(xiàn)的方式敘述問(wèn)題的解法。軟件工程過(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á)到了抽象的最低層。 逐步求精和模塊化的概念,與抽象是緊密相關(guān)的。隨著軟件開發(fā)工程的進(jìn)展,在軟件結(jié)構(gòu)每一層中的模塊,表示了對(duì)軟件抽象層次

15、的一次精化。事實(shí)上,軟件結(jié)構(gòu)頂層的模塊,控制了系統(tǒng)的主要功能并且影響全局;在軟件結(jié)構(gòu)底層的模塊,完成對(duì)數(shù)據(jù)的一個(gè)具體處理,用自頂向下由抽象到具體的方式分配控制,簡(jiǎn)化了軟件的設(shè)計(jì)和實(shí)現(xiàn),提高了軟件的可理解性和可測(cè)試性,并且使軟件更容易維護(hù)。 逐步求精是人類解決復(fù)雜問(wèn)題時(shí)采用的基本方法,也是許多軟件工程技術(shù)(例如,規(guī)格說(shuō)明技術(shù),設(shè)計(jì)和實(shí)現(xiàn)技術(shù))的基礎(chǔ)。可以把逐步求精定義為:“為了能集中精力解決主要問(wèn)題而盡量推遲對(duì)問(wèn)題細(xì)節(jié)的考慮?!敝鸩角缶匀绱酥匾且?yàn)槿祟惖恼J(rèn)知過(guò)程遵守Miller法則:一個(gè)人在任何時(shí)候都只能把注意力集中在(72)個(gè)知識(shí)塊上。5.2.3 逐步求精 但是,在開發(fā)軟件的過(guò)程中,

16、軟件工程師在一段時(shí)間內(nèi)需要考慮的知識(shí)塊數(shù)遠(yuǎn)遠(yuǎn)多于7。例如,一個(gè)程序通常不止使用7個(gè)數(shù)據(jù),一個(gè)用戶也往往有不止7個(gè)方面的需求。逐步求精方法的強(qiáng)大作用就在于,它能幫助軟件工程師把精力集中在與當(dāng)前開發(fā)階段最相關(guān)的那些方面上,而忽略那些對(duì)整體解決方案來(lái)說(shuō)雖然是必要的,然而目前還不需要考慮的細(xì)節(jié),這些細(xì)節(jié)將留到以后再考慮。Miller法則是人類智力的基本局限,我們不可能戰(zhàn)勝自己的自然本性,只能接受這個(gè)事實(shí),承認(rèn)自身的局限性,并在這個(gè)前提下盡我們的最大努力工作。 事實(shí)上,可以把逐步求精看作是一項(xiàng)把一個(gè)時(shí)期內(nèi)必須解決的種種問(wèn)題按優(yōu)先級(jí)排序的技術(shù)。逐步求精方法確保每個(gè)問(wèn)題都將被解決,而且每個(gè)問(wèn)題都將在適當(dāng)?shù)臅r(shí)

17、候被解決,但是,在任何時(shí)候一個(gè)人都不需要同時(shí)處理7個(gè)以上知識(shí)塊。逐步求精最初是由Niklaus Wirth提出的一種自頂向下的設(shè)計(jì)策略。按照這種設(shè)計(jì)策略,程序的體系結(jié)構(gòu)是通過(guò)逐步精化處理過(guò)程的層次而設(shè)計(jì)出來(lái)的。通過(guò)逐步分解對(duì)功能的宏觀陳述而開發(fā)出層次結(jié)構(gòu),直至最終得出用程序設(shè)計(jì)語(yǔ)言表達(dá)的程序。Wirth本人對(duì)逐步求精策略曾做過(guò)如下的概括說(shuō)明: “我們對(duì)付復(fù)雜問(wèn)題的最重要的辦法是抽象,因此,對(duì)一個(gè)復(fù)雜的問(wèn)題不應(yīng)該立刻用計(jì)算機(jī)指令、數(shù)字和邏輯符號(hào)來(lái)表示,而應(yīng)該用較自然的抽象語(yǔ)句來(lái)表示,從而得出抽象程序。抽象程序?qū)Τ橄蟮臄?shù)據(jù)進(jìn)行某些特定的運(yùn)算并用某些合適的記號(hào)(可能是自然語(yǔ)言)來(lái)表示。對(duì)抽象程序做進(jìn)

18、一步的分解,并進(jìn)入下一個(gè)抽象層次,這樣的精細(xì)化過(guò)程一直進(jìn)行下去,直到程序能被計(jì)算機(jī)接受為止。這時(shí)的程序可能是用某種高級(jí)語(yǔ)言或機(jī)器指令書寫的。” 求精實(shí)際上是細(xì)化過(guò)程。我們從在高抽象級(jí)別定義的功能陳述(或信息描述)開始,也就是說(shuō),該陳述僅僅概念性地描述了功能或信息,但是并沒(méi)有提供功能的內(nèi)部工作情況或信息的內(nèi)部結(jié)構(gòu)。求精要求設(shè)計(jì)者細(xì)化原始陳述,隨著每個(gè)后續(xù)求精(即細(xì)化)步驟的完成而提供越來(lái)越多的細(xì)節(jié)。抽象與求精是一對(duì)互補(bǔ)的概念。抽象使得設(shè)計(jì)者能夠說(shuō)明過(guò)程和數(shù)據(jù),同時(shí)卻忽略低層細(xì)節(jié)。事實(shí)上,可以把抽象看作是一種通過(guò)忽略多余的細(xì)節(jié)同時(shí)強(qiáng)調(diào)有關(guān)的細(xì)節(jié),而實(shí)現(xiàn)逐步求精的方法。求精則幫助設(shè)計(jì)者在設(shè)計(jì)過(guò)程中逐

19、步揭示出低層細(xì)節(jié)。這兩個(gè)概念都有助于設(shè)計(jì)者在設(shè)計(jì)演化過(guò)程中創(chuàng)造出完整的設(shè)計(jì)模型。 應(yīng)用模塊化原理時(shí),自然會(huì)產(chǎn)生的一個(gè)問(wèn)題是:“為了得到最好的一組模塊,應(yīng)該怎樣分解軟件呢?”信息隱藏原理指出:應(yīng)該這樣設(shè)計(jì)和確定模塊,使得一個(gè)模塊內(nèi)包含的信息(過(guò)程和數(shù)據(jù))對(duì)于不需要這些信息的模塊來(lái)說(shuō),是不能訪問(wèn)的。局部化的概念和信息隱藏概念是密切相關(guān)的。所謂局部化是指把一些關(guān)系密切的軟件元素物理地放得彼此靠近。在模塊中使用局部數(shù)據(jù)元素是局部化的一個(gè)例子。顯然,局部化有助于實(shí)現(xiàn)信息隱藏。5.2.4 信息隱藏和局部化 實(shí)際上,應(yīng)該隱藏的不是有關(guān)模塊的一切信息,而是模塊的實(shí)現(xiàn)細(xì)節(jié)。因此,有人主張把這條原理稱為“細(xì)節(jié)隱藏

20、”?!半[藏”意味著有效的模塊化可以通過(guò)定義一組獨(dú)立的模塊而實(shí)現(xiàn),這些獨(dú)立的模塊彼此間僅僅交換那些為了完成系統(tǒng)功能而必須交換的信息。如果在測(cè)試期間和以后的軟件維護(hù)期間需要修改軟件,那么使用信息隱藏原理作為模塊化系統(tǒng)設(shè)計(jì)的標(biāo)準(zhǔn)就會(huì)帶來(lái)極大好處。因?yàn)榻^大多數(shù)數(shù)據(jù)和過(guò)程對(duì)于軟件的其他部分而言是隱藏的(也就是“看”不見的),在修改期間由于疏忽而引入的錯(cuò)誤就很少可能傳播到軟件的其他部分。 模塊獨(dú)立的概念是模塊化、抽象、信息隱藏和局部化概念的直接結(jié)果。開發(fā)具有獨(dú)立功能而且和其他模塊之間沒(méi)有過(guò)多的相互作用的模塊,就可以做到模塊獨(dú)立。換句話說(shuō),希望這樣設(shè)計(jì)軟件結(jié)構(gòu),使得每個(gè)模塊完成一個(gè)相對(duì)獨(dú)立的特定子功能,并且

21、和其他模塊之間的關(guān)系很簡(jiǎn)單。5.2.5 模塊獨(dú)立 為什么模塊的獨(dú)立性很重要呢?主要有兩條理由:第一,有效的模塊化(即具有獨(dú)立的模塊)的軟件比較容易開發(fā)出來(lái)。這是由于能夠分割功能而且接口可以簡(jiǎn)化,當(dāng)許多人分工合作開發(fā)同一個(gè)軟件時(shí),這個(gè)優(yōu)點(diǎn)尤其重要。第二,獨(dú)立的模塊比較容易測(cè)試和維護(hù)。這是因?yàn)橄鄬?duì)說(shuō)來(lái),修改設(shè)計(jì)和程序需要的工作量比較小,錯(cuò)誤傳播范圍小,需要擴(kuò)充功能時(shí)能夠“插入”模塊??傊K獨(dú)立是好設(shè)計(jì)的關(guān)鍵,而設(shè)計(jì)又是決定軟件質(zhì)量的關(guān)鍵環(huán)節(jié)。 模塊的獨(dú)立程度可以由兩個(gè)定性標(biāo)準(zhǔn)度量,這兩個(gè)標(biāo)準(zhǔn)分別稱為內(nèi)聚和耦合。耦合衡量不同模塊彼此間互相依賴(連接)的緊密程度;內(nèi)聚衡量一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)

22、合的緊密程度。以下分別詳細(xì)闡述。1. 耦合耦合是對(duì)一個(gè)軟件結(jié)構(gòu)內(nèi)不同模塊之間互連程度的度量。耦合強(qiáng)弱取決于模塊間接口的復(fù)雜程度,進(jìn)入或訪問(wèn)一個(gè)模塊的點(diǎn),以及通過(guò)接口的數(shù)據(jù)。 在軟件設(shè)計(jì)中應(yīng)該追求盡可能松散耦合的系統(tǒng)。在這樣的系統(tǒng)中可以研究、測(cè)試或維護(hù)任何一個(gè)模塊,而不需要對(duì)系統(tǒng)的其他模塊有很多了解。此外,由于模塊間聯(lián)系簡(jiǎn)單,發(fā)生在一處的錯(cuò)誤傳播到整個(gè)系統(tǒng)的可能性就很小。因此,模塊間的耦合程度強(qiáng)烈影響系統(tǒng)的可理解性、可測(cè)試性、可靠性和可維護(hù)性。如果兩個(gè)模塊中的每一個(gè)都能獨(dú)立地工作而不需要另一個(gè)模塊的存在,那么它們彼此完全獨(dú)立,這意味著模塊間無(wú)任何連接,耦合程度最低。但是,在一個(gè)軟件系統(tǒng)中不可能所

23、有模塊之間都沒(méi)有任何連接。 如果兩個(gè)模塊彼此間通過(guò)參數(shù)交換信息,而且交換的信息僅僅是數(shù)據(jù),那么這種耦合稱為數(shù)據(jù)耦合。如果傳遞的信息中有控制信息(盡管有時(shí)這種控制信息以數(shù)據(jù)的形式出現(xiàn)),則這種耦合稱為控制耦合。數(shù)據(jù)耦合是低耦合。系統(tǒng)中至少必須存在這種耦合,因?yàn)橹挥挟?dāng)某些模塊的輸出數(shù)據(jù)作為另一些模塊的輸入數(shù)據(jù)時(shí),系統(tǒng)才能完成有價(jià)值的功能。一般說(shuō)來(lái),一個(gè)系統(tǒng)內(nèi)可以只包含數(shù)據(jù)耦合。控制耦合是中等程度的耦合,它增加了系統(tǒng)的復(fù)雜程度??刂岂詈贤嵌嘤嗟?,在把模塊適當(dāng)分解之后通常可以用數(shù)據(jù)耦合代替它。 如果被調(diào)用的模塊需要使用作為參數(shù)傳遞進(jìn)來(lái)的數(shù)據(jù)結(jié)構(gòu)中的所有元素,那么,把整個(gè)數(shù)據(jù)結(jié)構(gòu)作為參數(shù)傳遞就是完全

24、正確的。但是,當(dāng)把整個(gè)數(shù)據(jù)結(jié)構(gòu)作為參數(shù)傳遞而被調(diào)用的模塊只需要使用其中一部分?jǐn)?shù)據(jù)元素時(shí),就出現(xiàn)了特征耦合。在這種情況下,被調(diào)用的模塊可以使用的數(shù)據(jù)多于它確實(shí)需要的數(shù)據(jù),這將導(dǎo)致對(duì)數(shù)據(jù)的訪問(wèn)失去控制,從而給計(jì)算機(jī)犯罪提供了機(jī)會(huì)。當(dāng)兩個(gè)或多個(gè)模塊通過(guò)一個(gè)公共數(shù)據(jù)環(huán)境相互作用時(shí),它們之間的耦合稱為公共環(huán)境耦合。公共環(huán)境可以是全程變量、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)、任何存儲(chǔ)介質(zhì)上的文件、物理設(shè)備等等。 公共環(huán)境耦合的復(fù)雜程度隨耦合的模塊個(gè)數(shù)而變化,當(dāng)耦合的模塊個(gè)數(shù)增加時(shí)復(fù)雜程度顯著增加。如果只有兩個(gè)模塊有公共環(huán)境,那么這種耦合有下面兩種可能:(1) 一個(gè)模塊往公共環(huán)境送數(shù)據(jù),另一個(gè)模塊從公共環(huán)境取數(shù)

25、據(jù)。這是數(shù)據(jù)耦合的一種形式,是比較松散的耦合。(2) 兩個(gè)模塊都既往公共環(huán)境送數(shù)據(jù)又從里面取數(shù)據(jù),這種耦合比較緊密,介于數(shù)據(jù)耦合和控制耦合之間。如果兩個(gè)模塊共享的數(shù)據(jù)很多,都通過(guò)參數(shù)傳遞可能很不方便,這時(shí)可以利用公共環(huán)境耦合。 最高程度的耦合是內(nèi)容耦合。如果出現(xiàn)下列情況之一,兩個(gè)模塊間就發(fā)生了內(nèi)容耦合:一個(gè)模塊訪問(wèn)另一個(gè)模塊的內(nèi)部數(shù)據(jù);一個(gè)模塊不通過(guò)正常入口而轉(zhuǎn)到另一個(gè)模塊的內(nèi)部;兩個(gè)模塊有一部分程序代碼重疊(只可能出現(xiàn)在匯編程序中);一個(gè)模塊有多個(gè)入口(這意味著一個(gè)模塊有幾種功能)。應(yīng)該堅(jiān)決避免使用內(nèi)容耦合。事實(shí)上許多高級(jí)程序設(shè)計(jì)語(yǔ)言已經(jīng)設(shè)計(jì)成不允許在程序中出現(xiàn)任何形式的內(nèi)容耦合。 總之,耦

26、合是影響軟件復(fù)雜程度的一個(gè)重要因素。應(yīng)該采取下述設(shè)計(jì)原則:盡量使用數(shù)據(jù)耦合,少用控制耦合和特征耦合,限制公共環(huán)境耦合的范圍,完全不用內(nèi)容耦合。2. 內(nèi)聚內(nèi)聚標(biāo)志一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,它是信息隱藏和局部化概念的自然擴(kuò)展。簡(jiǎn)單地說(shuō),理想內(nèi)聚的模塊只做一件事情。設(shè)計(jì)時(shí)應(yīng)該力求做到高內(nèi)聚,通常中等程度的內(nèi)聚也是可以采用的,而且效果和高內(nèi)聚相差不多;但是,低內(nèi)聚很壞,不要使用。 內(nèi)聚和耦合是密切相關(guān)的,模塊內(nèi)的高內(nèi)聚往往意味著模塊間的松耦合。內(nèi)聚和耦合都是進(jìn)行模塊化設(shè)計(jì)的有力工具,但是實(shí)踐表明內(nèi)聚更重要,應(yīng)該把更多注意力集中到提高模塊的內(nèi)聚程度上。低內(nèi)聚有如下幾類:如果一個(gè)模塊完成一組任

27、務(wù),這些任務(wù)彼此間即使有關(guān)系,關(guān)系也是很松散的,就叫做偶然內(nèi)聚。有時(shí)在寫完一個(gè)程序之后,發(fā)現(xiàn)一組語(yǔ)句在兩處或多處出現(xiàn),于是把這些語(yǔ)句作為一個(gè)模塊以節(jié)省內(nèi)存,這樣就出現(xiàn)了偶然內(nèi)聚的模塊。如果一個(gè)模塊完成的任務(wù)在邏輯上屬于相同或相似的一類,則稱為邏輯內(nèi)聚。如果一個(gè)模塊包含的任務(wù)必須在同一段時(shí)間內(nèi)執(zhí)行,就叫時(shí)間內(nèi)聚。 在偶然內(nèi)聚的模塊中,各種元素之間沒(méi)有實(shí)質(zhì)性聯(lián)系,很可能在一種應(yīng)用場(chǎng)合需要修改這個(gè)模塊,在另一種應(yīng)用場(chǎng)合又不允許這種修改,從而陷入困境。事實(shí)上,偶然內(nèi)聚的模塊出現(xiàn)修改錯(cuò)誤的概率比其他類型的模塊高得多。在邏輯內(nèi)聚的模塊中,不同功能混在一起,合用部分程序代碼,即使局部功能的修改有時(shí)也會(huì)影響全

28、局。因此,這類模塊的修改也比較困難。時(shí)間關(guān)系在一定程度上反映了程序的某些實(shí)質(zhì),所以時(shí)間內(nèi)聚比邏輯內(nèi)聚好一些。 中內(nèi)聚主要有兩類:如果一個(gè)模塊內(nèi)的處理元素是相關(guān)的,而且必須以特定次序執(zhí)行,則稱為過(guò)程內(nèi)聚。使用程序流程圖作為工具設(shè)計(jì)軟件時(shí),常常通過(guò)研究流程圖確定模塊的劃分,這樣得到的往往是過(guò)程內(nèi)聚的模塊。如果模塊中所有元素都使用同一個(gè)輸入數(shù)據(jù)和(或)產(chǎn)生同一個(gè)輸出數(shù)據(jù),則稱為通信內(nèi)聚。 高內(nèi)聚也有兩類:如果一個(gè)模塊內(nèi)的處理元素和同一個(gè)功能密切相關(guān),而且這些處理必須順序執(zhí)行(通常一個(gè)處理元素的輸出數(shù)據(jù)作為下一個(gè)處理元素的輸入數(shù)據(jù)),則稱為順序內(nèi)聚。根據(jù)數(shù)據(jù)流圖劃分模塊時(shí),通常得到順序內(nèi)聚的模塊,這種

29、模塊彼此間的連接往往比較簡(jiǎn)單。如果模塊內(nèi)所有處理元素屬于一個(gè)整體,完成一個(gè)單一的功能,則稱為功能內(nèi)聚。功能內(nèi)聚是最高程度的內(nèi)聚。耦合和內(nèi)聚的概念是Constantine,Yourdon,Myers和Stevens等人提出來(lái)的。按照他們的觀點(diǎn),如果給上述七種內(nèi)聚的優(yōu)劣評(píng)分,將得到如下結(jié)果: 功能內(nèi)聚10分時(shí)間內(nèi)聚3分順序內(nèi)聚9分邏輯內(nèi)聚1分通信內(nèi)聚7分偶然內(nèi)聚0分過(guò)程內(nèi)聚5分事實(shí)上,沒(méi)有必要精確確定內(nèi)聚的級(jí)別。重要的是設(shè)計(jì)時(shí)力爭(zhēng)做到高內(nèi)聚,并且能夠辨認(rèn)出低內(nèi)聚的模塊,有能力通過(guò)修改設(shè)計(jì)提高模塊的內(nèi)聚程度降低模塊間的耦合程度,從而獲得較高的模塊獨(dú)立性。 人們?cè)陂_發(fā)計(jì)算機(jī)軟件的長(zhǎng)期實(shí)踐中積累了豐富的

30、經(jīng)驗(yàn),總結(jié)這些經(jīng)驗(yàn)得出了一些啟發(fā)式規(guī)則。這些啟發(fā)式規(guī)則雖然不像上一節(jié)講述的基本原理和概念那樣普遍適用,但是在許多場(chǎng)合仍然能給軟件工程師以有益的啟示,往往能幫助他們找到改進(jìn)軟件設(shè)計(jì)提高軟件質(zhì)量的途徑。下面介紹幾條啟發(fā)式規(guī)則。5.3 啟發(fā)規(guī)則 1. 改進(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ù)雜程度。 2. 模塊規(guī)模應(yīng)該適中經(jīng)驗(yàn)表明,一個(gè)模塊的規(guī)模不應(yīng)過(guò)大,最好能寫在一頁(yè)紙內(nèi)(通常

31、不超過(guò)60行語(yǔ)句)。有人從心理學(xué)角度研究得知,當(dāng)一個(gè)模塊包含的語(yǔ)句數(shù)超過(guò)30以后,模塊的可理解程度迅速下降。過(guò)大的模塊往往是由于分解不充分,但是進(jìn)一步分解必須符合問(wèn)題結(jié)構(gòu),一般說(shuō)來(lái),分解后不應(yīng)該降低模塊獨(dú)立性。過(guò)小的模塊開銷大于有效操作,而且模塊數(shù)目過(guò)多將使系統(tǒng)接口復(fù)雜。因此過(guò)小的模塊有時(shí)不值得單獨(dú)存在,特別是只有一個(gè)模塊調(diào)用它時(shí),通??梢园阉喜⒌缴霞?jí)模塊中去而不必單獨(dú)存在。 3. 深度、寬度、扇出和扇入都應(yīng)適當(dāng)深度表示軟件結(jié)構(gòu)中控制的層數(shù),它往往能粗略地標(biāo)志一個(gè)系統(tǒng)的大小和復(fù)雜程度。深度和程序長(zhǎng)度之間應(yīng)該有粗略的對(duì)應(yīng)關(guān)系,當(dāng)然這個(gè)對(duì)應(yīng)關(guān)系是在一定范圍內(nèi)變化的。如果層數(shù)過(guò)多則應(yīng)該考慮是否有許

32、多管理模塊過(guò)分簡(jiǎn)單了,能否適當(dāng)合并。寬度是軟件結(jié)構(gòu)內(nèi)同一個(gè)層次上的模塊總數(shù)的最大值。一般說(shuō)來(lái),寬度越大系統(tǒng)越復(fù)雜。對(duì)寬度影響最大的因素是模塊的扇出。 扇出是一個(gè)模塊直接控制(調(diào)用)的模塊數(shù)目,扇出過(guò)大意味著模塊過(guò)分復(fù)雜,需要控制和協(xié)調(diào)過(guò)多的下級(jí)模塊;扇出過(guò)小(例如總是1)也不好。經(jīng)驗(yàn)表明,一個(gè)設(shè)計(jì)得好的典型系統(tǒng)的平均扇出通常是3或4(扇出的上限通常是59)。扇出太大一般是因?yàn)槿狈χ虚g層次,應(yīng)該適當(dāng)增加中間層次的控制模塊。扇出太小時(shí)可以把下級(jí)模塊進(jìn)一步分解成若干個(gè)子功能模塊,或者合并到它的上級(jí)模塊中去。當(dāng)然分解模塊或合并模塊必須符合問(wèn)題結(jié)構(gòu),不能違背模塊獨(dú)立原理。 一個(gè)模塊的扇入表明有多少個(gè)上級(jí)

33、模塊直接調(diào)用它,扇入越大則共享該模塊的上級(jí)模塊數(shù)目越多,這是有好處的,但是,不能違背模塊獨(dú)立原理單純追求高扇入。觀察大量軟件系統(tǒng)后發(fā)現(xiàn),設(shè)計(jì)得很好的軟件結(jié)構(gòu)通常頂層扇出比較高,中層扇出較少,底層扇入到公共的實(shí)用模塊中去(底層模塊有高扇入)。 4. 模塊的作用域應(yīng)該在控制域之內(nèi)模塊的作用域定義為受該模塊內(nèi)一個(gè)判定影響的所有模塊的集合。模塊的控制域是這個(gè)模塊本身以及所有直接或間接從屬于它的模塊的集合。例如,在圖5.2中模塊A的控制域是A、B、C、D、E、F等模塊的集合。在一個(gè)設(shè)計(jì)得很好的系統(tǒng)中,所有受判定影響的模塊應(yīng)該都從屬于做出判定的那個(gè)模塊,最好局限于做出判定的那個(gè)模塊本身及它的直屬下級(jí)模塊。

34、 圖5.2 模塊的作用域和控制域 5. 力爭(zhēng)降低模塊接口的復(fù)雜程度模塊接口復(fù)雜是軟件發(fā)生錯(cuò)誤的一個(gè)主要原因。應(yīng)該仔細(xì)設(shè)計(jì)模塊接口,使得信息傳遞簡(jiǎn)單并且和模塊的功能一致。接口復(fù)雜或不一致(即看起來(lái)傳遞的數(shù)據(jù)之間沒(méi)有聯(lián)系),是緊耦合或低內(nèi)聚的征兆,應(yīng)該重新分析這個(gè)模塊的獨(dú)立性。6. 設(shè)計(jì)單入口單出口的模塊這條啟發(fā)式規(guī)則警告軟件工程師不要使模塊間出現(xiàn)內(nèi)容耦合。當(dāng)從頂部進(jìn)入模塊并且從底部退出來(lái)時(shí),軟件是比較容易理解的,因此也是比較容易維護(hù)的。 7. 模塊功能應(yīng)該可以預(yù)測(cè)模塊的功能應(yīng)該能夠預(yù)測(cè),但也要防止模塊功能過(guò)分局限。如果一個(gè)模塊可以當(dāng)做一個(gè)黑盒子,也就是說(shuō),只要輸入的數(shù)據(jù)相同就產(chǎn)生同樣的輸出,這個(gè)

35、模塊的功能就是可以預(yù)測(cè)的。帶有內(nèi)部“存儲(chǔ)器”的模塊的功能可能是不可預(yù)測(cè)的,因?yàn)樗妮敵隹赡苋Q于內(nèi)部存儲(chǔ)器(例如某個(gè)標(biāo)記)的狀態(tài)。由于內(nèi)部存儲(chǔ)器對(duì)于上級(jí)模塊而言是不可見的,所以這樣的模塊既不易理解又難于測(cè)試和維護(hù)。 如果一個(gè)模塊只完成一個(gè)單獨(dú)的子功能,則呈現(xiàn)高內(nèi)聚;但是,如果一個(gè)模塊任意限制局部數(shù)據(jù)結(jié)構(gòu)的大小,過(guò)分限制在控制流中可以做出的選擇或者外部接口的模式,那么這種模塊的功能就過(guò)分局限,使用范圍也就過(guò)分狹窄了。在使用過(guò)程中將不可避免地需要修改功能過(guò)分局限的模塊,以提高模塊的靈活性,擴(kuò)大它的使用范圍;但是,在使用現(xiàn)場(chǎng)修改軟件的代價(jià)是很高的。以上列出的啟發(fā)式規(guī)則多數(shù)是經(jīng)驗(yàn)規(guī)律,對(duì)改進(jìn)設(shè)計(jì),提高

36、軟件質(zhì)量,往往有重要的參考價(jià)值;但是,它們既不是設(shè)計(jì)的目標(biāo)也不是設(shè)計(jì)時(shí)應(yīng)該普遍遵循的原理。 層次圖用來(lái)描繪軟件的層次結(jié)構(gòu)。在圖5.2中已經(jīng)非正式地使用了層次圖。雖然層次圖的形式和第3.7節(jié)中介紹的描繪數(shù)據(jù)結(jié)構(gòu)的層次方框圖相同,但是表現(xiàn)的內(nèi)容卻完全不同。層次圖中的一個(gè)矩形框代表一個(gè)模塊,方框間的連線表示調(diào)用關(guān)系而不像層次方框圖那樣表示組成關(guān)系。圖5.3是層次圖的一個(gè)例子。5.4 描繪軟件結(jié)構(gòu)的圖形工具 5.4.1 層次圖和HIPO圖 圖5.3 正文加工系統(tǒng)的層次圖 層次圖很適于在自頂向下設(shè)計(jì)軟件的過(guò)程中使用。HIPO圖是美國(guó)IBM公司發(fā)明的“層次圖加輸入/處理/輸出圖”的英文縮寫。為了能使HIP

37、O圖具有可追蹤性,在H圖(層次圖)里除了最頂層的方框之外,每個(gè)方框都加了編號(hào)。編號(hào)規(guī)則和第2.4節(jié)中介紹的數(shù)據(jù)流圖的編號(hào)規(guī)則相同,例如,圖5.3加了編號(hào)后得到圖5.4。和H圖中每個(gè)方框相對(duì)應(yīng),應(yīng)該有一張IPO圖描繪這個(gè)方框代表的模塊的處理過(guò)程。HIPO圖中的每張IPO圖內(nèi)都應(yīng)該明顯地標(biāo)出它所描繪的模塊在H圖中的編號(hào),以便追蹤了解這個(gè)模塊在軟件結(jié)構(gòu)中的位置。 圖5.4 帶編號(hào)的層次圖(H圖) Yourdon提出的結(jié)構(gòu)圖是進(jìn)行軟件結(jié)構(gòu)設(shè)計(jì)的另一個(gè)有力工具。結(jié)構(gòu)圖和層次圖類似,也是描繪軟件結(jié)構(gòu)的圖形工具,圖中一個(gè)方框代表一個(gè)模塊,框內(nèi)注明模塊的名字或主要功能;方框之間的箭頭(或直線)表示模塊的調(diào)用關(guān)

38、系。因?yàn)榘凑諔T例總是圖中位于上方的方框代表的模塊調(diào)用下方的模塊,即使不用箭頭也不會(huì)產(chǎn)生二義性,為了簡(jiǎn)單起見,可以只用直線而不用箭頭表示模塊間的調(diào)用關(guān)系。5.4.2 結(jié)構(gòu)圖 在結(jié)構(gòu)圖中通常還用帶注釋的箭頭表示模塊調(diào)用過(guò)程中來(lái)回傳遞的信息。如果希望進(jìn)一步標(biāo)明傳遞的信息是數(shù)據(jù)還是控制信息,則可以利用注釋箭頭尾部的形狀來(lái)區(qū)分:尾部是空心圓表示傳遞的是數(shù)據(jù),實(shí)心圓表示傳遞的是控制信息。圖5.5是結(jié)構(gòu)圖的一個(gè)例子。以上介紹的是結(jié)構(gòu)圖的基本符號(hào),也就是最經(jīng)常使用的符號(hào)。此外還有一些附加的符號(hào),可以表示模塊的選擇調(diào)用或循環(huán)調(diào)用。圖5.6表示當(dāng)模塊M中某個(gè)判定為真時(shí)調(diào)用模塊A,為假時(shí)調(diào)用模塊B。圖5.7表示模塊

39、M循環(huán)調(diào)用模塊A、B和C。 圖5.5 結(jié)構(gòu)圖的例子產(chǎn)生最佳解的一般結(jié)構(gòu) 圖5.6 判定為真時(shí)調(diào)用A,為假時(shí)調(diào)用B 圖5.7 模塊M循環(huán)調(diào)用模塊A、B、C 注意,層次圖和結(jié)構(gòu)圖并不嚴(yán)格表示模塊的調(diào)用次序。雖然多數(shù)人習(xí)慣于按調(diào)用次序從左到右畫模塊,但并沒(méi)有這種規(guī)定,出于其他方面的考慮(例如為了減少交叉線),也完全可以不按這種次序畫。此外,層次圖和結(jié)構(gòu)圖并不指明什么時(shí)候調(diào)用下層模塊。通常上層模塊中除了調(diào)用下層模塊的語(yǔ)句之外還有其他語(yǔ)句,究竟是先執(zhí)行調(diào)用下層模塊的語(yǔ)句還是先執(zhí)行其他語(yǔ)句,在圖中絲毫沒(méi)有指明。事實(shí)上,層次圖和結(jié)構(gòu)圖只表明一個(gè)模塊調(diào)用那些模塊,至于模塊內(nèi)還有沒(méi)有其他成分則完全沒(méi)有表示。 通

40、常用層次圖作為描繪軟件結(jié)構(gòu)的文檔。結(jié)構(gòu)圖作為文檔并不很合適,因?yàn)閳D上包含的信息太多有時(shí)反而降低了清晰程度。但是,利用IPO圖或數(shù)據(jù)字典中的信息得到模塊調(diào)用時(shí)傳遞的信息,從而由層次圖導(dǎo)出結(jié)構(gòu)圖的過(guò)程,卻可以作為檢查設(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)題。 面向數(shù)據(jù)流的設(shè)計(jì)方法的目標(biāo)是給出設(shè)計(jì)軟件結(jié)構(gòu)的一個(gè)系統(tǒng)化的途徑。在軟件工程的需求分析階段,信息流是一個(gè)關(guān)鍵考慮,通常用數(shù)據(jù)流圖描繪信息在系統(tǒng)中加工和流

41、動(dòng)的情況。面向數(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ì)方法 面向數(shù)據(jù)流的設(shè)計(jì)方法把信息流映射成軟件結(jié)構(gòu),信息流的類型決定了映射的方法。信息流有下述兩種類型。1. 變換流參看圖5.8,信息沿輸入通路進(jìn)入系統(tǒng),同時(shí)由外部形式變換成內(nèi)部形式,進(jìn)入系統(tǒng)的信息通過(guò)變換中心,經(jīng)加工處理以后再沿輸出通路變換成外部形式離開軟件系統(tǒng)。當(dāng)數(shù)據(jù)流圖具有這些特征時(shí),這種信息流就叫作變換流。5

42、.5.1 概念 圖5.8 變換流 圖5.9 事務(wù)流 2. 事務(wù)流基本系統(tǒng)模型意味著變換流,因此,原則上所有信息流都可以歸結(jié)為這一類。但是,當(dāng)數(shù)據(jù)流圖具有和圖5.9類似的形狀時(shí),這種數(shù)據(jù)流是“以事務(wù)為中心的”,也就是說(shuō),數(shù)據(jù)沿輸入通路到達(dá)一個(gè)處理T,這個(gè)處理根據(jù)輸入數(shù)據(jù)的類型在若干個(gè)動(dòng)作序列中選出一個(gè)來(lái)執(zhí)行。這類數(shù)據(jù)流應(yīng)該劃為一類特殊的數(shù)據(jù)流,稱為事務(wù)流。圖5.9中的處理T稱為事務(wù)中心,它完成下述任務(wù):(1) 接收輸入數(shù)據(jù)(輸入數(shù)據(jù)又稱為事務(wù));(2) 分析每個(gè)事務(wù)以確定它的類型;(3) 根據(jù)事務(wù)類型選取一條活動(dòng)通路。 3. 設(shè)計(jì)過(guò)程圖5.10(見書96頁(yè))說(shuō)明了使用面向數(shù)據(jù)流方法逐步設(shè)計(jì)的過(guò)程

43、。應(yīng)該注意,任何設(shè)計(jì)過(guò)程都不是機(jī)械地一成不變的,設(shè)計(jì)首先需要人的判斷力和創(chuàng)造精神,這往往會(huì)凌駕于方法的規(guī)則之上。 變換分析是一系列設(shè)計(jì)步驟的總稱,經(jīng)過(guò)這些步驟把具有變換流特點(diǎn)的數(shù)據(jù)流圖按預(yù)先確定的模式映射成軟件結(jié)構(gòu)。下面通過(guò)一個(gè)例子說(shuō)明變換分析的方法。1. 例子我們已經(jīng)開始進(jìn)入“智能”產(chǎn)品時(shí)代。在這類產(chǎn)品中把軟件做在只讀存儲(chǔ)器中,成為設(shè)備的一部分,從而使設(shè)備具有某些“智能”。因此,這類產(chǎn)品的設(shè)計(jì)都包含軟件開發(fā)的任務(wù)。作為面向數(shù)據(jù)流的設(shè)計(jì)方法中變換分析的例子,考慮汽車數(shù)字儀表板的設(shè)計(jì)。5.5.2 變換分析 假設(shè)的儀表板將完成下述功能:(1) 通過(guò)模數(shù)轉(zhuǎn)換實(shí)現(xiàn)傳感器和微處理機(jī)接口;(2) 在發(fā)光二

44、極管面板上顯示數(shù)據(jù);(3) 指示每小時(shí)英里數(shù)(mph),行駛的里程,每加侖油行駛的英里數(shù)(mpg)等等;(4) 指示加速或減速;(5) 超速警告:如果車速超過(guò)55英里/小時(shí),則發(fā)出超速警告鈴聲。在軟件需求分析階段應(yīng)該對(duì)上述每條要求以及系統(tǒng)的其他特點(diǎn)進(jìn)行全面的分析評(píng)價(jià),建立起必要的文檔資料,特別是數(shù)據(jù)流圖。 2. 設(shè)計(jì)步驟第1步 復(fù)查基本系統(tǒng)模型。復(fù)查的目的是確保系統(tǒng)的輸入數(shù)據(jù)和輸出數(shù)據(jù)符合實(shí)際。第2步 復(fù)查并精化數(shù)據(jù)流圖。應(yīng)該對(duì)需求分析階段得出的數(shù)據(jù)流圖認(rèn)真復(fù)查,并且在必要時(shí)進(jìn)行精化。不僅要確保數(shù)據(jù)流圖給出了目標(biāo)系統(tǒng)的正確的邏輯模型,而且應(yīng)該使數(shù)據(jù)流圖中每個(gè)處理都代表一個(gè)規(guī)模適中相對(duì)獨(dú)立的子功

45、能。假設(shè)在需求分析階段產(chǎn)生的數(shù)字儀表板系統(tǒng)的數(shù)據(jù)流圖如圖5.11(見書97頁(yè))所示。 這個(gè)數(shù)據(jù)流圖對(duì)于軟件結(jié)構(gòu)設(shè)計(jì)的“第一次分割”而言已經(jīng)足夠詳細(xì)了,因此不需要精化就可以進(jìn)行下一個(gè)設(shè)計(jì)步驟。第3步 確定數(shù)據(jù)流圖具有變換特性還是事務(wù)特性。一般地說(shuō),一個(gè)系統(tǒng)中的所有信息流都可以認(rèn)為是變換流,但是,當(dāng)遇到有明顯事務(wù)特性的信息流時(shí),建議采用事務(wù)分析方法進(jìn)行設(shè)計(jì)。在這一步,設(shè)計(jì)人員應(yīng)該根據(jù)數(shù)據(jù)流圖中占優(yōu)勢(shì)的屬性,確定數(shù)據(jù)流的全局特性。此外還應(yīng)該把具有和全局特性不同的特點(diǎn)的局部區(qū)域孤立出來(lái),以后可以按照這些子數(shù)據(jù)流的特點(diǎn)精化根據(jù)全局特性得出的軟件結(jié)構(gòu)。 從圖5.11看出,數(shù)據(jù)沿著兩條輸入通路進(jìn)入系統(tǒng),然后

46、沿著5條通路離開,沒(méi)有明顯的事務(wù)中心。因此可以認(rèn)為這個(gè)信息流具有變換流的總特征。第4步 確定輸入流和輸出流的邊界,從而孤立出變換中心。輸入流和輸出流的邊界和對(duì)它們的解釋有關(guān),也就是說(shuō),不同設(shè)計(jì)人員可能會(huì)在流內(nèi)選取稍微不同的點(diǎn)作為邊界的位置。當(dāng)然在確定邊界時(shí)應(yīng)該仔細(xì)認(rèn)真,但是把邊界沿著數(shù)據(jù)流通路移動(dòng)一個(gè)處理框的距離,通常對(duì)最后的軟件結(jié)構(gòu)只有很小的影響。對(duì)于汽車數(shù)字儀表板的例子,設(shè)計(jì)人員確定的流的邊界如圖5.12(見書98頁(yè))所示。 第5步 完成“第一級(jí)分解”。軟件結(jié)構(gòu)代表對(duì)控制的自頂向下的分配,所謂分解就是分配控制的過(guò)程。對(duì)于變換流的情況,數(shù)據(jù)流圖被映射成一個(gè)特殊的軟件結(jié)構(gòu),這個(gè)結(jié)構(gòu)控制輸入、變

47、換和輸出等信息處理過(guò)程。圖5.13說(shuō)明了第一級(jí)分解的方法。位于軟件結(jié)構(gòu)最頂層的控制模塊Cm協(xié)調(diào)下述從屬的控制功能:輸入信息處理控制模塊Ca,協(xié)調(diào)對(duì)所有輸入數(shù)據(jù)的接收;變換中心控制模塊Ct,管理對(duì)內(nèi)部形式的數(shù)據(jù)的所有操作; 輸出信息處理控制模塊Ce,協(xié)調(diào)輸出信息的產(chǎn)生過(guò)程。雖然圖5.13意味著一個(gè)三叉的控制結(jié)構(gòu),但是,對(duì)一個(gè)大型系統(tǒng)中的復(fù)雜數(shù)據(jù)流可以用兩個(gè)或多個(gè)模塊完成上述一個(gè)模塊的控制功能。應(yīng)該在能夠完成控制功能并且保持好的耦合和內(nèi)聚特性的前提下,盡量使第一級(jí)控制中的模塊數(shù)目取最小值。對(duì)于數(shù)字儀表板的例子,第一級(jí)分解得出的結(jié)構(gòu)如圖5.14所示。每個(gè)控制模塊的名字表明了為它所控制的那些模塊的功能

48、。 圖5.13 第一級(jí)分解的方法 圖5.14 數(shù)字儀表板系統(tǒng)的第一級(jí)分解 第6步 完成“第二級(jí)分解”。所謂第二級(jí)分解就是把數(shù)據(jù)流圖中的每個(gè)處理映射成軟件結(jié)構(gòu)中一個(gè)適當(dāng)?shù)哪K。完成第二級(jí)分解的方法是,從變換中心的邊界開始沿著輸入通路向外移動(dòng),把輸入通路中每個(gè)處理映射成軟件結(jié)構(gòu)中Ca控制下的一個(gè)低層模塊;然后沿輸出通路向外移動(dòng),把輸出通路中每個(gè)處理映射成直接或間接受模塊Ce控制的一個(gè)低層模塊;最后把變換中心內(nèi)的每個(gè)處理映射成受Ct控制的一個(gè)模塊。圖5.15表示進(jìn)行第二級(jí)分解的普遍途徑。 圖5.15 第二級(jí)分解的方法 雖然圖5.15描繪了在數(shù)據(jù)流圖中的處理和軟件結(jié)構(gòu)中的模塊之間的一對(duì)一的映射關(guān)系,但

49、是,不同的映射經(jīng)常出現(xiàn)。應(yīng)該根據(jù)實(shí)際情況以及“好”設(shè)計(jì)的標(biāo)準(zhǔn),進(jìn)行實(shí)際的第二級(jí)分解。對(duì)于數(shù)字儀表板系統(tǒng)的例子,第二級(jí)分解的結(jié)果分別用圖5.16,5.17和5.18描繪。這3張圖表示對(duì)軟件結(jié)構(gòu)的初步設(shè)計(jì)結(jié)果。雖然圖中每個(gè)模塊的名字表明了它的基本功能,但是仍然應(yīng)該為每個(gè)模塊寫一個(gè)簡(jiǎn)要說(shuō)明,描述: 進(jìn)出該模塊的信息(接口描述);模塊內(nèi)部的信息;過(guò)程陳述,包括主要判定點(diǎn)及任務(wù)等;對(duì)約束和特殊特點(diǎn)的簡(jiǎn)短討論。這些描述是第一代的設(shè)計(jì)規(guī)格說(shuō)明,在這個(gè)設(shè)計(jì)時(shí)期進(jìn)一步的精化和補(bǔ)充是經(jīng)常發(fā)生的。第7步 使用設(shè)計(jì)度量和啟發(fā)式規(guī)則對(duì)第一次分割得到的軟件結(jié)構(gòu)進(jìn)一步精化。 圖5.16 未經(jīng)精化的輸入結(jié)構(gòu) 圖5.17 未經(jīng)

50、精化的變換結(jié)構(gòu) 圖5.18 未經(jīng)精化的輸出結(jié)構(gòu) 對(duì)第一次分割得到的軟件結(jié)構(gòu),總可以根據(jù)模塊獨(dú)立原理進(jìn)行精化。為了產(chǎn)生合理的分解,得到盡可能高的內(nèi)聚、盡可能松散的耦合,最重要的是,為了得到一個(gè)易于實(shí)現(xiàn)、易于測(cè)試和易于維護(hù)的軟件結(jié)構(gòu),應(yīng)該對(duì)初步分割得到的模塊進(jìn)行再分解或合并。具體到數(shù)字儀表板的例子,對(duì)于從前面的設(shè)計(jì)步驟得到的軟件結(jié)構(gòu),還可以做許多修改。下面是某些可能的修改:輸入結(jié)構(gòu)中的模塊“轉(zhuǎn)換成rpm”和“收集sps”可以合并;模塊“確定加速/減速”可以放在模塊“計(jì)算mph”下面,以減少耦合; 模塊“加速/減速顯示”可以相應(yīng)地放在模塊“顯示mph”的下面。經(jīng)過(guò)上述修改后的軟件結(jié)構(gòu)畫在圖5.19中

51、。上述7個(gè)設(shè)計(jì)步驟的目的是,開發(fā)出軟件的整體表示。也就是說(shuō),一旦確定了軟件結(jié)構(gòu)就可以把它作為一個(gè)整體來(lái)復(fù)查,從而能夠評(píng)價(jià)和精化軟件結(jié)構(gòu)。在這個(gè)時(shí)期進(jìn)行修改只需要很少的附加工作,但是卻能夠?qū)浖馁|(zhì)量特別是軟件的可維護(hù)性產(chǎn)生深遠(yuǎn)的影響。 圖5.19 精化后的數(shù)字儀表板系統(tǒng)的軟件結(jié)構(gòu) 雖然在任何情況下都可以使用變換分析方法設(shè)計(jì)軟件結(jié)構(gòu),但是在數(shù)據(jù)流具有明顯的事務(wù)特點(diǎn)時(shí),也就是有一個(gè)明顯的“發(fā)射中心”(事務(wù)中心)時(shí),還是以采用事務(wù)分析方法為宜。事務(wù)分析的設(shè)計(jì)步驟和變換分析的設(shè)計(jì)步驟大部分相同或類似,主要差別僅在于由數(shù)據(jù)流圖到軟件結(jié)構(gòu)的映射方法不同。5.5.3 事務(wù)分析 由事務(wù)流映射成的軟件結(jié)構(gòu)包括一

52、個(gè)接收分支和一個(gè)發(fā)送分支。映射出接收分支結(jié)構(gòu)的方法和變換分析映射出輸入結(jié)構(gòu)的方法很相像,即從事務(wù)中心的邊界開始,把沿著接收流通路的處理映射成模塊。發(fā)送分支的結(jié)構(gòu)包含一個(gè)調(diào)度模塊,它控制下層的所有活動(dòng)模塊;然后把數(shù)據(jù)流圖中的每個(gè)活動(dòng)流通路映射成與它的流特征相對(duì)應(yīng)的結(jié)構(gòu)。圖5.20說(shuō)明了上述映射過(guò)程。對(duì)于一個(gè)大系統(tǒng),常常把變換分析和事務(wù)分析應(yīng)用到同一個(gè)數(shù)據(jù)流圖的不同部分,由此得到的子結(jié)構(gòu)形成“構(gòu)件”,可以利用它們構(gòu)造完整的軟件結(jié)構(gòu)。 圖5.20 事務(wù)分析的映射方法 一般說(shuō)來(lái),如果數(shù)據(jù)流不具有顯著的事務(wù)特點(diǎn),最好使用變換分析;反之,如果具有明顯的事務(wù)中心,則應(yīng)該采用事務(wù)分析技術(shù)。但是,機(jī)械地遵循變換

53、分析或事務(wù)分析的映射規(guī)則,很可能會(huì)得到一些不必要的控制模塊,如果它們確實(shí)用處不大,那么可以而且應(yīng)該把它們合并。反之,如果一個(gè)控制模塊功能過(guò)分復(fù)雜,則應(yīng)該分解為兩個(gè)或多個(gè)控制模塊,或者增加中間層次的控制模塊。 考慮設(shè)計(jì)優(yōu)化問(wèn)題時(shí)應(yīng)該記住,“一個(gè)不能工作的最佳設(shè)計(jì)的價(jià)值是值得懷疑的”。軟件設(shè)計(jì)人員應(yīng)該致力于開發(fā)能夠滿足所有功能和性能要求,而且按照設(shè)計(jì)原理和啟發(fā)式設(shè)計(jì)規(guī)則衡量是值得接收的軟件。應(yīng)該在設(shè)計(jì)的早期階段盡量對(duì)軟件結(jié)構(gòu)進(jìn)行精化??梢詫?dǎo)出不同的軟件結(jié)構(gòu),然后對(duì)它們進(jìn)行評(píng)價(jià)和比較,力求得到“最好”的結(jié)果。這種優(yōu)化的可能,是把軟件結(jié)構(gòu)設(shè)計(jì)和過(guò)程設(shè)計(jì)分開的真正優(yōu)點(diǎn)之一。5.5.4 設(shè)計(jì)優(yōu)化 注意,結(jié)

54、構(gòu)簡(jiǎn)單通常既表示設(shè)計(jì)風(fēng)格優(yōu)雅,又表明效率高。設(shè)計(jì)優(yōu)化應(yīng)該力求做到在有效的模塊化的前提下使用最少量的模塊,以及在能夠滿足信息要求的前提下使用最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。對(duì)于時(shí)間是決定性因素的應(yīng)用場(chǎng)合,可能有必要在詳細(xì)設(shè)計(jì)階段,也可能在編寫程序的過(guò)程中進(jìn)行優(yōu)化。軟件開發(fā)人員應(yīng)該認(rèn)識(shí)到,程序中相對(duì)說(shuō)比較小的部分(典型地,10%20%),通常占用全部處理時(shí)間的大部分(50%80%)。用下述方法對(duì)時(shí)間起決定性作用的軟件進(jìn)行優(yōu)化是合理的: (1) 在不考慮時(shí)間因素的前提下開發(fā)并精化軟件結(jié)構(gòu);(2) 在詳細(xì)設(shè)計(jì)階段選出最耗費(fèi)時(shí)間的那些模塊,仔細(xì)地設(shè)計(jì)它們的處理過(guò)程(算法),以求提高效率;(3) 使用高級(jí)程序設(shè)計(jì)語(yǔ)言編

55、寫程序;(4) 在軟件中孤立出那些大量占用處理機(jī)資源的模塊;(5) 必要時(shí)重新設(shè)計(jì)或用依賴于機(jī)器的語(yǔ)言重寫上述大量占用資源的模塊的代碼,以求提高效率。上述優(yōu)化方法遵守了一句格言:“先使它能工作,然后再使它快起來(lái)?!?總體設(shè)計(jì)階段的基本目的是用比較抽象概括的方式確定系統(tǒng)如何完成預(yù)定的任務(wù),也就是說(shuō),應(yīng)該確定系統(tǒng)的物理配置方案,并且進(jìn)而確定組成系統(tǒng)的每個(gè)程序的結(jié)構(gòu)。因此,總體設(shè)計(jì)階段主要由兩個(gè)小階段組成。首先需要進(jìn)行系統(tǒng)設(shè)計(jì),從數(shù)據(jù)流圖出發(fā)設(shè)想完成系統(tǒng)功能的若干種合理的物理方案,分析員應(yīng)該仔細(xì)分析比較這些方案,并且和用戶共同選定一個(gè)最佳方案。然后進(jìn)行軟件結(jié)構(gòu)設(shè)計(jì),確定軟件由哪些模塊組成以及這些模塊

56、之間的動(dòng)態(tài)調(diào)用關(guān)系。層次圖和結(jié)構(gòu)圖是描繪軟件結(jié)構(gòu)的常用工具。5.6 小結(jié) 在進(jìn)行軟件結(jié)構(gòu)設(shè)計(jì)時(shí)應(yīng)該遵循的最主要的原理是模塊獨(dú)立原理,也就是說(shuō),軟件應(yīng)該由一組完成相對(duì)獨(dú)立的子功能的模塊組成,這些模塊彼此之間的接口關(guān)系應(yīng)該盡量簡(jiǎn)單。抽象和求精是一對(duì)互補(bǔ)的概念,也是人類解決復(fù)雜問(wèn)題時(shí)最常用、最有效的方法。在進(jìn)行軟件結(jié)構(gòu)設(shè)計(jì)時(shí)一種有效的方法就是,由抽象到具體地構(gòu)造出軟件的層次結(jié)構(gòu)。 軟件工程師在開發(fā)軟件的長(zhǎng)期實(shí)踐中積累了豐富的經(jīng)驗(yàn),總結(jié)這些經(jīng)驗(yàn)得出一些很有參考價(jià)值的啟發(fā)式規(guī)則,它們往往能對(duì)如何改進(jìn)軟件設(shè)計(jì)給出寶貴的提示。在軟件開發(fā)過(guò)程中既要充分重視和利用這些啟發(fā)式規(guī)則,又要從實(shí)際情況出發(fā)避免生搬硬套。

57、自頂向下逐步求精是進(jìn)行軟件結(jié)構(gòu)設(shè)計(jì)的常用途徑;但是,如果已經(jīng)有了詳細(xì)的數(shù)據(jù)流圖,也可以使用面向數(shù)據(jù)流的設(shè)計(jì)方法,用形式化的方法由數(shù)據(jù)流圖映射出軟件結(jié)構(gòu)。應(yīng)該記住,這樣映射出來(lái)的只是軟件的初步結(jié)構(gòu),還必須根據(jù)設(shè)計(jì)原理并且參考啟發(fā)式規(guī)則,認(rèn)真分析和改進(jìn)軟件的初步結(jié)構(gòu),以得到質(zhì)量更高的模塊和更合理的軟件結(jié)構(gòu)。 在進(jìn)行詳細(xì)的過(guò)程設(shè)計(jì)和編寫程序之前,首先進(jìn)行結(jié)構(gòu)設(shè)計(jì),其好處正在于可以在軟件開發(fā)的早期站在全局高度對(duì)軟件結(jié)構(gòu)進(jìn)行優(yōu)化。在這個(gè)時(shí)期進(jìn)行優(yōu)化付出的代價(jià)不高,卻可以使軟件質(zhì)量得到重大改進(jìn)。 5-1 為每種類型的模塊耦合舉一個(gè)具體例子。5-2 為每種類型的模塊內(nèi)聚舉一個(gè)具體例子。5-3 用面向數(shù)據(jù)流的

58、方法設(shè)計(jì)下列系統(tǒng)的軟件結(jié)構(gòu):(1) 儲(chǔ)蓄系統(tǒng)(參見習(xí)題2第2題);(2) 機(jī)票預(yù)訂系統(tǒng)(參見習(xí)題2第3題);(3) 患者監(jiān)護(hù)系統(tǒng)(參見習(xí)題2第4題)。習(xí)題 5-4 美國(guó)某大學(xué)共有200名教師,校方與教師工會(huì)剛剛簽訂一項(xiàng)協(xié)議。按照協(xié)議,所有年工資超過(guò)26 000(含26 000)的教師工資將保持不變,年工資少于26 000的教師將增加工資,所增加的工資數(shù)按下述方法計(jì)算:給每個(gè)由此教師所贍養(yǎng)的人(包括教師本人)每年補(bǔ)助100,此外,教師有一年工齡每年再多補(bǔ)助50,但是,增加后的年工資總額不能多于26 000。教師的工資檔案儲(chǔ)存在行政辦公室的磁帶上,檔案中有目前的年工資、贍養(yǎng)的人數(shù)、雇用日期等信息。

59、需要寫一個(gè)程序計(jì)算并印出每名教師的原有工資和調(diào)整后的新工資。要求: (1) 畫出此系統(tǒng)的數(shù)據(jù)流圖;(2) 寫出需求說(shuō)明;(3) 設(shè)計(jì)上述的工資調(diào)整程序(要求用HIPO圖描繪設(shè)計(jì)結(jié)果),設(shè)計(jì)時(shí)請(qǐng)分別采用下述兩種算法,并比較這兩種算法的優(yōu)缺點(diǎn):(a) 搜索工資檔案數(shù)據(jù),找出年工資少于26 000的人,計(jì)算新工資,校核是否超過(guò)26 000,儲(chǔ)存新工資,印出新舊工資對(duì)照表;(b) 把工資檔案數(shù)據(jù)按工資從最低到最高的次序排序,當(dāng)工資數(shù)額超過(guò)26 000時(shí)即停止排序,計(jì)算新工資,校核是否超過(guò)限額,儲(chǔ)存新工資,印出結(jié)果。 (4) 你所畫出的數(shù)據(jù)流圖適用于哪種算法?5-5 下面將給出兩個(gè)人玩的撲克牌游戲的一種

60、玩法,請(qǐng)你設(shè)計(jì)一個(gè)模擬程序,它的基本功能是: (1)發(fā)兩手牌(利用隨機(jī)數(shù)產(chǎn)生器); (2)確定贏者和贏牌的類型; (3)模擬N次游戲,計(jì)算每種類型牌贏或平局的概率。要求用HIPO圖描繪設(shè)計(jì)結(jié)果并且畫出高層控制流程圖。撲克牌游戲規(guī)則如下:(1) 有兩個(gè)人玩,分別稱為A和B;(2) 一副撲克牌有52張牌,4 種花色(方塊、梅花、紅桃和黑桃),每種花色的牌的點(diǎn)數(shù)按升序排列有2,3,4,10,J,Q,K,A等13種; (3) 給每個(gè)人發(fā)3張牌,牌面向上(即,亮牌),贏者立即可以確定;(4) 最高等級(jí)的一手牌稱為同花,即3張牌均為同一種花色,最大的同花牌是同一種花色的Q、K、A;(5) 第二等級(jí)的牌稱為順子,即點(diǎn)數(shù)連續(xù)的3張牌,最大的順子是花色不同的Q、K、A;(6) 第三等級(jí)的牌是同點(diǎn),即點(diǎn)數(shù)相同的3張牌,最大的同點(diǎn)是A、A、A;(7) 第四等級(jí)的牌是對(duì)子,即3張牌中有兩張點(diǎn)數(shù)相同,最大的對(duì)子是A、A、K; (8) 第五等級(jí)的牌是雜牌,即除去上列四等之外的任何一手牌,最大的雜牌是不同花色的A、K、J;(9) 若兩人的牌類型不同,則等級(jí)高者勝;若等級(jí)相同,則點(diǎn)數(shù)高者勝;若點(diǎn)數(shù)也相同,則為平局。

展開閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!