讀古今文學網 > 程序員必讀之軟件架構 > 用組件封裝 >

用組件封裝

用層來組織代碼庫使得軟件的整體結構更易觀察,但這也有取捨。舉個例子,為了改變特性或用戶故事,你需要深入多個層(比如包、命名空間等)探究。同時,考慮到企業系統內有相當標準的分層方法,很多代碼庫最後看起來都驚人地相似。

鮑勃·馬丁大叔在Screaming Architecture5 中說,如果你正在看一個代碼庫,它應該喊出跟業務領域相關的東西。以特性而不是分層來組織代碼能夠做到這一點,但同樣有取捨。我喜歡一點細微的變化,就是明確地以組件來組織代碼。舉個例子,如果你去GitHub看看je.techtribes.component.tweet這個包2 ,就會發現它看起來像這樣。

5 http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html

用組件封裝

這很像以特性來封裝,但它更類似於馬克·尼達姆在博文6 中談到的「微服務」。je.techtribes.component7 的每個子包都安置了一個單獨的組件,具有自己內部的層和配置。只要可能,其內部的作用域都在包內。每個組件都可以拿出來,放進它自己的項目或源代碼倉庫,分別控制版本。如果你在構建有非常明確的松耦合架構的東西,比如由松耦合組件組成的分佈式消息系統,可能會對這種方法感到很熟悉。

6 http://www.markhneedham.com/blog/2012/02/20/coding-packaging-by-vertical-slice/

7 https://github.com/techtribesje/techtribesje/tree/master/techtribes-core/src/je/techtribes/component

儘管大多數人以組件為單位考慮他們的系統,然而他們構建的東西本質上還是更整體化,對此我相當有信心。過去我當然也用類似方法封裝過整體化代碼庫的一部分,但這往往是相當專門化的。老實說,以包來組織代碼並不怎麼費腦子,特別是考慮到我們所掌握的重構工具。以組件來組織代碼讓你可以從架構到代碼庫明確地反映「組件」的概念。如果你的軟件架構圖喊出了跟業務領域相關的東西(也應如此),這也會反映在你的代碼庫裡。