資源描述:
《軟件工程導(dǎo)論 第6章 詳細設(shè)計(finished)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、第六章詳細設(shè)計詳細設(shè)計階段的根本目標是確定應(yīng)該怎樣具體地實現(xiàn)所要求的系統(tǒng),也就是說,經(jīng)過這個階段的設(shè)計工作,應(yīng)該得出對目標系統(tǒng)的精確描述,從而在編碼階段可以把這個描述直接翻譯成用某種程序設(shè)計語言書寫的程序。詳細設(shè)計階段的任務(wù)還不是具體地編寫程序,而是要設(shè)計出程序的“藍圖”,以后程序員將根據(jù)這個藍圖寫出實際的程序代碼。因此,詳細設(shè)計的結(jié)果基本上決定了最終的程序代碼的質(zhì)量??紤]程序代碼的質(zhì)量時必須注意,程序的“讀者”有兩個,那就是計算機和人。在軟件的生命周期中,設(shè)計測試方案、診斷程序錯誤、修改和改進程序等等都必須首先讀懂程序。實際上對于長期使用的軟件系統(tǒng)而言,人讀程序的時間可能比寫程序的時
2、間還要長得多。因此,衡量程序的質(zhì)量不僅要看它的邏輯是否正確,性能是否滿足要求,更主要的是要看它是否容易閱讀和理解。詳細設(shè)計的目標不僅僅是邏輯上正確地實現(xiàn)每個模塊的功能,更重要的是設(shè)計出的處理過程應(yīng)該盡可能簡明易懂。結(jié)構(gòu)程序設(shè)計技術(shù)是實現(xiàn)上述目標的關(guān)鍵技術(shù),因此是詳細設(shè)計的邏輯基礎(chǔ)。6.1結(jié)構(gòu)程序設(shè)計結(jié)構(gòu)程序設(shè)計的概念最早由E.W.Dijkstra提出。1965年他在一次會議上指出:“可以從高級語言中取消GOTO語句”,“程序的質(zhì)量與程序中所包含的GOTO語句的數(shù)量成反比”。1966年Bohm和Jacopini證明了,只用3種基本的控制結(jié)構(gòu)就能實現(xiàn)任何單入口單出口的程序。這3種基本的控制
3、結(jié)構(gòu)是“順序”、“選擇”和“循環(huán)”,它們的流程圖分別為圖6.1(a),6.1(b)和6.1(c)。實際上用順序結(jié)構(gòu)和循環(huán)結(jié)構(gòu)(又稱DO_WHILE結(jié)構(gòu))完全可以實現(xiàn)選擇結(jié)構(gòu)(又稱IF_THEN_ELSE結(jié)構(gòu)),因此,理論上最基本的控制結(jié)構(gòu)只有兩種。Bohm和Jacopini的證明給結(jié)構(gòu)程序設(shè)計技術(shù)奠定了理論基礎(chǔ)。expAFTBA(a)BTAexpF(c)TAexpF或圖6.13種基本的控制結(jié)構(gòu)(a)順序結(jié)構(gòu),先執(zhí)行A再執(zhí)行B;(b)IF_THEN_ELSE型選擇(分支)結(jié)構(gòu);(c)DO_WHILE型循環(huán)結(jié)構(gòu)1968年Dijkstra再次建議從一切高級語言中取消GOTO語句,只使用3種基
4、本控制結(jié)構(gòu)寫程序。他的建議引起了激烈爭論,經(jīng)過討論人們認識到,不是簡單地去掉GOTO語句的問題,而是要創(chuàng)立一種新的程序設(shè)計思想、方法和風(fēng)格,以顯著地提高軟件生產(chǎn)率和降低軟件維護代價。1971年IBM公司在紐約時報信息庫管理系統(tǒng)的設(shè)計中成功地使用了結(jié)構(gòu)程序設(shè)計技術(shù),隨后在美國宇航局空間實驗室飛行模擬系統(tǒng)的設(shè)計中,結(jié)構(gòu)程序設(shè)計技術(shù)再次獲得圓滿成功。這兩個系統(tǒng)都相當龐大,前者包含83000行高級語言源程序,后者包含40萬行源程序,而且在設(shè)計過程中用戶需求又曾有過很多改變,然而兩個系統(tǒng)的開發(fā)工作都按時并且高質(zhì)量地完成了。這表明,軟件生產(chǎn)率比以前提高了一倍,結(jié)構(gòu)程序設(shè)計技術(shù)成功地經(jīng)受了實踐的檢驗
5、。1972年IBM公司的Mills進一步提出,程序應(yīng)該只有一個入口和一個出口,從而補充了結(jié)構(gòu)程序設(shè)計的規(guī)則。那么,什么是結(jié)構(gòu)程序設(shè)計呢?結(jié)構(gòu)程序設(shè)計的經(jīng)典定義如下所述:“如果一個程序的代碼塊僅僅通過順序、選擇和循環(huán)這3種基本控制結(jié)構(gòu)進行連接,并且每個代碼塊只有一個入口和一個出口,則稱這個程序是結(jié)構(gòu)化的?!鄙鲜鼋?jīng)典定義過于狹隘了,結(jié)構(gòu)程序設(shè)計本質(zhì)上并不是無GOTO語句的編程方法,而是一種使程序代碼容易閱讀、容易理解的編程方法。在多數(shù)情況下,無GOTO語句的代碼確實是容易閱讀、容易理解的代碼,但是,在某些情況下,為了達到容易閱讀和容易理解的目的,反而需要使用GOTO語句。例如,當出現(xiàn)了錯誤
6、條件時,重要的是在數(shù)據(jù)庫崩潰或棧溢出之前,盡可能快地從當前程序轉(zhuǎn)到一個出錯處理程序,實現(xiàn)這個目標的最好方法就是使用前向GOTO語句(或與之等效的專用語句),機械地使用3種基本控制結(jié)構(gòu)實現(xiàn)這個目標,反而會使程序晦澀難懂。因此,下述的結(jié)構(gòu)程序設(shè)計的定義可能更全面一些:“結(jié)構(gòu)程序設(shè)計是盡可能少用GOTO語句的程序設(shè)計方法。最好僅在檢測出錯誤時才使用GOTO語句,而且應(yīng)該總是使用前向GOTO語句?!彪m然從理論上說只用上述3種基本控制結(jié)構(gòu)就可以實現(xiàn)任何單入口單出口的程序,但是為了實際使用方便起見,常常還允許使用DO_UNTIL和DO_CASE兩種控制結(jié)構(gòu),它們的流程圖分別是圖6.2(a)和圖6.
7、2(b)。FTAexp(a)expCASE1CASE2CASEn…(b)圖6.2其他常用的控制結(jié)構(gòu)(a)DO_WHILE型循環(huán)結(jié)構(gòu);(b)多分支結(jié)構(gòu)有時需要立即從循環(huán)(甚至嵌套的循環(huán))中轉(zhuǎn)移出來,如果允許使用LEAVE(或BREAK)結(jié)構(gòu),則不僅方便而且會使效率提高很多。LEAVE或BREAK結(jié)構(gòu)實質(zhì)上是受限制的GOTO語句,用于轉(zhuǎn)移到循環(huán)結(jié)構(gòu)后面的語句。如果只允許使用順序、IF_THEN_ELSE型分支和DO_WHILE型循環(huán)這3種基本控制結(jié)