在Java中,最適合模塊化的單元就是Jar文件。
代碼層面咱們關注的太多了,熟練的開發人員如今不多爭論使用模式的好處,也再也不識別哪一個模式適合當前須要,由於都可以本能地使用各類設計原則和模式,從GoF的設計模式到衍生出的設計原則,如今不少原則已經幾乎變成了本能,如「優先組合而不是繼承」、「面向抽象而不是面向實現」。
可是隻考慮類級別的設計,那麼無論設計的多麼漂亮,都不會代碼預期的收益。由於現有的設計原則和麪向對象開發模式不能幫助管理大型軟件系統的複雜性,由於他們解決的是不一樣的問題。
架構的目標是儘量減小變化的影響和成本。模塊化經過填補高層架構組件以及底層代碼之間的空白,幫助咱們實現這個目標。
通用的原則:
一、接口要更接近使用它們的類,而遠離實現它們的類。
二、異常應該接近拋出它們的類或接口,而不是接近捕獲異常的模塊
模塊化的一些模式和方法,大致的思想原則和類設計的原則類似,不少方法都是基於「依賴抽象而非依賴實現」這個原則的。
一、悖論,粒度越小的模塊越靈活,管理起來也就越複雜,如何在靈活性和管理複雜度二者間取捨。最大化重用使得可用複雜化,粒度越小的模塊重用性越高,可用性越低,也就是越不方便用,如何在重用性和可用性之間取捨。雖然沒有絕對的結論,可是大方向上有告終論。
二、穩定性,具備大量被依賴的模塊應該是很穩定的,也就是不多發生變化,變化帶來的影響更大。確保模塊穩定性最好的方式就是將其轉換爲抽象模塊。具備大量依賴其餘模塊的模塊,是不穩定的,很容易進行變化,易於使用,可是不容易測試(由於依賴其餘模塊太多),最好的方式應該依賴抽象模塊。
三、模塊等級必須分等級,模塊必須等級化,高等級依賴低等級,低等級不能依賴高等級,低等級不能有太多依賴,等級越低的模塊應該越穩定,不穩定的模塊應該放到高等級。
四、模塊重用,類級別重用不能跨應用(好比工具類),而模塊級別重用能夠跨應用。
軟件開發初期,需求處於不斷變化之中,模塊粒度應該大,易於管理和使用。隨着識別出需求變化的重點,找出了可重用的地方,較大模塊應該拆分紅較小的、更易於重用的細粒度模塊。軟件開發初期就試圖定義較小的細粒度模塊是很困難的,由於只能猜想重用點在哪,一般是失敗的。
五、模塊內聚:高內聚的模塊易於理解、維護和重用。影響模塊內聚的因素有2點,一個是類變化的頻率,另外一個是類的可重用性。軟件開發初期應基於變化頻率構建模塊,由於系統不穩定,系統穩定後,應基於重用構建模塊。也就是說軟件前期很難建立高內聚的模塊,隨着系統穩定,開發團隊應該從新組織系統以確保模塊都是內聚的。
六、模塊依賴,高等級模塊單向依賴低等級模塊是最好的,最很差的就是循環依賴,這裏提供幾個方法消除依賴。單向依賴時,好比低層級模塊依賴高等級模塊了,解決方法:
反轉關係:穩定模塊A依賴B的部分抽象接口,依賴本身接口,B去實現這個接口,達到B依賴A的反轉。
消除關係:抽象出模塊C,A依賴C(A使用C),B依賴C(B實現C),達到A和B不依賴關係。
兩個模塊有循環依賴關係,一般就是一個模塊,應該合併。若是不合並就要打破這種關係,解決辦法有:
上移:將依賴成因上移到高等級模塊,建立一個更高等級模塊,抽象出最低等級模塊依賴關係,達到單向依賴。
下移:將依賴成因下移到高等級模塊,與上移相反,建立一個更低等級模塊而已。
回調:定義一個抽象體,將其注入到模塊中,達到單向依賴甚至消除依賴個可能。
其實經過反轉和消除,也能解決循環依賴,根據具體使用場景選擇吧。
七、模塊應該輕量級,不依賴容器和運行環境,可單獨部署使用最好。
八、模塊管理,若是不打算重用某個模塊,那麼依賴管理的動力就是可維護性,若是想要可維護性提升,就要關注可測試性(越容易測試、則越容易維護)。最好在開始的時候儘量簡單並隨着需求出現加強模塊,而不是開始的時候基於預測建立複雜模塊。
九、默認實現,模塊應該有一個默認實現,若是沒有任何實現,模塊實際上只是一個規範。(好比默認實現就是插件式開發的一種方式。)
十、依賴抽象就必須保證獲取實現類的實例時,不能new,經常使用方法有3類,工廠方法、動態建立(如Spring注入)、OSGi μService。
十一、若是依賴抽象體的全部類都在一個模塊中,那麼將這些類和抽象體放在同一個模塊中。若是依賴抽象體的全部類位於多個模塊中,那麼將抽象體放到一個單獨的模塊中。
最後說說爲何要用OGSi來強制模塊化,「優雅的理念設計在實現的過程當中很快就可能變得一團糟,沒有開發人員可以理解最初的高級願景要如何展示在代碼中。儘管你很清楚預期的模塊關係是什麼,可是不想要的依賴依然會進入你的應用。」真實狀況確實如此,不論什麼緣由,最終的結果都是同樣的,就是咱們的代碼愈來愈差,模塊關係混亂了,代碼能夠按期重構,可是模塊重構的代價比較大,OGSi有個辦法強制解決,「等級化構建會強制你思考模塊依賴...由於任何新的依賴都須要修改構建腳本,因此對於開發人員,定義新的依賴必需要慎重。等級化構建使引入新的依賴要作更多的事情。」