iOS組件化之路

什么是組件化開發(fā)

組件化開發(fā),就是將一個(gè)臃腫,復(fù)雜的單一工程的項(xiàng)目,根據(jù)功能或者業(yè)務(wù)進(jìn)行分解,拆分成為各個(gè)獨(dú)立的功能模塊或者組件 ; 然后根據(jù)項(xiàng)目和業(yè)務(wù)的需求,按照某種方式,任意組織成一個(gè)擁有完整業(yè)務(wù)邏輯的——獨(dú)立工程,這就是所謂的組件化開發(fā)。

組件化開發(fā)的優(yōu)點(diǎn)

在組件化之前,App的代碼都是在一個(gè)工程里開發(fā)的,在人比較少,業(yè)務(wù)發(fā)展不是很快的時(shí)候,這樣是比較合適的,還能一定程度地保證開發(fā)效率。

但是隨著業(yè)務(wù)和開發(fā)人員的增加,慢慢地代碼量多了起來(lái),開發(fā)人員也多了起來(lái),業(yè)務(wù)發(fā)展也快了起來(lái),這時(shí)單一工程開發(fā)模式就會(huì)顯露出一些弊端。

  • 耦合比較嚴(yán)重(因?yàn)闆]有明確的約束,「組件」間引用的現(xiàn)象會(huì)比較多)
  • 容易出現(xiàn)沖突(尤其是使用Xib之類的)
  • 業(yè)務(wù)方的開發(fā)效率不夠高(只關(guān)心自己的組件,卻要編譯整個(gè)項(xiàng)目,與其他不相干的代碼糅合在一起)

為了解決這些問題,就采取了「組件化」策略。
它能帶來(lái)這些好處:

  • 加快編譯速度(不用編譯主工程那一大坨代碼了)
  • 自由選擇開發(fā)姿勢(shì)(MVC / MVVM / FRP,畢竟都是獨(dú)立工程嘛)
  • 方便 QA 有針對(duì)性地測(cè)試(每個(gè)工程甚至還可以建立自己的單元測(cè)試)
  • 提高業(yè)務(wù)開發(fā)效率(編譯速度加快,耦合度降低)
  • 加快業(yè)務(wù)線發(fā)版效率(每個(gè)子工程都有自己的Git倉(cāng)庫(kù)和版本號(hào),可以更方便的進(jìn)行版本管理,多版本的并行開發(fā))

簡(jiǎn)單總結(jié)就是:
1、獨(dú)立編寫,獨(dú)立編譯,獨(dú)立運(yùn)行和獨(dú)立測(cè)試
2、迭代和開發(fā)效率提高

組件化開發(fā)

1、組件化模塊劃分

進(jìn)行組件化拆分的時(shí)候,特別是老項(xiàng)目進(jìn)行組件化重構(gòu)的時(shí)候需要考慮清楚如何進(jìn)行拆分。比較對(duì)于耦合度很高的老項(xiàng)目,解耦并不是一件容易的事情。
而我的思考是這樣子的,大家可以用來(lái)作為參考:

① 基礎(chǔ)組件

網(wǎng)絡(luò)庫(kù)、日志、統(tǒng)計(jì)、路由、存儲(chǔ)等,各自分為一個(gè)獨(dú)立組件

② 功能組件

圖片輪播器、定制化菜單、定制化圖片選擇器、相機(jī)、錄像、二維碼掃描功能、下載功能、定制化城市選擇器、個(gè)性定制的提示框、Toast提示等等,都可以封裝在一個(gè)組件中

③ 業(yè)務(wù)模塊

根據(jù)自己公司的業(yè)務(wù)模塊進(jìn)行劃分,如個(gè)人信息、登錄模塊、投遞模塊、搜索模塊等,盡量業(yè)務(wù)相關(guān)的組合成一個(gè)模塊,這樣方便管理和能夠應(yīng)付業(yè)務(wù)需求的經(jīng)常性改動(dòng)。

④ 通用組件

全局常量、常用宏、常用的分類、還有一些比較常用的小功能類等

2、組件化存在方式

  • 組件形式:每個(gè)組件都是以pod庫(kù)的形式存在
  • 組件內(nèi)部:組件內(nèi)部按照自己喜歡的開發(fā)模式以文件夾的形式進(jìn)行劃分
  • 組件測(cè)試:每個(gè)組件對(duì)單獨(dú)對(duì)應(yīng)一個(gè)demo,用來(lái)完成該組件的功能測(cè)試,這樣測(cè)試機(jī)能被解耦開
  • 組件組合:通過利用CocoaPods的方式添加安裝各個(gè)組件

組件化的具體做法,我在我的這篇文章中有詳細(xì)的介紹,大家可以去看一下:
iOS組件化

殼工程.png

3、組件化的解耦

假如我們都劃分了各個(gè)獨(dú)立模塊,但是也無(wú)法避免,兩個(gè)模塊甚至三個(gè)模塊間需要互相調(diào)用的情況,這個(gè)時(shí)候即便是劃分了模塊,也難免造成過度耦合的情況。

比如一個(gè)模塊A也會(huì)依賴于模塊B,假如同時(shí)模塊B也要依賴A,那么就會(huì)造成相互依賴,這在利用CocoaPods原理提交到遠(yuǎn)程庫(kù)的時(shí)候,檢測(cè)podspec文件時(shí)就會(huì)無(wú)法通過,因?yàn)殡p方都在等待對(duì)方提交,但是又彼此依賴。

所以為了避免這種情況的發(fā)生,通過路由的方式去解耦成為組件化的一個(gè)核心問題。

Router.png

如何利用路由去解耦,我將在下一篇文章中介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容