第七章 高級(jí)結(jié)構(gòu)設(shè)計(jì)
1.軟件設(shè)計(jì)引論
2.結(jié)構(gòu)化設(shè)計(jì)
3.面向?qū)ο?br>
4.對(duì)目前流行的設(shè)計(jì)方法的評(píng)論
5.往返設(shè)計(jì)疚察,小結(jié)
軟件設(shè)計(jì)引論
大型和小型項(xiàng)目設(shè)計(jì)
大型:軟件結(jié)構(gòu)設(shè)計(jì)伦乔、高層次模塊設(shè)計(jì)君编、實(shí)現(xiàn)細(xì)節(jié)設(shè)計(jì)
小型:設(shè)計(jì)(用程序語言編程)
設(shè)計(jì)的層次
劃分成子系統(tǒng)黄橘、劃分成模塊蒙秒、劃分成子程序桑李、子程序內(nèi)部的設(shè)計(jì)
- 劃分成子系統(tǒng):子系統(tǒng)(數(shù)據(jù)庫接口麻昼、用戶接口奠支、命令解釋程序、報(bào)告格式程序等)抚芦,將系統(tǒng)劃分為幾個(gè)主要要素倍谜,并定義這些要素間的接口(主要針對(duì)耗時(shí)在幾天以上的大項(xiàng)目)
- 劃分成模塊:識(shí)別系統(tǒng)中所有的模塊,子系統(tǒng)可能仍較復(fù)雜叉抡,難以直接翻譯成代碼尔崔,那么我們還需要將子系統(tǒng)劃分為幾個(gè)模塊如:數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)恢復(fù)褥民、問題解釋等季春,如分解出來的模塊還是太復(fù)雜,再進(jìn)行劃分即可
- 劃分成子程序:把每個(gè)模塊劃分成各種功能消返,一旦一個(gè)子程序被識(shí)別出來载弄,那么就同時(shí)規(guī)定它的功能(這一步并不一定需要被正式的進(jìn)行耘拇,但起碼是要在心中進(jìn)行)
- 子程序內(nèi)部的設(shè)計(jì):在子程序的層次上設(shè)計(jì),包括設(shè)計(jì)單個(gè)子程序中的詳細(xì)功能宇攻。這步包括編寫PDL惫叛,在參考書中尋找算法,在子程序中組織代碼段落逞刷,編寫程序語言代碼等活動(dòng)(這一步在任何項(xiàng)目中都要進(jìn)行嘉涌,如果缺少了這一層次的工作,任何程序都不可能產(chǎn)生)
創(chuàng)建中的設(shè)計(jì)工作
內(nèi)部子程序設(shè)計(jì)夸浅、劃分成子程序仑最、劃分成模塊、劃分成子系統(tǒng)
結(jié)構(gòu)化設(shè)計(jì)
1. 系統(tǒng)組織
2. 開發(fā)設(shè)計(jì)的策略
3. 評(píng)估設(shè)計(jì)準(zhǔn)則
4. 關(guān)于問題的明確說明
5. 表達(dá)設(shè)計(jì)的圖形和語言工具
選擇需進(jìn)行模塊化的要素
自頂向下分解
把程序分解為子程序的一種流行方法帆喇,也稱為逐步求精警医,從關(guān)于程序功能的粗略說明出發(fā),逐步推到程序要做的每一項(xiàng)特定的工作番枚。
此方法設(shè)計(jì)原則:1.設(shè)計(jì)高層次2.避免特定語言細(xì)節(jié)3.暫時(shí)不指出下一層次的設(shè)計(jì)細(xì)節(jié)(與信息隱含類似)4.正規(guī)化每個(gè)層次5.檢驗(yàn)每個(gè)層次6.轉(zhuǎn)移到下一層次法严,進(jìn)行信的求精工作。
自底向上合成
在每設(shè)計(jì)一個(gè)程序時(shí)葫笼,可以問自己“這個(gè)系統(tǒng)需要做什么深啤?”,從而可以識(shí)別出系統(tǒng)需要具備的較低層次的功能路星,就像修房一樣溯街,從低到高,設(shè)計(jì)出某些低層次的功能洋丐,再從事較高層次設(shè)計(jì)可能會(huì)有把握一些了
此方法設(shè)計(jì)原則:1.問自己關(guān)于系統(tǒng)需要做什么2.利用這些問題設(shè)計(jì)出低層次功能3.識(shí)別出這些低層次功能呈昔,將其組合到一起4.向上一個(gè)層次進(jìn)行同樣的工作
自頂向下是從一般到特殊,自底向上是從一般到特殊
面向?qū)ο?/h1>
關(guān)鍵思想
面向?qū)ο笫墙⒃谝幌轮鲝埳系模阂粋€(gè)程序模型越是真實(shí)地反映了實(shí)際問題友绝, 那么堤尾,由此產(chǎn)生出的程序質(zhì)量越好,在多數(shù)情況下迁客,關(guān)于項(xiàng)目的數(shù)據(jù)定義要比功能穩(wěn)定得多郭宝, 因此應(yīng)象面向?qū)ο笤O(shè)計(jì)一樣,根據(jù)數(shù)據(jù)來進(jìn)行設(shè)計(jì)掷漱,這可以使設(shè)計(jì)更穩(wěn)定粘室。
抽象
抽象所帶來的主要好處是可以忽略掉無關(guān)緊要的細(xì)枝末節(jié)問題,而專注于重要的特性卜范。
用房屋來舉例:房屋是木材衔统、釘子、玻璃、磚和水泥等的抽象锦爵,是把它們組織起來的一種方法舱殿。
封裝
封裝是對(duì)抽象不存在地方的補(bǔ)充。
繼續(xù)用房屋比擬來說明問題:封裝是一個(gè)使你可以看到房屋的外表但不能走進(jìn)去的辦法棉浸。
模塊化
面向?qū)ο笤O(shè)計(jì)中的模塊與結(jié)構(gòu)化設(shè)計(jì)中模塊的含義是一致的怀薛。相聯(lián)系的數(shù)據(jù)和功能被放 入模塊刺彩,在理想情況下迷郑,模塊是高度內(nèi)聚而又松散耦合的
層次結(jié)構(gòu)和繼承性
在設(shè)計(jì)軟件系統(tǒng)時(shí),你經(jīng)炒淳螅可以發(fā)現(xiàn)兩個(gè)之間非常相似嗡害,其差別非常小的對(duì)象。定義這種對(duì)象間的共同和不同點(diǎn)稱為“繼承性”繼承策略的好處是它與抽象的概念是一致的畦攘,抽象在不同層次的細(xì)節(jié)上與對(duì)象打交道霸妹。在面向?qū)ο缶幊讨校^承性簡(jiǎn)化了編程知押,因?yàn)槟阒灰獙懸粋€(gè)通用子程序來處理對(duì)象間的共 同特性叹螟,再編寫幾個(gè)專用子程序去處理它們間的不同特性就可以了。
對(duì)象與類
在面向?qū)ο笤O(shè)計(jì)中台盯,最后一個(gè)關(guān)鍵概念是對(duì)象與類罢绽。對(duì)象是程序在運(yùn)行時(shí)其中的任何一個(gè) 實(shí)體,而類則是當(dāng)你看程序清單時(shí)存在的一個(gè)靜態(tài)實(shí)體静盅。對(duì)象是在程序運(yùn)行時(shí)具有特定值和屬 性的動(dòng)態(tài)實(shí)體良价。
面向?qū)ο笤O(shè)計(jì)的步驟
- 識(shí)別對(duì)象及其屬性,它往往是數(shù)據(jù)
- 確定對(duì)每個(gè)對(duì)象可以做些什么
- 確定每一個(gè)對(duì)象可以對(duì)其它對(duì)象做些什么
- 確定每個(gè)對(duì)象對(duì)其它對(duì)象來說是可見的部分——哪一部分是開放的蒿叠,哪一部分是專用 的
- 確定每個(gè)對(duì)象的公共接口
對(duì)目前流行設(shè)計(jì)方法的評(píng)論
結(jié)構(gòu)化設(shè)計(jì)和面向?qū)ο笤O(shè)計(jì)——你會(huì)發(fā)現(xiàn)每 種方法都包括兩個(gè)主要部分:
把一個(gè)系統(tǒng)分解成子系統(tǒng)的準(zhǔn)則 解釋分解的圖形式語言符號(hào)
有些方法還包括第三個(gè)要素 防止你使用其它方法的規(guī)定
一個(gè)好的系統(tǒng)分解的確是很有價(jià)值的明垢,但并不是說一旦確立了好的結(jié)構(gòu),設(shè)計(jì)就可以停止 了市咽。在確認(rèn)出子程序的模塊之后痊银,還有許多設(shè)計(jì)工作要做。
何時(shí)使用結(jié)構(gòu)化設(shè)計(jì)\信息隱蔽\面向?qū)ο笤O(shè)計(jì)
結(jié)構(gòu)化設(shè)計(jì)主要是一種把程序分解成子程序的方法施绎。它強(qiáng)調(diào)功能但不強(qiáng)調(diào)數(shù)據(jù)溯革。
結(jié)構(gòu)化設(shè)計(jì)并沒有把子程序組成一個(gè)協(xié)同工作子程序組的概念,也沒有子程序內(nèi)部設(shè)計(jì)的 概念粘姜,除非這個(gè)子程序的內(nèi)部會(huì)影響到整個(gè)系統(tǒng)鬓照。因此,結(jié)構(gòu)化設(shè)計(jì)非常適用于具有許多互不 作用的獨(dú)立功能的系統(tǒng)孤紧。同時(shí)豺裆,它也適于那些只有幾百行代碼的小型程序,因?yàn)檫@些程序過于 簡(jiǎn)單,沒有建立類臭猜、對(duì)象和屬性的必要躺酒。
無論什么問題領(lǐng)域,都應(yīng)該盡量采用信息隱蔽蔑歌。使用它沒有任何危險(xiǎn)羹应。不論是設(shè)計(jì)子程序、模塊次屠,還是對(duì)象程序园匹,它都是很有 效的,因此你盡可以放心使用它劫灶。
面向?qū)ο笤O(shè)計(jì)與結(jié)構(gòu)化設(shè)計(jì)的主要區(qū)別是:面向?qū)ο笤O(shè)計(jì)在較高抽象層次上要比結(jié)構(gòu)化設(shè)計(jì)有效裸违。面向?qū)ο笤O(shè)計(jì)主要是設(shè)計(jì)模塊數(shù)據(jù)和對(duì)數(shù)據(jù)操作的集合。它非常適于從最頂層分解系統(tǒng)本昏。面向?qū)ο笤O(shè)計(jì)適合于任何客觀世界中的對(duì)象供汛。這類系統(tǒng)的例子包括高度交互化的窗口、對(duì) 話框涌穆、按鈕等程序怔昨;面向?qū)ο蟮臄?shù)據(jù)庫;需要對(duì)隨機(jī)事件做出反應(yīng)的事件驅(qū)動(dòng)系統(tǒng)等等宿稀。
往返設(shè)計(jì)趁舀,小結(jié)
你可能會(huì)有這樣的體驗(yàn):當(dāng)你編寫程序快結(jié)束時(shí),你非常希望能有機(jī)會(huì)再重新編寫一次原叮, 因?yàn)樵诰帉戇^程中你對(duì)問題又有了更深的理解赫编。這對(duì)設(shè)計(jì)也是同樣適用的,只不過在設(shè)計(jì)中這 個(gè)循環(huán)的周期更短奋隶,帶來的好處也更大擂送,因此,你完全可以在設(shè)計(jì)過程中進(jìn)行幾次往返唯欣。
在用不同的設(shè)計(jì)方法對(duì)各種設(shè)計(jì)方案進(jìn)行嘗試的進(jìn)程中嘹吨,將從高層次的總體上和低層次的 細(xì)節(jié)上對(duì)問題進(jìn)行觀察。在從事高層次問題時(shí)獲得的總體印象將會(huì)對(duì)你在低層次細(xì)節(jié)中的工作 有很大幫助境氢;同時(shí)蟀拷,在從事低層次問題時(shí)所獲得的細(xì)節(jié)將為你對(duì)高層次的總體理解和作出總體 設(shè)計(jì)決定奠定下良好的基礎(chǔ)。這種在高層次和低層次之間往返思維過程是非常有益的萍聊,由此而 產(chǎn)生的結(jié)構(gòu)问芬,將比單純自頂向下或自底向上產(chǎn)生的結(jié)構(gòu)要穩(wěn)定得多。
設(shè)計(jì)是一個(gè)非常復(fù)雜的過程寿桨,也是一個(gè)啟發(fā)的過程
設(shè)計(jì)是一個(gè)啟發(fā)的過程此衅。 固執(zhí)地堅(jiān)持某一種方法只會(huì)抑制創(chuàng)造力强戴,從而產(chǎn)生低質(zhì)量的 程序。堅(jiān)持設(shè)計(jì)方法上有一些不屈不撓的精神是有益的挡鞍,因?yàn)檫@可以迫使你對(duì)這種方法 進(jìn)行充分理解骑歹。但是,一定要確信你是在不屈不撓而不是頑固不化墨微。