軟件設(shè)計(jì)有兩種模式:一種是設(shè)計(jì)得極為簡(jiǎn)潔清寇,沒(méi)有看得到的缺陷浩村;另一種是設(shè)計(jì)得極為復(fù)雜做葵,有缺陷也看不出來(lái),第一種方式的難度要大得多心墅。
模塊化原則就是要編寫(xiě)復(fù)雜軟件又不至于一敗涂地的唯一方法酿矢,用定義清晰的接口把若干簡(jiǎn)單模塊組合起來(lái),多數(shù)問(wèn)題只會(huì)出現(xiàn)在局部嗓化,還有希望對(duì)局部進(jìn)行改進(jìn)或優(yōu)化棠涮,而不至于牽動(dòng)全身。
相對(duì)于其他程序員刺覆,Unix程序骨子里的傳統(tǒng)是:更加篤信重視模塊化严肪、更注重正交性和緊湊型等問(wèn)題。
1. 封裝和最佳模塊大小
模塊化代碼的首要特質(zhì)是封裝谦屑,封裝良好的模塊不會(huì)過(guò)多向外紕漏自身細(xì)節(jié)驳糯,不會(huì)直接調(diào)用其它模塊的實(shí)現(xiàn)碼,也不會(huì)胡亂共享全局?jǐn)?shù)據(jù)氢橙。模塊之間通過(guò)應(yīng)用程序編程接口(API)----一組嚴(yán)密酝枢、定義良好的程序調(diào)用和數(shù)據(jù)結(jié)構(gòu)來(lái)通信
有一種良好的方式來(lái)驗(yàn)證API是否設(shè)計(jì)良好:如果試著用純?nèi)祟愓Z(yǔ)言描述設(shè)計(jì)(不允許摘錄任何源代碼),是否能把事情說(shuō)清楚悍手。
模塊分解得越徹底帘睦,每一塊越小,API定義也就越重要坦康。全局復(fù)雜度和受bug影響的程序也會(huì)相應(yīng)降低竣付。軟件系統(tǒng)應(yīng)設(shè)計(jì)成由層次分明的嵌套模塊組成,而且每個(gè)層面上的模塊粒度應(yīng)降至最低滞欠。
2古胆、緊湊性
設(shè)計(jì)是否能裝進(jìn)人腦中,測(cè)試軟件緊湊型一個(gè)很實(shí)用的好方法是:有經(jīng)驗(yàn)的用戶通常需要操作手冊(cè)嗎筛璧?如果不需要逸绎,那么這個(gè)設(shè)計(jì)(或者至少這個(gè)設(shè)計(jì)的涵蓋正常用途的子集)就是緊湊的。
3夭谤、正交性
在純粹的正交設(shè)計(jì)中棺牧,任何操作均無(wú)副作用;每一個(gè)動(dòng)作(無(wú)論是API調(diào)用沮翔、宏調(diào)用還是語(yǔ)言運(yùn)算)只改變一件事陨帆,不會(huì)影響其它曲秉。無(wú)論你控制的是什么系統(tǒng),改變每個(gè)屬性的方法有且只有一個(gè)疲牵。
4承二、STOP原則
任何一個(gè)知識(shí)的再系統(tǒng)內(nèi)部都應(yīng)當(dāng)有一個(gè)唯一、明確纲爸、權(quán)威的表述亥鸠。
重復(fù)會(huì)導(dǎo)致前后矛盾、產(chǎn)生隱微問(wèn)題的代碼识啦,原因是當(dāng)你修改重復(fù)點(diǎn)负蚊,往往只改一部分而非全部。
5.模塊式編碼
(1)有多少全局變量颓哮?全局變量很容易使模塊輕率家妆、混亂相互泄露信息
(2)模塊內(nèi)函數(shù)是不是太大了,如果不能用一句話來(lái)簡(jiǎn)單描述一個(gè)函數(shù)與其調(diào)用程序之間的約定冕茅,這個(gè)函數(shù)可能太大了
如果局部變量太多伤极,傾向于拆分子程序∫躺耍或者代碼行是否存在太多縮進(jìn)