第七章 高級(jí)程序設(shè)計(jì) 模塊設(shè)計(jì)和子程序設(shè)計(jì)的好壞在很大程度上取決于系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)好壞。 7.1 軟件設(shè)計(jì)引論 “軟件設(shè)計(jì)”一詞的意思是指,把一個(gè)計(jì)算機(jī)程序的定義轉(zhuǎn)變成可以運(yùn)行程序的設(shè)計(jì)方法。 層次的設(shè)計(jì) 層次1:劃分成子系統(tǒng) 層次2:劃分成模塊 層次3:劃分成子程序 層次4:子程序內(nèi)部的設(shè)計(jì) 7.2 結(jié)構(gòu)化設(shè)計(jì) 結(jié)構(gòu)化設(shè)計(jì)是由以下部分組成的: · 系統(tǒng)組織,系統(tǒng)將被設(shè)計(jì)成幾個(gè)黑盒子,明確定義的子程序和模塊、接口的實(shí)現(xiàn)細(xì)節(jié)對(duì)其它子程序來說都是隱含的。 · 開發(fā)設(shè)計(jì)的策略。 · 評(píng)估設(shè)計(jì)準(zhǔn)則。 · 關(guān)于問題的明確說明,這是解決問題的指導(dǎo)原則。 · 表達(dá)設(shè)計(jì)的圖形和語言工具,包括PDL和結(jié)構(gòu)圖。 選擇需進(jìn)行模塊化的要素 自頂向下分解原則: 設(shè)計(jì)高層次。 · 避免特定語言細(xì)節(jié)。從設(shè)計(jì)中,不應(yīng)該看出打算在程序中使用什么語言,或者說當(dāng)在設(shè)計(jì)中更換要用的語言時(shí),不會(huì)產(chǎn)生任何麻煩。 · 暫時(shí)不指出下一層次的設(shè)計(jì)細(xì)節(jié)(與信息隱含類似)。 · 正規(guī)化每個(gè)層次。 · 檢驗(yàn)每個(gè)層次。 · 轉(zhuǎn)移到下一個(gè)層次,進(jìn)行新的求精工作。 自底向上合成原則: · 問自己,關(guān)于系統(tǒng)要做什么你都知道哪些? · 利用這一問題識(shí)別出某些低層次功能。 · 識(shí)別出這些低層次功能共同的方面,將其組合到一起。 · 向上一個(gè)層次,進(jìn)行同樣的工作,或回到頂端開始自頂向下。 其中自頂向下是從一般到特珠,自底向上是從特殊到一般。 7.3 面向?qū)ο?/div> 面向?qū)ο笤O(shè)計(jì)方法的特點(diǎn)是通過對(duì)實(shí)際問題的分析,從中抽象出對(duì)象,然后再用程序語言來表現(xiàn)它,其過程主要是:識(shí)別對(duì)象中的子對(duì)象并識(shí)別出對(duì)于子對(duì)象的操作,然后再根據(jù)子對(duì)象的操作開發(fā)出一個(gè)系統(tǒng)。 面向?qū)ο笤O(shè)計(jì)的步驟是: · 識(shí)別對(duì)象及其屬性,它往往是數(shù)據(jù)。 · 確定對(duì)每個(gè)對(duì)象可以做些什么。 · 確定每一個(gè)對(duì)象可以對(duì)其它對(duì)象做些什么。 · 確定每個(gè)對(duì)象對(duì)其它對(duì)象來說是可見的部分——哪一部分是開放的,哪一部分是專用的。 · 確定每個(gè)對(duì)象的公共接口。 7.4 對(duì)目前流行方法的討論 從事結(jié)構(gòu)化設(shè)計(jì)的人與從事面向?qū)ο笤O(shè)計(jì)的人會(huì)發(fā)現(xiàn)他們進(jìn)行交流非常困難,原因是他們沒有意識(shí)到是在不同層次上討論設(shè)計(jì)的,因此主題也是不同的。從事結(jié)構(gòu)化設(shè)計(jì)的Tom說:“我想這個(gè)系統(tǒng)應(yīng)該分解成50個(gè)子程序?!泵嫦?qū)ο笤O(shè)計(jì)的Joh則說:“我認(rèn)為系統(tǒng)應(yīng)劃分成7個(gè)對(duì)象”。如果你仔細(xì)觀察,可能會(huì)發(fā)現(xiàn)這7個(gè)對(duì)象中可能共含有50個(gè)子程序,而Tom的子程序或許可以分成7組。 結(jié)構(gòu)化設(shè)計(jì)主要是一種把程序分解成子程序的方法。它強(qiáng)調(diào)功能但不強(qiáng)調(diào)數(shù)據(jù)。如果數(shù)據(jù)變動(dòng)可能性很大,那么采用面向?qū)ο笤O(shè)計(jì)比較合適,因?yàn)樗鼘⒆儎?dòng)可能性較大的數(shù)據(jù)獨(dú)立在對(duì)象(模塊)中。 面向?qū)ο笤O(shè)計(jì)主要是設(shè)計(jì)模塊數(shù)據(jù)和對(duì)數(shù)據(jù)操作的集合。 7.5 往返設(shè)計(jì) 你可能會(huì)有這樣的體驗(yàn):當(dāng)你編寫程序快結(jié)束時(shí),你非常希望能有機(jī)會(huì)再重新編寫一次,因?yàn)樵诰帉戇^程中你對(duì)問題又有了更深的理解。 設(shè)計(jì)是一個(gè)復(fù)雜的過程 設(shè)計(jì)是一個(gè)“險(xiǎn)惡”的過程 設(shè)計(jì)是一個(gè)啟發(fā)的過程 怎么樣解決問題: l.理解問題,你必須理解要解決的問題 問題是什么?條件是什么?數(shù)據(jù)是什么?有可能滿足條件嗎?已知條件足以確定未知嗎?已知條件是否不夠充分?是否矛盾是否冗余? 畫一個(gè)圖,引入恰當(dāng)?shù)姆?hào),把條件的不同部分分解開。 2.設(shè)計(jì)一個(gè)方案。找到已知數(shù)據(jù)和未知之間的聯(lián)系。如果不能找出直接聯(lián)系的話,你可能不得不考慮一些輔助問題,但最后,你應(yīng)該找到一個(gè)解決方案。 3.執(zhí)行你的計(jì)劃。 執(zhí)行你解決問題的計(jì)劃,同時(shí)檢查每一步工作。你是否可以認(rèn)定每一步都是正確的?你能證明這點(diǎn)嗎? 4.回顧,檢查一下答案。 你能檢查一下答案嗎?能檢查一個(gè)論證嗎?能否用另外一種方法推導(dǎo)出答案?能否一眼就看出答案? 受歡迎設(shè)計(jì)的特點(diǎn): 智力上的可管理性。 低復(fù)雜性。 維護(hù)的方便性。 最小的聯(lián)系性。 可擴(kuò)充性。 可重復(fù)使用性。 高扇入。高扇入指的是對(duì)于一個(gè)給定的子程序來說,應(yīng)該有盡可能多的子程序調(diào)用它。 低或中等程度扇出。低或中等扇出指的是對(duì)一個(gè)確定的子程序來說,它所調(diào)用的子程序應(yīng)該盡可能地少。 可移植性。 簡練性。 成層設(shè)計(jì)。 標(biāo)準(zhǔn)化技求。 7.6 小結(jié) 固執(zhí)地堅(jiān)持某一種方法只會(huì)抑制創(chuàng)造力,從而產(chǎn)生低質(zhì)量的程序。 好的設(shè)計(jì)是通過迭代逼近得到的:你嘗試過的設(shè)計(jì)方案越多,你最終所確定的設(shè)計(jì)方案也越好。 設(shè)計(jì)方法僅是一種工具,你對(duì)工具運(yùn)用得好壞決定了你所設(shè)計(jì)的程序的質(zhì)量。但不管怎樣,選擇正確的工具更容易設(shè)計(jì)出高質(zhì)量的軟件。 |
|