1. 軟件設(shè)計目標(biāo)
<strong>幫助其它人</strong>,做與軟件相關(guān)的決策時,指導(dǎo)法則就是判斷能夠提供什么樣的幫助。一個人寫出優(yōu)秀軟件的能力,完全取決于他在多大程度上理解了“幫助其它人”的思想。
- 確保軟件能夠提盡可能多的幫助;
- 確保軟件能夠持續(xù)提供盡可能多的幫助;
- 設(shè)計程序員能盡可能容易開發(fā)和維護的軟件系統(tǒng),這樣的系統(tǒng)才能為用戶提供盡可能多的幫助,而且能持續(xù)提供盡可能多的幫助;
2. 關(guān)于未來
1.相比降低實現(xiàn)成本,降低維護成本更加重要
2.設(shè)計質(zhì)量的好壞,正比于該系統(tǒng)未來能持續(xù)幫助他人時間的長度
通俗點就是,如果你的軟件只能在未來幾小時內(nèi)提供幫助,就不需要花太多的功夫去設(shè)計,如果需要在未來10年內(nèi)都能派上用場,就需要花很多精力去設(shè)計。
3.所以,軟件設(shè)計時最關(guān)注的應(yīng)該是未來。但是,未來的某些事情,是我們所不知道的。程序員犯的最常見也是最嚴(yán)重的錯誤,就是在其實不知道未來的情況下去預(yù)測未來。
在軟件設(shè)計時,可以根據(jù)已知的信息去做某些決策,目的是為了創(chuàng)造更好的未來(提升價值、降低維護成本),而不必預(yù)測未來究竟發(fā)生什么具體的事情。
3. 關(guān)于變化
程序存在的時間越久,它的某個部分需要變化的可能性就越高;
關(guān)鍵在于,我們并不需要去預(yù)測有什么變化 ,我們知道的是,變化必然會發(fā)生,程序應(yīng)該<strong>保證盡可能合理的靈活性</strong>。
回預(yù)某個特定文件修改歷史,問問自己,最初寫這個文件時,你能預(yù)測到這些變化嗎?是否一開始寫好就能夠減輕后期的工作量??偟膩碚f,就是嘗試?yán)斫饷看涡薷?,看看能否從中得到一些關(guān)于軟件開發(fā)的新收獲。
軟件設(shè)計三大誤區(qū)
- 編寫不必要的代碼
不要編寫不需要的代碼,并且要刪除沒有用到的代碼。- 代碼難以修改(僵化設(shè)計)
* 對未來做太多假設(shè)
* 不仔細(xì)設(shè)計就開始編碼
* 設(shè)計程序時,應(yīng)當(dāng)根據(jù)現(xiàn)在知道的確切的需求,而不是我們認(rèn)為未來會出現(xiàn)的需求。
- 過分追求通用;
- 僅僅根據(jù)目前確知的需求來考慮通用
- 如果設(shè)計讓事情變復(fù)雜而不是變簡單,就是在做過度工程
漸進式設(shè)計
漸進式開發(fā)
4. 缺陷和設(shè)計
最好的設(shè)計,就是能適應(yīng)外界盡可能多的變化,而軟件自身的變化要盡可能的少
- 永遠(yuǎn)不要"修正"任何東西,除非它真是一個問題,而且有證據(jù)表明問題確實存在;
- 避免重復(fù)
理想情況下,任何系統(tǒng)里的任何信息,都應(yīng)當(dāng)只存在一次或只存在一個地方;讓各處的代碼可以“使用Use”、“調(diào)用Call”、“包含Include”已有的其它代碼;
5. 簡潔
軟件的任何一部分越簡單,維護難度越小,成本越低。
簡潔是指某部分的代碼,而不是指整個系統(tǒng)。
- 簡潔是相對的
- 簡潔到什么程度?傻子也能看懂
- 保持一致
如果在一個地方采取了某種規(guī)則,就應(yīng)當(dāng)在其它每個地方都遵守這種規(guī)則,如變量命名方式等。 - 可讀性
- 空白:字符、代碼行之間留有合適的空白
- 命名:名字應(yīng)該足夠長,能完整表達其意義或描述其功能,但不能太長影響閱讀
- 注釋:程序簡單的不能再簡單的時候,再添加注釋
6. 復(fù)雜性
以下情況會增加復(fù)雜性:
- 擴展軟件的用途:應(yīng)當(dāng)絕對禁止這樣做
- 新增程序員: 除非是高高手
- 做無謂的改變:需求變化、設(shè)計變化、代碼變化等,謹(jǐn)慎決策
- 困于糟糕的技術(shù):先前采用的技術(shù)不能靈活地適應(yīng)未來的需求
- 理解錯誤:越不理解自己的工作,就越容易設(shè)計出復(fù)雜的系統(tǒng)
- 糟糕的設(shè)計或不做設(shè)計:指的是“沒有為變化做設(shè)計”
- 重新發(fā)明輪子:不要什么都自力更生,使用成熟的輪子
復(fù)雜性及錯誤的解決辦法
需要反問的問題是:真正要解決的問題是什么?
-
問題復(fù)雜
解法不一定復(fù)雜;大多數(shù)麻煩的設(shè)計問題,都可以用在紙上畫圖或?qū)懗鰜淼霓k法中找到答案。 - 應(yīng)對復(fù)雜性
- 如果系統(tǒng)中某個部分太過復(fù)雜,有個好辦法可以解決:把它分解成幾個獨立的小部分,逐步重新設(shè)計;每次修改都應(yīng)該足夠小,這樣可以放心動手,不會讓事情變得更復(fù)雜。
- 如果遇到不可解決的復(fù)雜性,在程序外面妥善包裝上一層,讓其它程序員更容易理解和使用
7. 測試
測試法則:
- 對軟件行為的了解程度,等于真正測試它的程度。測試程度包括:軟件有多個方面曾經(jīng)測試過,上次測試是多久以前,在多少不同的環(huán)境下經(jīng)過測試等。
- 必須保證測試是準(zhǔn)確的,它的行為完全符合預(yù)期,測試結(jié)果必須有效。