軟件構(gòu)件中的設(shè)計
設(shè)計中的挑戰(zhàn)
? ? ? ?“軟件設(shè)計”一詞意味著去構(gòu)思、創(chuàng)造或者發(fā)明一套方案,把一份計算機軟件的規(guī)格說明書要求轉(zhuǎn)變?yōu)榭蓪嶋H運行的軟件。設(shè)計就是把需求分析和編碼調(diào)試連接在一起的活動。好的高層次設(shè)計能提供一個可以穩(wěn)妥容納多個較低層次設(shè)計的結(jié)構(gòu)。好的設(shè)計對于小型項目非常有用,對于大型項目就更是不可或缺。
? ? ? 設(shè)計是個了無章法的過程(即使它能得出清爽的成果)—— 說設(shè)計了無章法,是因為在此過程中你會采取很多錯誤的步驟,多次誤入歧途。事實上,犯錯誤正是設(shè)計的關(guān)鍵所在,在設(shè)計階段犯錯誤并加以改正,其代價要比在編碼后才發(fā)現(xiàn)同樣的錯誤并徹底修改低得多。說設(shè)計了無章法,還因為優(yōu)、劣設(shè)計之間的差異往往非常微妙;另外,你很難判斷設(shè)計何時算是“足夠好”了。設(shè)計到什么時候細節(jié)才算夠?有多少設(shè)計需要用形式化的設(shè)計符號完成,又有多少設(shè)計可以留到編碼的時候再做?什么時候才算完成?因為設(shè)計永無止境,因此對上述問題最常見的回答是“到你沒有時間再做了為止”。
? ? ? ?設(shè)計就是確定取舍和調(diào)整順序的過程 —— 設(shè)計者工作的一個關(guān)鍵內(nèi)容便是去衡量彼此沖突的各項設(shè)計特性,并盡量在其中尋求平衡。如果快速的反應(yīng)速度比縮減開發(fā)時間更重要,那么設(shè)計者會選取一套設(shè)計方案。而如果縮減開發(fā)時間更重要,那么好的設(shè)計者又要巧妙地形成另一套不同的設(shè)計方案。
? ? ? 設(shè)計受到諸多限制 —— 設(shè)計的要點,一部分是要創(chuàng)造可能發(fā)生的事情,而另一部分又是在限制可能發(fā)生的事情。
? ? ? 設(shè)計是不確定的 —— 如果你讓三個人去設(shè)計一套同樣的程序,他們很可能會做出三套截然不同的方案,而每一套設(shè)計都很不錯。
? ? ? 設(shè)計是一個啟發(fā)是過程 —— 正因為設(shè)計過程充滿了不確定性,因此設(shè)計技術(shù)也就趨于具有探索性,即“經(jīng)驗法則”或者“試試沒準能行的辦法”。而不是保證能產(chǎn)生預(yù)期結(jié)果的可重復(fù)的過程。設(shè)計過程中總會有實驗和犯錯誤。在一件工作或一件工作的某個方面十分湊效的設(shè)計工具或技術(shù),不一定在下一個項目中使用。沒有任何工具是用之四海而皆靈的。
? ? ? ?設(shè)計是自熱而然形成的 —— 設(shè)計不是在誰的頭腦中直接跳出來的。它是在不斷的設(shè)計評估、非正式討論、寫實驗代碼以及修改實驗代碼中演化和完善的。幾乎所有的系統(tǒng)都在其開發(fā)的起始階段經(jīng)歷過某種程度的設(shè)計變更,而當它們進入后續(xù)版本后通常都會進行更大的改變。軟件的性質(zhì)決定了這些改變在多大程度上是有益且可被接受的。
接下來看看有哪些關(guān)鍵的設(shè)計概念是需要我們了解的 :
? ? 好的設(shè)計源于對一小批關(guān)鍵設(shè)計概念的立即。
? ? 軟件的首要技術(shù)使命:管理復(fù)雜度 —— ?兩類不同的問題導(dǎo)致軟件開發(fā)變得困難,本質(zhì)的問題和偶然的問題。本質(zhì)的屬性是一件事物必須具備的,如果不具備就不再是該事物的屬性。偶然的屬性則是指一件事物碰巧具有的屬性,有沒有這些屬性都并不影響這件事我本身。
?管理復(fù)雜度的重要性 :
? ? ? ? 在對導(dǎo)致軟件項目失敗的原因進行調(diào)查時,人們很少把技術(shù)原因歸為項目失敗的首要因素。項目的失敗大多數(shù)都是有不盡如人意的需求、規(guī)劃和管理所導(dǎo)致的。但是,檔項目確由技術(shù)因素導(dǎo)致失敗時,其原因通常就是失控的復(fù)雜度。有關(guān)的軟件變得極端復(fù)雜,讓人無法知道它究竟是做什么的。當沒有人知道對一處代碼的改動會對其他代碼帶來什么影響時,項目就快停止進展了。
? ? ? ? 軟件的首要技術(shù)使命便是管理復(fù)雜度,它實在太重要了。
? ? ?在軟件架構(gòu)的層次上,可以通過把整個系統(tǒng)分解為多個子系統(tǒng)來降低問題的復(fù)雜度。保持子程序的短小精悍也能幫助你減少思考的負擔。從問題的領(lǐng)域著手,而不是從底層實現(xiàn)細節(jié)入手去編寫程序,在最抽象的層次上工作,也能減少人的腦力負擔。
? ? 受著人類固有限制影響的程序員的底線,就是要寫出既讓自己容易理解,也能讓別人容易看懂,而且很少有錯誤的程序代碼。
如何應(yīng)對復(fù)雜度:
高代價、低效率的設(shè)計源于下面三種根源:
- 用復(fù)雜的方法解決簡單的問題;
- 用簡單但是錯誤的方法解決復(fù)雜的問題;
- 用不恰當?shù)膹?fù)雜方法解決復(fù)雜的問題;
現(xiàn)代的軟件本身就很復(fù)雜,那么要如何解決,下面就用這兩種方法來管理復(fù)雜度:
- 把任何人在同一時間需要處理的本質(zhì)復(fù)雜度的量減到最少;
- 不要讓偶然性的復(fù)雜度無謂地快速增長。
一旦你能理解軟件開發(fā)中任何其他技術(shù)目標都不如管理復(fù)雜度重要時,眾多設(shè)計上的考慮就都變得直截了當了。
理想的設(shè)計特征:
高質(zhì)量的設(shè)計具有很多常見的特征。如果你能實現(xiàn)所有這些目標,你的設(shè)計就真的非常好了。這些目標之間有時會相抵觸,但這也正是設(shè)計中的挑戰(zhàn)所在--在一系列相互競爭的目標之中做出一套最好的折中方案。有些高質(zhì)量設(shè)計的特征也同樣是高質(zhì)量程序的特征,如可靠性和性能等。而有些則只是設(shè)計范疇內(nèi)的特征。
下面就列出一些設(shè)計范疇內(nèi)的特征:
- 最小的復(fù)雜度,應(yīng)該做出簡單且易于理解的設(shè)計。如果你的設(shè)計方案不能讓你在專注于程序的一部分時安心地忽視其他部分的話,這一設(shè)計就沒有什么作用了。
- 易于維護
- 松散耦合
- 可擴展性
- 可重用性
- 高扇入,就是說讓大量的類使用某個給定的類。
- 低扇出,就是說讓一個類里少量或者適中地使用其他的類。
- 可移植性,就是說應(yīng)該這樣設(shè)計系統(tǒng),使它能很方便地移植到其他環(huán)境中。
- 層次性
- 精簡性
- 標準技術(shù),一個系統(tǒng)所依賴的外來的、古怪的東西越多,別人在第一次想要理解它的時候就越是頭疼。要盡量用標準化的、常用的方法,讓整個系統(tǒng)給人一種屬性的感覺。
設(shè)計的層次:
第1層:軟件系統(tǒng)
第一層就是整個系統(tǒng)。有的程序員直接從系統(tǒng)層次就開始設(shè)計類,但是往往從子系統(tǒng)或者包這些類的更高組織層次來思考會更有益處。
第2層:分解為子系統(tǒng)或包
在這一層次上設(shè)計的主要成果是識別出所有的主要子系統(tǒng)。這些子系統(tǒng)可能會很大,比如說數(shù)據(jù)庫、用戶界面、業(yè)務(wù)規(guī)則、命令解釋器、報表引擎等。這一層的主要設(shè)計活動就是確定如何把程序分為主要的子系統(tǒng),并定義清楚允許各子系統(tǒng)如何使用其他子系統(tǒng)。對于任何至少需要幾周時間才能完成的項目,在這一層次上進行劃分通常都是必需的。
在這一層中,定義子系統(tǒng)之間的通信規(guī)則是非常重要的。為了讓子系統(tǒng)之間的連接簡單易懂且易于維護,就要盡量簡化子系統(tǒng)之間的交互關(guān)系。最簡單的交互關(guān)系是讓一個子系統(tǒng)去調(diào)用另一個子系統(tǒng)中的子程序;稍微復(fù)雜一點的交互關(guān)系是在一個子系統(tǒng)中包含另一個子系統(tǒng)中的類;而最復(fù)雜的交互關(guān)系是讓一個子系統(tǒng)中的類繼承自另一個子系統(tǒng)中的類。
常用的子系統(tǒng):
- 業(yè)務(wù)規(guī)則, 業(yè)務(wù)規(guī)則是指那些在計算機系統(tǒng)中編入的法律、法規(guī)、政策以及過程。
- 用戶界面, 應(yīng)該創(chuàng)建一個子系統(tǒng),把用戶界面組件同其他部分隔開,以便使用戶界面的演化不會破壞程序的其余部分。在大多數(shù)情況下,用戶界面子系統(tǒng)會使用多個附屬的子系統(tǒng)或類來處理用戶界面、命令行接口、菜單操作、窗體管理、幫助系統(tǒng)等等。
- 數(shù)據(jù)庫訪問, 可以把對數(shù)據(jù)庫進行訪問的實現(xiàn)細節(jié)進行隱藏起來,讓程序的絕大部分可以不必關(guān)心處理底層結(jié)構(gòu)的繁瑣細節(jié),并能像在業(yè)務(wù)層次一樣處理數(shù)據(jù)。隱藏實現(xiàn)細節(jié)的子系統(tǒng)可以為系統(tǒng)提供有價值的抽象層,從而減少程序的復(fù)雜度。它把和數(shù)據(jù)庫相關(guān)的操作集中起來,減少了在對數(shù)據(jù)進行操作時發(fā)生錯誤的幾率。同時,它還能讓數(shù)據(jù)庫的設(shè)計結(jié)構(gòu)更易于變化,做這種修改時無須修改程序的主要部分。
- 對系統(tǒng)的依賴性,把對操作系統(tǒng)的依賴因素歸到一個子系統(tǒng)里,就如同把對硬件的依賴因素風中起來一樣。
第3層: 分解為類
在這一層次上的設(shè)計包括識別出系統(tǒng)中所有的類。例如,數(shù)據(jù)庫接口子系統(tǒng)可能會被進一步劃分成數(shù)據(jù)訪問類、持久化框架類以及數(shù)據(jù)庫元數(shù)據(jù)。
當定義子系統(tǒng)中的類時,也就同時定義了這些類與系統(tǒng)的其余部分打交道的細節(jié)。尤其是要確定好類的接口??偟膩碚f,這一層的主要設(shè)計任務(wù)是把所有子系統(tǒng)進行適當?shù)姆纸?,并確保分解出的細節(jié)都恰到好處,能夠用單個的類實現(xiàn)。
第4層:分解成子程序
這一層的設(shè)計包括把每個類細分為子程序。當你查看類里面子程序的細節(jié)時,就會發(fā)現(xiàn)很多子程序都很簡單,但也有些子程序是由更多層次化組織的子程序所組成的,這就需要更多的設(shè)計工作了。完整地定義出類內(nèi)部的子程序,常常會有助于更好地理解類的接口,反過來,這又有助于對類的接口進行進一步的修改。
第5層:子程序內(nèi)部的設(shè)計
在子程序?qū)哟紊线M行設(shè)計就是為每個子程序布置詳細的功能。子程序內(nèi)部的設(shè)計工作通常是由負責該子程序的開發(fā)人員來完成的。這里的設(shè)計工作包括編寫偽代碼、選擇算法、組織子程序內(nèi)部的代碼塊,以及用編程語言編寫代碼。這一層的設(shè)計工作總是需要做的,盡管有時做得很不在意或者很差勁,有時則是經(jīng)過深思熟慮而出色完成的。
設(shè)計構(gòu)造模塊:啟發(fā)式方法?
由于軟件設(shè)計是非確定性的,因此,靈活熟練地運用一組有效的啟發(fā)式方法(試探法),變成了合理的軟件設(shè)計的核心工作。
關(guān)于設(shè)計啟發(fā)式方法的總結(jié): 尋找現(xiàn)實世界的對象;形成一致的抽象;封裝實現(xiàn)細節(jié);在可能的情況下繼承;藏住秘密;找出容易改變的區(qū)域;保持松散耦合;探尋通用的設(shè)計模式;高內(nèi)聚性;構(gòu)造分層結(jié)構(gòu);嚴格描述類契約;分配職責;為測試而設(shè)計;避免失誤;有意識地選擇綁定時間;創(chuàng)建中央控制點;考慮使用蠻力;畫一個圖;保持設(shè)計模塊化。
找出現(xiàn)實世界的對象
在確定設(shè)計方案時,首選且最流行的一種做法便是“常規(guī)的”面向?qū)ο笤O(shè)計方法,此方法的要點是辨識現(xiàn)實世界中的對象(object,物體)以及人造的對象。
使用對象進行設(shè)計的步驟是:
- 辨認對象及其屬性(方法method和數(shù)據(jù)data)
- 確定可以對各個對象進行的操作
- 確定各個對象能對其他對象進行的操作
- 確定對象的哪些部分對其他對象可見——哪些部分可以是公用的,哪些部分可以是私用的
- 定義每個對象的公開接口
形成一致的抽象
優(yōu)秀的程序員會在子程序接口的層次上、在類接口的層次上以及包接口的層次上--換句話說,在門把手的層次上、門的層次上以及房屋的層次上進行抽象,這樣才能更快、更穩(wěn)妥地進行開發(fā)。
封裝實現(xiàn)細節(jié)
封裝填補了留下的空白。抽象是說:“可以讓你從高層的細節(jié)來看待一個對象?!倍庋b則說:“除此外,你不能看到對象的任何其他細節(jié)層次?!?/p>
隱藏秘密(信息隱藏)
信息隱藏是結(jié)構(gòu)化程序設(shè)計與面向?qū)ο笤O(shè)計的基礎(chǔ)之一。 在設(shè)計一個類的時候,一個關(guān)鍵性的決策就是確定類的哪些特性應(yīng)該對外可見,而哪些特性應(yīng)該隱藏起來。設(shè)計類的接口與設(shè)計其他環(huán)節(jié)一樣,都是一個迭代的過程。如果你第一次沒有得到合適的接口,那么就多試幾次,直到設(shè)計穩(wěn)定下來。如果設(shè)計仍不穩(wěn)定,那你就需要換種方法再嘗試。
信息隱藏中所說的秘密主要分為兩大類:
1. 隱藏復(fù)雜度,這樣你就不用再去應(yīng)付它,除非你要特別關(guān)注的時候
2. 隱藏變化源,這樣當變化發(fā)生時,其影響就能被限制在局部范圍內(nèi)。復(fù)雜度的根源包括復(fù)雜的數(shù)據(jù)類型、文件結(jié)構(gòu)、布爾判斷以及晦澀的算法等。
問題“這個類需要隱藏些什么?”,正切中了接口設(shè)計的核心,如果你能在給類的公開接口中添加函數(shù)或者數(shù)據(jù)而不犧牲該類的隱秘性,那么就做下去,否則請停住。
是設(shè)計的所有層面上,都可以通過詢問該隱藏些什么來處成好的設(shè)計決策。這一問題可以在構(gòu)建層面上協(xié)助你用具名常量來取代字面量,可以在類的內(nèi)部生成好的子程序和參數(shù)名稱,還有助于指導(dǎo)在系統(tǒng)層上做出有關(guān)類和子系統(tǒng)分解以及交互設(shè)計的決策。
請養(yǎng)成問“我該隱藏些什么?”的習(xí)慣,你會驚奇地發(fā)現(xiàn),有很多刺手的設(shè)計難題都會在你面前化解。
找出容易改變的區(qū)域
好的程序設(shè)計所面臨的最重要挑戰(zhàn)之一就是適應(yīng)變化。
1. 找出看起來容易變化的項目。
2. 把容易變化的項目分離出來。把第一步中找出的容易變化的組件單獨劃分成類,或者和其他容易同時發(fā)生變化的組件劃分到同一個類中。
3. 把看起來容易變化的項目隔離開來。設(shè)法設(shè)計好類之間的接口,使其對潛在的變化不敏感。設(shè)計好類的接口,把變化限制在類的內(nèi)部,且不會影響類的外部。任何使用了這個將會發(fā)生變化的類的其他類都不會察覺到變化的存在。類的接口應(yīng)該肩負起保護類的隱私的職責。
下面是一些容易發(fā)生變化的區(qū)域:
. 業(yè)務(wù)規(guī)則 ? 很容易成為軟件變化的根源。
. 對硬件的依賴性 ?比如屏幕,鍵盤...
. 輸入和輸出 ?
. 非標準的語言特性
. 困難的設(shè)計區(qū)域和構(gòu)建區(qū)域
. 狀態(tài)變量 ?不要使用布爾變量作為狀態(tài)變量,請換用枚舉類型;使用訪問器子程序取代對狀態(tài)變量的直接檢查。
. 數(shù)據(jù)量的限制
4. 預(yù)料不同程度的變化。 當你在考慮系統(tǒng)中的潛在變化時,應(yīng)該設(shè)法設(shè)計好你的系統(tǒng),讓這些變化的影響或范圍與發(fā)生該變化的可能性成反比。如果一種變化很可能發(fā)生,那么要確保系統(tǒng)能夠很容易地對它做出響應(yīng)。
找出容易發(fā)生變化的區(qū)域的一個好辦法是:首先找出程序中可能對用戶有用的最小子集。這一子集構(gòu)成了系統(tǒng)的核心,不容易發(fā)生改變。接下來,用微小的步伐擴充這個系統(tǒng)。這里的增量可以非常微小,小到看似微不足道。當你考慮功能上的改變時,同時也要考慮質(zhì)的變化:比如說讓程序編程線程安全的,使程序能夠本地化等。這些潛在的改進區(qū)域就構(gòu)成了系統(tǒng)中的潛在變化。請依照信息隱藏的原則來設(shè)計這些區(qū)域。通過首先定義清楚核心,你可以認清哪些組件屬于附加功能,這時就可以把他們提取出來,并把它們的可能改進隱藏起來。
保持松散的耦合
模塊(類、子程序)之間的好的耦合關(guān)系會松散到恰好能使一個模塊能夠很容易地被其他模塊使用。就像火車車廂之間一樣。請盡量使你創(chuàng)建的模塊不依賴或者很少依賴其他模塊。讓模塊之間的關(guān)系像商業(yè)合作者一樣彼此分離,而不是像連體嬰兒那樣緊密相連。
接下來是一些在衡量模塊之間耦合度時可采用的標準:
- 規(guī)模 這里的規(guī)模指的是模塊之間的連接數(shù)。只有一個參數(shù)的子程序與調(diào)用它的子程序之間的耦合關(guān)系比有六個參數(shù)的子程序與它的調(diào)用方之間的耦合關(guān)系更松散。
- 可見性 可見性指的是兩個模塊之間的連接的顯著程度。
- 靈活性 指的是模塊之間的連接是否容易改動。簡而言之,一個模塊越容易被其他模塊所調(diào)用,那么它們之間的耦合關(guān)系就會越松散。這種設(shè)計非常不錯,因為它更靈活,并且更易于維護。
下面是你會遇到的最常見的幾種耦合:
- 簡單數(shù)據(jù)參數(shù)耦合 ? 當兩個模塊之間通過參數(shù)來傳遞數(shù)據(jù),并且所有的數(shù)據(jù)都是簡單數(shù)據(jù)類型的時候,這兩個模塊之間的耦合關(guān)系就是簡單數(shù)據(jù)參數(shù)耦合的。這種耦合關(guān)系是正常的。
- 簡單的對象耦合 ?如果一個模塊實例化一個對象,那么它們之間的耦合關(guān)系就是簡單對象耦合的。
- 對象參數(shù)耦合 ?如果對象1要求對象2傳遞一個對象3,那么這兩個模塊就是對象參數(shù)耦合的。與對象1僅僅要求對象2傳遞給它簡單數(shù)據(jù)類型相比,這種耦合關(guān)系要更緊密一些,因為它要求對象2要求了解對象3.
查閱常用的設(shè)計模式
設(shè)計模式精煉了眾多現(xiàn)成的解決方案,可用于解決很多軟件開發(fā)中最常見的問題。有些軟件問題要求全新的解決方案,但是大多數(shù)問題都和過去遇到過的問題類似,因此可以使用類似的解決方案或者模式加以解決。
與完全定制的設(shè)計方案相比,設(shè)計模式提供了下列益處:
- 設(shè)計模式通過提供現(xiàn)成的抽象來減少復(fù)雜度。
- 設(shè)計模式通過把常見解決方案的細節(jié)予以制度化來減少出錯。
- 設(shè)計模式通過提供多種設(shè)計方案而帶來啟發(fā)性的價值。
- 設(shè)計模式通過把設(shè)計對話提升到一個更高的層次上來簡化交流。
其他的啟發(fā)式方法
- 構(gòu)造分層結(jié)構(gòu)。分層結(jié)構(gòu)指的是一種分層的信息結(jié)構(gòu),其中最通用的或者最抽象的概念表示位于層次關(guān)系的最上面,而越來越詳細的具有特定意義的表示放在更低的層次中。分層結(jié)構(gòu)用作管理復(fù)雜信息的重要工具。分層結(jié)構(gòu)是實現(xiàn)軟件的首要技術(shù)使命的有用工具,因為它使你能夠只關(guān)注于當前正在關(guān)注的那一層細節(jié)。其他的細節(jié)并沒有完全消失,它們只是被放到了另一層次上,這樣你就可以在需要的時候去考慮它們,而不是在所有的時間都要考慮所有的細節(jié)。
- 嚴格描述類契約。在另一更為細節(jié)的層次上,把每個類的接口看作是與程序的其余部分之間的一項契約會有助于更好地洞察程序。契約對于管理復(fù)雜度而言非常有益,因為至少從理論上來說,該對象可以很安全地忽略掉契約范圍之外的任何行為。
- 分配職責。問每一個對象該對什么負責,類似于問這個對象應(yīng)該隱藏些什么信息,不過我認為這問題能夠帶來更為廣闊的答案,從而使這種方法具有特殊的價值。
- 為測試而設(shè)計。你需要把用戶界面與程序的其余部分分離開來以便能夠獨立地檢查它們嗎?你需要設(shè)法組織好每一個子系統(tǒng),是它與其他子系統(tǒng)之間的依賴關(guān)系最小嗎?為測試而設(shè)計很容易產(chǎn)生更為規(guī)整的類接口,而這通常是非常有益處的。
- 避免失誤。
- 有意識地選擇綁定時間。綁定時間指的是把特定的值綁定到某一變量的時間。做早綁定的代碼通常比較簡單,但是也會比較缺乏靈活性。有時候,你可以通過問類似這樣的問題來獲得更好的理解:如果我早期綁定這些值又會這樣?如果晚些綁定又會怎樣?如果我在此處就初始化這張表會怎樣?如果我在運行期間從用戶那里讀入這個變量的值又該怎樣?
- 創(chuàng)建中央控制點。對于每一段有作用的代碼,應(yīng)該只有唯一的一個地方可以看到它,并且也只能在一個正確的位置去做可能。之所以這么做有助于降低復(fù)雜度,其原因在于:為了找到某樣事物,你需要查找的地方越少,那么改起它來就會越容易、越安全。
- 考慮使用蠻力突破。蠻力也是一種強大的啟發(fā)式工具。
- 保持設(shè)計的模塊化。模塊化的目標是使得每個子程序或者類看上去像個“黑盒子”:你知道進去什么,也知道出來什么,但是你不知道在里面發(fā)生了什么。黑盒子有著如此簡潔的接口設(shè)計和定義明確的功能,對于給定任何特定的輸入,你都能準確預(yù)期相應(yīng)的輸出結(jié)果。模塊化這一概念和信息隱藏、封裝以及其他的設(shè)計啟發(fā)密切相關(guān)。但在一些時候,如果你去考慮如何把一堆黑盒子組裝成系統(tǒng),也許會獲得單純使用信息隱藏和封裝技術(shù)所無法獲得的深刻理解,因此這個概念值得放進去你的設(shè)計工具箱中。
設(shè)計實踐
前面幾節(jié)關(guān)注的都是與設(shè)計特性相關(guān)的啟發(fā)式方法,這一節(jié)將會講解一些設(shè)計實踐的啟發(fā)式方法一些你可能采用而且常??梢垣@得良好結(jié)果的工作步驟 。
迭代
設(shè)計是一種迭代的過程。當你在備選的設(shè)計方案之中循環(huán)并且嘗試一些不同的做法時,你將同時從高層和低層的不同視角去審視問題。你從高層世界中得出的大范圍圖景會有助于你把相關(guān)的底層細節(jié)納入考慮。你從低層視角中獲得的細節(jié)也會為你的高層決策尊定基礎(chǔ)。
分而治之
沒有人的頭腦能大到裝得下一個復(fù)雜程序的全部細節(jié)。把程序分解為不同的關(guān)注區(qū)域,然后分別處理每一個區(qū)域。如果在某個區(qū)域里碰上了死胡同,那么就迭代。
增量式地改進是一種管理復(fù)雜度的強大工具。理解問題、形成計劃、執(zhí)行計劃,而后再回顧你的做法。
建立試驗性原則
有些時候,除非你更好地了解了一些實現(xiàn)細節(jié),否則很難判斷一種設(shè)計方法是否湊效。有一種技術(shù)能夠低成本地解決這個問題,那就是建立試驗性原型——即“寫出用于回答特定設(shè)計問題的、量最少且能夠隨時扔掉的代碼的活動?!?/p>
合作設(shè)計
可以采取各種和他人交流的合作方式。
要做多少設(shè)計才夠
這要根據(jù)這個團隊的經(jīng)驗情況,項目大小等來綜合判斷決定要做多少設(shè)計。
記錄你的設(shè)計成果
- 把設(shè)計文檔插入到代碼里;
- 用wiki來記錄設(shè)計討論和決策;
- 寫總結(jié)郵件;
- 使用數(shù)碼相機;
- 保留設(shè)計掛圖;
總結(jié): 你在應(yīng)用某種設(shè)計方法時越教條化,你所能解決的現(xiàn)實問題就會越少。請把設(shè)計看成是一個險惡的、雜亂的和啟發(fā)式的過程。不要停留于你所想到的第一套解決方案,而是去尋求合作,探求間接性,在需要的時候做出原型,迭代,并進一步迭代。你將對自己的設(shè)計成果感動滿意。