iOS組件化/模塊化的方案總結(jié)

一泽论、為什么要組件化

1.實(shí)現(xiàn)之間解耦漓库、減少項(xiàng)目的編譯時(shí)間廷支,提升業(yè)務(wù)開發(fā)效率。

通常一個(gè)工程中會(huì)有多個(gè)模塊,而模塊之間會(huì)有依賴關(guān)系城侧,比如A調(diào)用B阅仔,那么在A模塊中就會(huì)引用B模塊的頭文件甚脉,同時(shí)可能B模塊又會(huì)依賴C模塊猾瘸,C模塊又會(huì)依賴A模塊等等,最終的結(jié)果是各模塊高度耦合古话,特別是大型的工程雏吭,耦合特別嚴(yán)重。如下圖所示

模塊耦合
如果想避免耦合煞额,那么我們需要設(shè)計(jì)一種結(jié)構(gòu)避免思恐,各模塊之間耦合,可以如下圖所示結(jié)構(gòu):
理想的模塊關(guān)系
這種結(jié)構(gòu)有什么好處呢膊毁?
1)首先是將模塊拆分成組件單獨(dú)管理胀莹,拆分成單獨(dú)的庫(kù),這樣各組件在進(jìn)行開發(fā)的時(shí)候婚温,只需要編譯自己的庫(kù)文件描焰,大大減少文件的編譯時(shí)間,我們的工程栅螟,之前編譯需要20分鐘左右荆秦,現(xiàn)在只需幾分鐘,這個(gè)對(duì)效率提高力图,非常明顯步绸。
2)各個(gè)庫(kù)單端管理,可以進(jìn)行權(quán)限設(shè)置吃媒,只有各組件相關(guān)人員才可以修改組件代碼瓤介,不會(huì)出現(xiàn)一個(gè)大的工程中,A修改了B的代碼的情況赘那,可以一定程度上保證代碼的安全性刑桑。

2.合并項(xiàng)目容易出現(xiàn)沖突。

在每次發(fā)版以后募舟,release分支會(huì)向dev分支合并代碼祠斧,由于各組件會(huì)提交許多代碼,不同的開發(fā)者可能會(huì)同時(shí)修改同一個(gè)文件拱礁,引起沖突琢锋,這樣一個(gè)工程中就會(huì)出現(xiàn)多處的合并沖突辕漂,比如一個(gè)幾十人的團(tuán)隊(duì),這個(gè)沖突的概率非常大吩蔑,需要各組件的人去dev分支修改自己組件的沖突钮热,如果沖突沒有解決,整個(gè)工程都無法運(yùn)行烛芬,影響整個(gè)團(tuán)隊(duì)的開發(fā),非常影響效率飒责。

3.模塊拆分成組件赘娄,方便對(duì)外付能

假設(shè)一個(gè)項(xiàng)目中有多個(gè)組件,相互耦合宏蛉,這個(gè)時(shí)候想單獨(dú)將一個(gè)組件拆分出來遣臼,提供給它人使用,幾乎是不可能的拾并,而組件化接觸這種耦合之后揍堰,我們可以直接將某個(gè)組件單獨(dú)提供給它人使用,各個(gè)組件可以像積木一樣嗅义,相互組合起來屏歹,形成一個(gè)新的APP對(duì)外付能。

二之碗、組件化方案

組件化方案蝙眶,主要分為兩個(gè)部分,一是代碼如何解耦褪那,二是如何進(jìn)行版本管理幽纷,下面分別進(jìn)行詳細(xì)講解。

1.代碼解耦

1)組件原則
組件通常分為兩種類型的組件:基礎(chǔ)組件博敬,業(yè)務(wù)組件友浸。
*業(yè)務(wù)組件依賴基礎(chǔ)組件
*基礎(chǔ)組件不可依賴業(yè)務(wù)組件。
*業(yè)務(wù)組件間不可相互依賴偏窝。

2)組件間的通信方式:
組件間通信方式收恢,業(yè)內(nèi)主要有兩種實(shí)現(xiàn)方式:
1.協(xié)議式框架,比如蘑菇街的這種方案囚枪。蘑菇街 App 的組件化之路
2. 中間者架構(gòu)派诬,比如casatwy的方案。casatwy關(guān)于蘑菇街組件化的討論

