iOS應用模塊化的思考及落地方案(一)模塊的劃分及模塊化工作流程

1.0 什麼是模塊化

很多關於重構設計模式的介紹中,經常提到的幾個詞語是複用解耦

模塊化之所以被提出,也更多是爲了解決這幾個問題。

複用可以減少重複造輪子的情況,很容易理解的是,我們經常使用的github上的第三方框架,比如,AFNetworking等,有了這些組件,我們就不需要再寫一遍了。

解耦可以減少類或文件之間的關聯,如果一個類引用了其他10個類,那麼當我們看到這個類或修改這個類的時候,我們同時需要關注另外10個類,瞭解它們與本類的關聯情況。如果你的類,沒有與其他任何類關聯,你在閱讀代碼的時候,完全可以忘記其他代碼的存在,只看這一個文件就夠了。

我們可以看出,低耦合的系統,能夠將無數簡單的模塊,組成複雜的工程。複用很明顯能夠提升工作效率,解放生產力。

這樣一來,你的系統是簡單的,清晰的,當你重構或修改系統的時候,可以不必有任何顧慮。

而實現低耦合可複用的手段,往往就稱爲模塊化。

在實際開發中,模塊往往被定義爲能夠獨立實現單一任務的代碼單元。

從代碼角度講,一個功能,一個文件,一個類,甚至一個函數,都可以成爲一個模塊。

除了上述優點之外,模塊化之後,每個模塊可以單獨開發,單獨測試,也更容易做內部代碼的權限管理。

上面已經說過,整個系統都是由不同的模塊構成。那麼問題的難點就在於,如何定義模塊的邊界。

2.0 模塊的劃分及通信

在客戶端實際開發中,根據模塊的使用方式,可以大致分爲2種。

第一種,提供非常基礎功能,會頻繁地被其他模塊引用,其他模塊可以直接引入這些模塊的api進行調用。比如:網絡模塊,常用工具類,佈局,圖片,其他依賴的第三方框架。

第二種,提供有價值的產品功能,更多的是頁面的展示接口,它從來不被別的模塊直接引用,更多地通過異步的方式來進行通信(使用路由)。比如:會員模塊,付費模塊,短視頻模塊等等。

另外,除了這兩種模塊之外,還有一種模塊既會被其他模塊頻繁地引用,也會提供頁面的展示接口。比如:登陸,收藏,關注等功能。這種模塊需要爲其他模塊提供數據及修改接口,有時候還需要展示UI。

其實對於第三種模塊來說,可以根據數據和展示,拆分爲2個模塊:一個模塊用於對外部提供數據,可以被其他模塊直接引用;另一個模塊用於通過異步的方式進行頁面的展示。

3.0 iOS模塊化的實踐方案

3.1 模塊化工作流程

iOS中的模塊化,不同的模塊是通過動態庫/靜態庫的方式引入到主工程中的。

動態庫和靜態庫的區別無需多說,可根據需要自行選擇。

cocoapods是一個非常優秀的模塊管理工具。

我們使用cocoapods來管理不同的模塊時,代碼可以以3種存在形式出現,分別是:源碼,靜態庫,動態庫。

所以在模塊化之前,我們需要提前進行的工作有:

  • 安裝cocoapods
  • 建立pod私有庫,用來存儲我們所有模塊的podspec文件

我們創建一個新模塊工作流應該是這樣的:

  • 建立一個新工程,修改必要設置
  • 建立Podfile文件,添加依賴,然後執行pod install安裝依賴
  • 開始開發工作,開發過程中,你可能需要建立一個Demo工程或者Demo target用於在開發過程中,測試你的靜態庫api
  • 編寫單元測試
  • 測試通過後,你需要將代碼提交到git中,並且打一個tag
  • 編寫podspec文件
  • 檢查podspec文件的正確性
  • 使用pod repo push命令將podspec文件推到pod私有庫中
  • 如果其他模塊想要引用這個模塊,按照pod標準使用方式安裝依賴即可

3.2 可能遇到的問題

在上述流程中,可能遇到的問題有:

  1. podspec文件怎麼寫?
  2. podspec文件提交和更新需要怎麼做?
  3. Podfile文件怎麼寫?
  4. 如果我開發的模塊依賴了我們之前開發的其他的模塊該怎麼處理?如果我依賴的模塊也需要修改,應該怎樣處理?
  5. 產生循環依賴怎麼辦?A依賴B,B又依賴A。
  6. 怎樣處理圖片等資源文件
  7. 如何進行OC與swift的混編
  8. framework如何編譯,如何減肥,如何合併

4.0 流程自動化

我們可以看到,創建模塊化的過程流程比較多,涉及的技術也很多:cocoapods,Xcode設置,資源管理,Swift&OC編譯管理,靜態庫接入方式等等。

其中很多技術內容其實並不常用,在開發過程中,我們遇到問題後,即時查閱文檔解決,過了一段時間,遇到同樣的問題可能還需要再查閱。

而且,不同的人在實踐過程中,可能會遇到相同的問題,每個人都需要解決一次。

流程過多,還容易因爲誤操作而產生錯誤,這種問題很難解決,往往遇到就會花費大量時間處理。

我們再回頭看一下工作流程,其實很多工作都是固定不變的,每次創建新模塊都是重複同樣的過程,因此這部分流程我們可以通過自動化腳本自動完成。

我們哪些工作可以使用腳本完成呢?

  1. 創建模塊工程Demo工程,自動設置裏面的Build Setting選項,並使用.xcworkspace來管理
  2. 部分內容根據用戶輸入,自動創建podspec文件,並檢查其正確性
  3. 根據用戶輸入的依賴模塊,自動創建不同工程的Podfile文件,並使用pod install安裝依賴
  4. 管理模塊目錄結構,腳本能夠方便的對模塊進行增刪改查
  5. 如果某個模塊依賴的是我們自己開發的其他模塊,那麼被依賴的模塊會以local path的方式引入到工程中,這樣我們可以在當前模塊的工程中直接修改依賴模塊的代碼並進行測試,不需要打開多個工程。開發完成後,分別進行提交。
  6. 自動安裝腳本所依賴的軟件和環境
  7. 記錄已經push到私有庫的模塊,方便處理多依賴模塊的開發
  8. 開發完成後,使用腳本一鍵推送到pod庫中
  9. 對已經在pod庫中的模塊進行二次開發時,可以一鍵拉取工程並安裝所有依賴

完成上面的功能後,我們可以發現:

  1. 對於全新的模塊,我們可以使用腳本,一鍵創建工程,然後就可以進行業務開發了,開發之後,只需要再執行一個腳本,就能夠推送到私有庫中,不需要了解cocoapods和Xcode設置的任何細節。
  2. 對於二次開發的模塊,我們同樣適用腳本,一鍵拉取工程及所有依賴,僅僅關注業務開發即可。開發完成後,同樣使用腳本一鍵推送到私有庫中。

–完--

  1. iOS應用模塊化的思考及落地方案(一)模塊的劃分及模塊化工作流程
  2. iOS應用模塊化的思考及落地方案(二)模塊化自動構建工具的使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章