閱讀211 返回首頁    go 阿裏雲 go 技術社區[雲棲]


模塊的設計(書摘)

模塊化的價值毋庸置疑。
    模塊化代碼的首要特質就是封裝。封裝良好的模塊不會過多向外部披露自身的細節,不會直接調用其它模塊的實現碼,也不會胡亂共享全局數據。模塊之間通過應用程序編程接口(API)——一組嚴密、定義良好的程序調用和數據結構來通信。這就是模塊化原則的內容。API在模塊間扮演雙重角色。在實現層麵,作為模塊之間的滯塞點(choke point),阻止各自的內部細節被相鄰模塊知曉;在設計層麵,正是API(而不是模塊間的實現代碼)真正定義了整個體係。
    模塊的最佳模塊大小,邏輯行在200到400之間,物理行在400到800之間為最佳。模塊太小,幾乎所有的複雜度都集中在接口,同樣不利於理解,也就是透明性的欠缺。
   緊湊性就是一個特性能否裝進人腦中的特性。理解緊湊性可以從它的“反麵”來理解,緊湊性不等於“薄弱”,如果一個設計構建在易於理解且利於組合的抽象概念上,則這個係統能在具有非常強大、靈活的功能的同時保持緊湊。緊湊也不等同於“容易學習”:對於某些緊湊 設計而言,在掌握其精妙的內在基礎概念模型之前,要理解這個設計相當困難;但一旦理解了這個概念模型,整個視角就會改變,緊湊的奧妙也就十分簡單了。緊湊也不意味著“小巧”。即使一個設計良好的係統,對有經驗的用戶來說沒什麼特異之處、“一眼”就能看懂,但仍然可能包含很多部分。
    評測一個API緊湊性的經驗法則是:API的入口點通常在7個左右,或者按《代碼大全2》的說法,7+2和7-2的範圍內。
    如果兩個或更多事物中的一個發生變化,不會影響其他事物,這些事物就是正交的。每一個動作隻改變一件事,不會影響其他(沒有其他副作用)。舉個例子,比如讀取配置文件,獲得係統設置信息這個方法:
module Config
   
def self.load_config
         config_str
=File.open("r","config.xml").read
         
#解析配置文件,可能轉化成XML Dom處理等
         
   end
end
這個方法想當然地認為配置文件存儲於磁盤文件中,然而配置文件完全是有可能通過網絡獲取的,也就是說文件句柄未必來源於磁盤文件,這個方法承擔了兩個職責:獲取配置數據和解析配置數據。重構一下,以提高正交性:
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

    重構技術中的很多壞味道,特別是重複代碼,是違反正交性的明顯例子,“重構的原則性目標就是提高正交性”。
    DRY(Don't Repeat Yourself)原則,意思是說:任何一個知識點在係統內都應當有一個唯一、明確、權威的表述。這個原則的另一種表述就是所謂SPOT原則(Single Point Of Truth)——真理的單點性。
    提高設計的緊湊性,有一個精妙但強大的方法,就是圍繞“解決一個定義明確的問題”的強核心算法組織設計,避免臆斷和捏造。

文章轉自莊周夢蝶  ,原文發布時間 2008-04-06

最後更新:2017-05-17 18:01:36

  上一篇:go  RDS for MySQL 字符序(collation)引發的性能問題
  下一篇:go  關於binary search