Posted on 2008-04-06 13:00
dennis 閱讀(1574)
評(píng)論(0) 編輯 收藏 所屬分類:
模式與架構(gòu)
模塊化的價(jià)值毋庸置疑。
模塊化代碼的首要特質(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)通信。這就是模塊化原則的內(nèi)容。API在模塊間扮演雙重角色。在實(shí)現(xiàn)層面,作為模塊之間的滯塞點(diǎn)(choke point),阻止各自的內(nèi)部細(xì)節(jié)被相鄰模塊知曉;在設(shè)計(jì)層面,正是API(而不是模塊間的實(shí)現(xiàn)代碼)真正定義了整個(gè)體系。
模塊的最佳模塊大小,邏輯行在200到400之間,物理行在400到800之間為最佳。模塊太小,幾乎所有的復(fù)雜度都集中在接口,同樣不利于理解,也就是透明性的欠缺。
緊湊性就是一個(gè)特性能否裝進(jìn)人腦中的特性。理解緊湊性可以從它的“反面”來(lái)理解,緊湊性不等于“薄弱”,如果一個(gè)設(shè)計(jì)構(gòu)建在易于理解且
利于組合的抽象概念上,則這個(gè)系統(tǒng)能在具有非常強(qiáng)大、靈活的功能的同時(shí)保持緊湊。緊湊也不等同于“容易學(xué)習(xí)”:對(duì)于某些緊湊
設(shè)計(jì)而言,在掌握其精妙的內(nèi)在基礎(chǔ)概念模型之前,要理解這個(gè)設(shè)計(jì)相當(dāng)困難;但一旦理解了這個(gè)概念模型,整個(gè)視角就會(huì)改變,緊湊的奧妙也就十分簡(jiǎn)單了。緊湊也不意味著“小巧”。即使一個(gè)設(shè)計(jì)良好的系統(tǒng),對(duì)有經(jīng)驗(yàn)的用戶來(lái)說(shuō)沒什么特異之處、“一眼”就能看懂,但仍然可能包含很多部分。
評(píng)測(cè)一個(gè)API緊湊性的經(jīng)驗(yàn)法則是:API的入口點(diǎn)通常在7個(gè)左右,或者按《代碼大全2》的說(shuō)法,7+2和7-2的范圍內(nèi)。
如果兩個(gè)或更多事物中的一個(gè)發(fā)生變化,不會(huì)影響其他事物,這些事物就是正交的。每一個(gè)動(dòng)作只改變一件事,不會(huì)影響其他(沒有其他副作用)。舉個(gè)例子,比如讀取配置文件,獲得系統(tǒng)設(shè)置信息這個(gè)方法:
module Config
def self.load_config
config_str=File.open("r","config.xml").read
#解析配置文件,可能轉(zhuǎn)化成XML Dom處理等


end
end
這個(gè)方法想當(dāng)然地認(rèn)為配置文件存儲(chǔ)于磁盤文件中,然而配置文件完全是有可能通過(guò)網(wǎng)絡(luò)獲取的,也就是說(shuō)文件句柄未必來(lái)源于磁盤文件,這個(gè)方法承擔(dān)了兩個(gè)職責(zé):獲取配置數(shù)據(jù)和解析配置數(shù)據(jù)。重構(gòu)一下,以提高正交性:
module Config
def self.load_config(io)
config_str=io.read
parse_config(config_str)
end
private
def self.parse_config(config_str)
#解析
end
end
重構(gòu)技術(shù)中的很多壞味道,特別是重復(fù)代碼,是違反正交性的明顯例子,“重構(gòu)的原則性目標(biāo)就是提高正交性”。
DRY(Don't Repeat Yourself)原則,意思是說(shuō):任何一個(gè)知識(shí)點(diǎn)在系統(tǒng)內(nèi)都應(yīng)當(dāng)有一個(gè)唯一、明確、權(quán)威的表述。這個(gè)原則的另一種表述就是所謂SPOT原則(Single Point Of Truth)——真理的單點(diǎn)性。
提高設(shè)計(jì)的緊湊性,有一個(gè)精妙但強(qiáng)大的方法,就是圍繞“解決一個(gè)定義明確的問題”的強(qiáng)核心算法組織設(shè)計(jì),避免臆斷和捏造。