iOS組件化實踐(二):準備

前言

上一篇中我們對組件化是什么和常用的組件化中間件方案做了簡單的介紹,這篇文章則是用來說明開始進行組件化時需要做哪些準備工作,希望本文能給你帶來幫助。

一、概述

在實施組件化之前,我們需要進行一些準備才能保證接下來的工作順利愉快的進行。首先便是需要對目前的項目結構做分層設計,因為在實施組件化時,的概念很重要。那什么是層?又如何分層呢?

首先我們來理解層的概念。以常見的MVC架構為例,一般都是Controller持有View和Model,然后Controller根據需求更新Model并將Model轉為對應的View可用數據,通過View的數據源及代理方法刷新View。這種關系形如下圖:

MVC的關系圖

而項目中的文件結構大概如下:

當項目的功能模塊累加到一定程度時,我們會發現MVC的三個文件夾中內容越來越多,查找起來十分麻煩,因此我們可能會對項目結構做如下優化:

  • 對MVC這三個文件夾做拆分,里面分為各個模塊:
  • 根據模塊拆分項目,每個模塊內部分為MVC:

拆分到這里時,有時候就會發現項目中會出現一些不知道歸屬于哪個模塊,或者公用的代碼,這時候很多人會選擇建立一個Common文件夾,用于存放這些零散的代碼:

時間長了,Common內的代碼越來越多,直到某一天發現難以維護了,于是將Common內的提供基礎功能的模塊封裝成二方庫,通過靜態庫或者直接用CocoaPods這種依賴管理工具集成:

此時,作為基礎庫的MyNetworkingA,B這種業務模塊提供了基礎功能的支持,這樣就天然形成了層次關系。總結一下,層就是特定功能的代碼集合。一般來說,設計的比較優秀的分層架構,都會保持上層對下層的單項依賴,例如我們用的平時用的AFNetworking就是如此:AFHTTPSession依賴于AFURLSession,AFURLSession依賴于NSURLSession,NSURLSession依賴于CFNetwork,這些依賴都是單向的,因此邏輯非常清晰。

同樣,分層的設計也得考慮到這些,例如我們將一個APP分為展示層業務層數據層持久層這四層,也應當保持單向依賴。這樣可以最大限度的避免復雜的耦合,減少組件化時的困難。

二、如何進行分層

這里以我們公司的項目舉例,目前我們公司重構的項目結構大概如下所示:

這里的分層是根據代碼的依賴關系分層的,基礎庫應當做到互相獨立,除了依賴于系統框架和一些非常主流的三方框架外,不對其他代碼做任何依賴,每個庫都可以獨立通過單元測試。

對于業務庫的拆分,關鍵點就在于,業務庫雖然包含一定對業務邏輯,但是其中的業務邏輯應當是較大范圍內都通用的業務邏輯,比如三方登陸、分享、支付庫的調用業務。也就是說這一塊的庫應當是可以在同公司多個app中通用的,當然如果你們公司只有一個app,那么可以選擇將這部分于業務組件相結合,但是誰又能保證一個公司永遠只做一個app呢。

業務組件則是對業務模塊的封裝,所謂的組件化顆粒度一般指的就是這一層的封裝顆粒度,理論上顆粒度做到每個頁面是最理想的情況,但實際情況總是千變萬化的,某些頁面的耦合度可能會非常高,拆分的代價太大,得不償失。那么我們完全可以將顆粒度稍微放粗一些,將有緊密業務聯系的頁面組成一個組件,然后暴露使用這個組件的接口即可。

分層的方式有很多,但是做組件化的前提便是將業務部分獨立出來,基礎庫也獨立出來。這兩層不獨立,便無法繼續下去。另外,組件化完成之后,每個組件都可以交由不同的小組分別開發,每個組件也都可以使用不同的設計模式(MVC、MVP、MVVM等),而不會污染其他組件結構。

三、基礎層如何構建

一般來說,常用的網絡請求、數據庫操作、網絡診斷、hotfix等基礎功能都是歸屬于基礎庫,如果有針對于業務特性的定制模塊,應當將其二次封裝擴展作為業務庫?;A庫中一定要避免混入業務邏輯,也就是我之前一直強調的避免雙向依賴。

我們的做法是先將原有與業務功能混合在一起的基礎模塊獨立出來,如網絡庫、中間件、常用語法擴展、數據庫管理等,同時通過對于業務需求相關的地方,提供出protocol供于定制,具體實現可以參考我們的開源代碼:HLNetworking、Lothar。

四、業務組件和業務庫的搭建

(聲明,這段內容很大程度上參考了casatwy大神的這篇博文《在現有工程中實施基于CTMediator的組件化方案》,非常感謝!)

與基礎層類似,為了便于管理,業務組件和業務庫同樣使用CocoaPods做依賴管理。

CocoaPods自身支持git和svn,但是私有源好像是不支持svn的。因此最好還是先弄一個私有git環境,在國內使用codingoschina這種托管網站,或者自己在公司內網搭建一個gitlab、gogs這樣的服務。環境搭建好之后根據以下步驟建立私有源倉庫,這里我以github上的這個組織作為例子:

  1. 首先創建一個空倉庫,我們就起名為PodSpec。

  2. 然后將該倉庫添加到本地pod repo中:pod repo add myspec https://github.com/ModularizationDemo/PodSpec.git,其中myspec為你區分不同的podspec源的名字,而https://github.com/ModularizationDemo/PodSpec.git則是對應的repo地址。

  3. 創建一個文件夾并起個名字,這里我們就起名為ModularizationDemo,然后從git@github.com:ModularizationDemo/config.gitclone一份配置文件到ModularizationDemo文件夾內,并將舊項目復制一份到ModularizationDemo文件夾內、重命名為OldProject,如圖所示(這里的項目我以dsxNiubility的SXNews作為demo):

    創建項目文件夾.png

到此為止,準備工作已經完成,你應該已經有了對應的基礎庫,以及準備好的舊項目和config,我們在下一篇將以SXNews為例,詳細說明如何實施組件化。

參考文章

念紀-模塊化與解耦

limboy-蘑菇街組件化之路

limboy-蘑菇街組件化之路-續

Casa Taloyum-iOS應用架構談-組件化方案

Skyline75489-淺析iOS應用組件化設計

philon-iOS組件化思路-大神博客研讀和思考

philon-iOS組件化實踐方案-LDBusMediator練就

bang-iOS組件化方案探索

攜程移動端架構演進與優化之路

iOS-組件化架構漫談

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容