一、模塊化設計的概述:
模塊化設計(Block-based design):對一定范圍內的不同功能或相同功能的不同性能、不同規格的產品進行功能分析的基礎上,划分並設計出一系列功能模塊,通過模塊的選擇和組合構成不同的定制產品,以滿足市場的不同需求。
模塊化設計是綠色設計方法之一,綠色設計是指“在產品整個生命周期內,着重考慮產品環境屬性(可拆卸性、可回收性、可維護性、可重復利用性等)並將其作為設計目標,在滿足環境目標要求的同時,保證產品應該有的功能、使用壽命、質量等要求”。
綠色設計的原則被公認為“3R”的原則,即Reduce,Reuse, Recycle, 減少環境污染、減小能源消耗,產品和零部件的回收再生循環或者重新利用。
二、 模塊化設計的特點:
- 控制了程序設計的復雜性:模塊化設計將整體進行切割封裝,每一小的功能即可封裝成一個小的模塊,獨立運行,互不影響,控制了整體的復雜性。
- 各模塊相對獨立、功能單一、結構清晰、接口簡單:模塊化后的代碼相對獨立,功能單一,只在外部提供必要的接口供外界調用,內部的實現過程,隱藏在內部,面向對象的接口編程,使得結構清晰,接口簡單,能達到高內聚,低耦合的效果。
- 通用性:模塊化設計需要保證抽出來的功能無論是在SDK支持的功能上還是屏幕尺寸的適配上都用靈活性的方法來封裝,這樣才能保證應用能夠部署在支持的最低系統版本基礎上的同時,適應不同屏幕的適配。
- 避免程序開發的重復勞動:每個項目中,都會或多或少的涉及到相同的功能和UI界面展示,將這些相同的功能或界面UI進行模塊化,無疑是能避免程序開發的重復勞動,同時也能夠提高編碼的質量。
- 縮短了開發周期:將項目中涉及到的功能和UI界面提前進行模塊化后,需要用到時直接調用,進行組裝,能縮短開發周期,同時也能避免資源浪費。
- 易於維護和功能擴充:因為將整體的功能進行模塊化,使得每一個功能只是一個小的功能點,相對來說,更易於維護。有新的需求,需要增加新的功能點,也方便統一擴充,之前模塊化好的代碼也無需改動,易於維護。
三、模塊的划分:
模塊的划分可以從架構層面、業務層面或功能層面上進行划分:
(一)架構層面:
每個項目都會有整體的架構,這個架構就像地基一樣,只有搭好了架構才能在這個基礎上進行相應模塊功能的開發。項目架構在搭建的過程中,從層級上來說,可以按以下方式進行搭建(以下為有名服務的架構):
項目目錄“UrMingService”,主要開發工作區域下,整體分為“Classes”, “Resources”/ “Tools”和“Supporting Files”三個大的目錄:
1、在“Classes”這個目錄下每個模塊又按MVC的設計模式進行搭建,進行分門別類,方便管理,也增加了代碼層級的可讀性,我們在“有名服務”的項目中分為“首頁”、“消息”、“發布”、“訂單”和“我的”五個大模塊,搭建架構時,在這幾大業務模塊的基礎上,增設一個“Public”模塊,這個模塊里面主要是放置一些項目最上層級的基類或公共類,比如導航欄和底部標簽欄整體風格的設置等,也可以用MVC的模式進行層級化管理。
2、“Resources”/ “Tools”這個目錄下,主要是分門別類按功能進行封裝好的工具類和整個項目會用到的圖片資源,對於圖片資源放置的層級目錄可以按大致分為:引導頁、導航欄、標簽欄和展示類。
3、“Supporting Files”這個目錄下,主要用於放置整個項目會用到的本地文件,應用icon和啟動頁圖片管理的“Images.xcassets”,系統全局配置文件,國際化文件等。
(二)業務層面:
業務層面的模塊划分跟產品設計的業務模塊划分有關,可以將不同業務划分成各個子模塊,這是相對整體又獨立的划分,比如“有名服務”中我們將業務模塊划分為“首頁”、“消息”、“發布”、“訂單”和“我的”,每一個相對獨立的業務模塊組裝在一起,完成了“有名服務”所要展示的主題與業務。
業務模塊的統一與業務模塊之下的UI界面風格的統一有利於打造一系列同類風格的產品,這樣可以在架構與功能模塊化的基礎上,將同類產品進行整體的模塊化,實行工廠化定制開發。
優點:從業務層面上的划分,會使得各個模塊更加獨立。
缺點:處理公共的事務將會變得繁瑣。
(三)功能層面:
功能層面的模塊划分,是為了功能獨立,實現高內聚,低耦合。每一個小的功能模塊能運行,能調試,能測試,各個功能之間基本是完全獨立的,不存在相互依賴的關系。
但是功能是與業務無法分割的,我們在開發時,需要宏觀的把控業務與功能之間的關系,對於相似的業務模塊,需要統一區別開發,協作完成,防止出現重復做工。
優點:職責獨立清晰。
缺點:各司其責,缺少連續性與宏觀性。
四、 常見問題及解決方案:
1、問題:相同功能,多處使用。
解決方案:將各個功能按職責剝離出來,各自開發各自的功能模塊。
能獨立運行,能編譯為靜態庫,有完整的內部接口文檔。
符合:可拆卸行、可回收性、可維護性和可重復利用性。
2、問題:如果模塊拆分后,各個模塊經常會有第三方庫的依賴,比如公共庫等。如何避免重復引用及引用版本的問題。
解決方案:用CocoaPods軟件解決。
第三方的依賴全部由它自帶的podfile配置完成,它會根據項目中引用的第三方打包於項目中,如果遇到多個重復引用時,它將會合並引用。我們的各個模塊也可以做成獨立的podspecs文件,供其他模塊引用,這樣就可以實現模塊的升級與更新。
3、問題:功能模塊化后,每個模塊的具體功能是怎樣的?
將應用程序中的功能分解為獨立的模塊,這帶來了一個新的挑戰——我們需要確保這些互不依賴的零件們能夠在一起工作。
一個模塊系統的另一個特點是外部依賴的聲明。很多組件對外部條件有一定需求。使用依賴模式來維持模塊系統中組件之間的依賴性有一個大前提,那就是我們必須遵循一系列的規則:
第一個規則是向后兼容性:如果新版本發布,那么所有在之前版本下可建立的契約也必須能夠在新版本下工作。
第二個規則是,系統中的組件需要准確的說明它們需要什么。當一個模塊的依賴性產生改變的時候,它必須要說出來,這樣系統才能夠准確的確認這些依賴性是否被滿足。
五、模塊化設計綜述:
模塊最重要的屬性是它們應該盡可能的獨立和自包含;模塊應被設計成可以提供一整套功能,以便程序的其它部分與它清楚地相互作用;模塊提供的功能必須是完整的,以便它的調用者們可以各取所需。
模塊化就是為了減少循環依賴,減少耦合,提高設計和開發的效率。為了做到這一點,我們需要有一個設計規則,所有的模塊都在這個規則下進行設計。良好的設計規則,會把耦合密集的設計參數進行歸類作為一個模塊,並以此划分工作任務。而模塊之間彼此通過一個固定的接口(所謂的可見參數)進行交互,除此之外 的內部實現(所謂的隱參數)則由模塊的開發團隊進行自由發揮。
最后但也是重要的一點:方法命名的規范性很重要,注釋很重要,如果沒有注釋只有開發者心中很清楚,所以必要的注釋會給后期的代碼維護工作帶來便利的同時也提高效率。每個界面的主要是用於做什么的,可以在頭文件中適當進行說明,如圖:
參考文獻:
http://doruby.com/projectmanage/2013/04/12/block-based-design/
http://developer.51cto.com/art/201001/179842_1.htm
http://book.51cto.com/art/201007/212898.htm
http://blog.csdn.net/newjerryj/article/details/7749901
http://blog.csdn.net/optman/article/details/2319450
http://blog.csdn.net/jyc1228/article/details/4636037