軟件設(shè)計有兩種模式:一種是設(shè)計得極為簡潔,沒有看得到的缺陷;另一種是設(shè)計得極為復(fù)雜,有缺陷也看不出來,第一種方式的難度要大得多。
模塊化原則就是要編寫復(fù)雜軟件又不至于一敗涂地的唯一方法,用定義清晰的接口把若干簡單模塊組合起來,多數(shù)問題只會出現(xiàn)在局部,還有希望對局部進行改進或優(yōu)化,而不至于牽動全身。
相對于其他程序員,Unix程序骨子里的傳統(tǒng)是:更加篤信重視模塊化、更注重正交性和緊湊型等問題。
1. 封裝和最佳模塊大小
模塊化代碼的首要特質(zhì)是封裝,封裝良好的模塊不會過多向外紕漏自身細節(jié),不會直接調(diào)用其它模塊的實現(xiàn)碼,也不會胡亂共享全局數(shù)據(jù)。模塊之間通過應(yīng)用程序編程接口(API)----一組嚴密、定義良好的程序調(diào)用和數(shù)據(jù)結(jié)構(gòu)來通信
有一種良好的方式來驗證API是否設(shè)計良好:如果試著用純?nèi)祟愓Z言描述設(shè)計(不允許摘錄任何源代碼),是否能把事情說清楚。
模塊分解得越徹底,每一塊越小,API定義也就越重要。全局復(fù)雜度和受bug影響的程序也會相應(yīng)降低。軟件系統(tǒng)應(yīng)設(shè)計成由層次分明的嵌套模塊組成,而且每個層面上的模塊粒度應(yīng)降至最低。
2、緊湊性
設(shè)計是否能裝進人腦中,測試軟件緊湊型一個很實用的好方法是:有經(jīng)驗的用戶通常需要操作手冊嗎?如果不需要,那么這個設(shè)計(或者至少這個設(shè)計的涵蓋正常用途的子集)就是緊湊的。
3、正交性
在純粹的正交設(shè)計中,任何操作均無副作用;每一個動作(無論是API調(diào)用、宏調(diào)用還是語言運算)只改變一件事,不會影響其它。無論你控制的是什么系統(tǒng),改變每個屬性的方法有且只有一個。
4、STOP原則
任何一個知識的再系統(tǒng)內(nèi)部都應(yīng)當(dāng)有一個唯一、明確、權(quán)威的表述。
重復(fù)會導(dǎo)致前后矛盾、產(chǎn)生隱微問題的代碼,原因是當(dāng)你修改重復(fù)點,往往只改一部分而非全部。
5.模塊式編碼
(1)有多少全局變量?全局變量很容易使模塊輕率、混亂相互泄露信息
(2)模塊內(nèi)函數(shù)是不是太大了,如果不能用一句話來簡單描述一個函數(shù)與其調(diào)用程序之間的約定,這個函數(shù)可能太大了
如果局部變量太多,傾向于拆分子程序。或者代碼行是否存在太多縮進