我們來總結(jié)一下目前的方案
蘑菇街方案-基于URL和協(xié)議
1)通過URL傳遞簡(jiǎn)單參數(shù)(組件間簡(jiǎn)單參數(shù)調(diào)用)
2)通過協(xié)議調(diào)用傳遞復(fù)雜參數(shù)(組件間復(fù)雜參數(shù)調(diào)用)
缺點(diǎn):
1)頁(yè)面間調(diào)用不需要URL形式链沼,對(duì)于復(fù)雜參數(shù)默赂,組件間調(diào)用通過URL無法滿足需求。
2)注冊(cè)URL時(shí)充分不必要條件括勺,完全可以用runtime來解決這個(gè)問題缆八。
3)使用多種方案曲掰,不利于管理和維護(hù)。
4)protocol主要存在的問題就是分散調(diào)用導(dǎo)致耦合奈辰。
5)需要組件向ModuleManager注冊(cè)Url(因?yàn)閁RL調(diào)用時(shí)通過注冊(cè)時(shí)的callBack來實(shí)現(xiàn)的栏妖,不是基于runtime,所以需要注冊(cè))奖恰,會(huì)導(dǎo)致浪費(fèi)內(nèi)存吊趾。

casatwy的方案-基于Category和Target-Action
主要是基于Mediator模式和Target-Action模式,中間采用了runtime來完成調(diào)用瑟啃。通過mediator的Category來輸出組件的對(duì)外調(diào)用方法论泛。使用同一種方案,實(shí)現(xiàn)組件間調(diào)用蛹屿。
優(yōu)點(diǎn):
1)不需要注冊(cè)URL
2)使用同一種方案屁奏,基于Target-Action模式實(shí)現(xiàn)組件間的調(diào)用。
3)區(qū)分app內(nèi)部調(diào)用和外部調(diào)用错负。
4)同一種方法可以實(shí)現(xiàn)簡(jiǎn)單參數(shù)和復(fù)雜參數(shù)的調(diào)用坟瓢。

我們的方案-基于URL和Target-Action
利用runtime實(shí)現(xiàn)Target-Action模式設(shè)計(jì),通過定義URL協(xié)議確定Target和Action犹撒,通過params來傳遞所有頁(yè)面間調(diào)用的參數(shù)折联,error返回調(diào)用的錯(cuò)誤信息,completion來實(shí)現(xiàn)調(diào)用后的回調(diào)油航。類似以下形式
組件調(diào)用方式:[XXMediator openURL:@"mediator://Target/Action" arg:params error:error completion:callBack]
組件輸出調(diào)用方法:每個(gè)組件有一個(gè)XXModule的類崭庸,在該類中實(shí)現(xiàn)對(duì)外輸出的方法,提供XXMediator中Target和Action谊囚。類的頭文件中包含組件可以調(diào)用的類以及需要傳遞的參數(shù)怕享。

優(yōu)點(diǎn):
1)一種調(diào)用方式,可以實(shí)現(xiàn)簡(jiǎn)單和復(fù)雜參數(shù)調(diào)用镰踏。
2)不需要注冊(cè)函筋,調(diào)用簡(jiǎn)單
3)所有調(diào)用使用同一個(gè)方法實(shí)現(xiàn),只需要引用Mediator奠伪,不需要引用Mediator 的category跌帐。
4)通過URL實(shí)現(xiàn)Target-Action,可以利用URL規(guī)則解析出Target和Action绊率,實(shí)現(xiàn)調(diào)用谨敛。

2.版本管理

版本管理使用 cocoapods,每個(gè)組件都拆成獨(dú)立的pod庫(kù)滤否,并生成一個(gè)配置表脸狸,來進(jìn)行組件間的依賴組件的版本管理,具體內(nèi)容這里就不敘述了。

三炊甲、組件化遇到問題

