什么是模塊化
模塊化這個詞最早出現在研究工程設計中的《Design Rules》,這本探路性質的書中。其后模塊化原則還只是作為計算機科學的理論,尚不是工程實踐。此時硬件的模塊化一直是工程技術的基石之一。如標准螺紋、汽車組件、計算機硬件組件等。
軟件模塊化的原則也是隨着軟件的復雜性誕生的。從開始的機器碼、子程序划分、庫、框架、再到分布在成千上萬公里的互聯網上主機上的程序庫。模塊化是解決軟件復雜性的重要方法之一。
模塊化以分治法為依據,但是否意味着我們把軟件無限制的細分下去。事實上當分割過細,模塊總數增多,每個模塊的成本確實減少了,但模塊接口所需代價隨之增加。要確保模塊的合理分割則須了解信息隱藏,內聚度及耦合度。
模塊化的意義
一句話:解決軟件的復雜性問題,或說降低軟件的復雜性。不至於隨着變大而不可控而失敗,使其可控,可維護,可擴展。
從這個意義上說:要編寫復雜軟件又不至於失敗的唯一方法就是用定義良好的接口把若干簡單模塊組合起來。如此,多數問題只會出現在局部,那么就有希望對局部進行改造、優化甚至替換,而不至於牽動全局。
更術語一些的定義:模塊化是一個軟件系統的屬性,這個系統被分解為一組高內聚、低耦合的模塊。這些模塊拼湊下就能組合出各種功能的軟件,而拼湊是靈活的,自由的。經驗豐富的工程師負責模塊接口的定義,經驗較少的則負責實現模塊的開發。
什么是模塊
上面提到,模塊化是以分治法為依據。簡單說就是把軟件整體划分,划分后的塊組成了軟件。這些塊都相對獨立,之間用接口(協議)通信,每個塊完成一個功能,多個塊組合可以完成一系列功能。
以上可以看出划分后的模塊應該具有清晰的,有文檔描述的邊界(接口/協議)。不同的語言對於模塊的實現不同。比如SmallTalk,沒有模塊的概念,所以類就成了划分的唯一物理單元。Java有包的概念,也有類的概念。因此單獨的類可以用來划分模塊,包也可以用來划分。JavaScript是基於對象的語言,它創建對象無需先聲明一個類,因此對象是天然用來划分模塊的。
無論那種語言,封裝是寫模塊的首要特質。即模塊不會暴露自身的實現細節,不會調用其它模塊的實現碼,不會共享全局變量。一切只靠接口通信。模塊化和封裝是密不可分的。
模塊的大小
模塊分的越多,每一塊就越小,接口的定義就越重要。全局復雜度和受bug影響的程度也會相應降低。軟件應設計成由層次分明的嵌套模塊組成,而且每層的模塊粒度應該降至最低。Hatton繪制了一張缺陷密度和模塊大小的關系圖,發現曲線呈U型,凹面朝上。

可以看到,模塊過大或過小都會滋生更多的bug。Hatton的經驗表明,200~400行之間的邏輯行的代碼是最佳的。
緊湊的模塊
緊湊型是一個設計是否能裝入人腦的的設計。緊湊的設計讓人樂於使用,不會在你的想法與實際工作之間格格不入。緊湊不等同於“薄弱”,也不等同於“容易學習”。對於某些緊湊學習而言,在掌握其精妙的內在概念模型之前,要理解它是非常困難的。比如 Lisp 語言的設計就是緊湊的,又如 jQuery 庫的設計也是非常緊湊的。
正交的模塊
正交性是有助於使復雜設計也能緊湊的最重要特性之一。在純正交設計的軟件中,任何操作均無 副作用。每一個動作(方法調用)只做一件事,不會影響其它。
Douglas McIlroy 的“只做好一件事”的忠告是針對簡單性的建議,但其實也暗含了對正交性的強調。
