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

hard_man發表於2019-04-28

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應用模組化的思考及落地方案(二)模組化自動構建工具的使用

相關文章