1.使用Target-Action方式進(jìn)行調(diào)用泥彤,有個(gè)問題就是runtime的時(shí)候,如果對(duì)應(yīng)Target-Action修改了卿啡,怎么提示調(diào)用方
1)靜態(tài)檢測(cè)URL吟吝,判斷Target-Action是否存在。
2)動(dòng)態(tài)調(diào)用router颈娜,debug模式下剑逃,Target-Action不存在就crash。

2.調(diào)用方如何知道接收方需要哪些key的參數(shù)官辽?調(diào)用方如何知道有哪些target可以被調(diào)用炕贵?
1)category方式下,可以直接通過category中的方法來進(jìn)行確認(rèn)野崇。
2)我們的方案中,每個(gè)組件的對(duì)應(yīng)moudle類中亩钟,類的頭文件中包含組件可以調(diào)用的類以及需要傳遞的參數(shù)乓梨。

3.調(diào)用參數(shù)解析處理在那里比較好?
各組件內(nèi)部清酥,因?yàn)檫@些參數(shù)的使用扶镀,各組件開發(fā)者自己最清楚。如果在category解析焰轻,Mediator中會(huì)參雜業(yè)務(wù)邏輯臭觉。

4.A調(diào)用B時(shí),如果B要回傳參數(shù)給辱志,怎么做蝠筑?
通過callBackBlock回調(diào)回傳,參數(shù)是id類型揩懒,可以傳任意對(duì)象什乙,比如是一個(gè)UIViewController或者一個(gè)NSDictionary都可以。

四.組件化的缺點(diǎn):

1.會(huì)增加開發(fā)者的學(xué)習(xí)成本
2.組件拆分顆粒度把握不好已球,會(huì)產(chǎn)生很多中間代碼和冗余臣镣。
3.圖片資源管理不好,會(huì)產(chǎn)生很多冗余圖片智亮。
4.組件化過程中忆某,會(huì)帶來一些組件之間的調(diào)試問題,前期會(huì)影響團(tuán)隊(duì)效率阔蛉。

總結(jié):

組件化是一把雙刃劍弃舒,如果在工程規(guī)模較小的時(shí)候,進(jìn)行組件化馍忽,可能反而會(huì)影響團(tuán)隊(duì)開發(fā)效率棒坏,帶來一些問題燕差,比如上面提到的缺點(diǎn),只是在工程和團(tuán)隊(duì)達(dá)到一定規(guī)模的時(shí)候坝冕,進(jìn)行組件化才會(huì)有更大的收益徒探。

參考資料:
蘑菇街 App 的組件化之路
iOS應(yīng)用架構(gòu)談 組件化方案
蘑菇街 App 的組件化之路·續(xù)
iOS 組件化方案探索
iOS組件化方案 - MrPeak雜貨鋪
京東iOS客戶端組件管理實(shí)踐 - InfoQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喂窟,隨后出現(xiàn)的幾起案子测暗,更是在濱河造成了極大的恐慌,老刑警劉巖磨澡,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碗啄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稳摄,警方通過查閱死者的電腦和手機(jī)稚字,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厦酬,“玉大人胆描,你說我怎么就攤上這事≌淘模” “怎么了昌讲?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)减噪。 經(jīng)常有香客問我短绸,道長(zhǎng),這世上最難降的妖魔是什么筹裕? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任醋闭,我火速辦了婚禮,結(jié)果婚禮上饶碘,老公的妹妹穿的比我還像新娘目尖。我一直安慰自己,他們只是感情好扎运,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布瑟曲。 她就那樣靜靜地躺著,像睡著了一般豪治。 火紅的嫁衣襯著肌膚如雪洞拨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天负拟,我揣著相機(jī)與錄音烦衣,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛花吟,可吹牛的內(nèi)容都是我干的秸歧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衅澈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼键菱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起今布,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤经备,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后部默,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侵蒙,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年傅蹂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纷闺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡份蝴,死狀恐怖急但,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搞乏,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布戒努,位于F島的核電站请敦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏储玫。R本人自食惡果不足惜侍筛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撒穷。 院中可真熱鬧匣椰,春花似錦、人聲如沸端礼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛤奥。三九已至佳镜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凡桥,已是汗流浹背蟀伸。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啊掏。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓蠢络,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親迟蜜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刹孔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355