一、概念
將一個單一工程的項目,分解成各個獨立的組件;
然后按照某種方式 任意組成一個擁有完整業(yè)務(wù)邏輯的工程
可以理解為下圖所示

E9AE92823AAF075D980F8D66B6981697.png
每個組件都可以單獨抽離出來獨立運行
這就是組件的概念
二、組件化產(chǎn)生的原因
如果你的項目 業(yè)務(wù)模塊比較多 而且同時有很多人開發(fā) 在開發(fā)過程中肯定會出現(xiàn)一些問題 比如
1、代碼耦合度很高
//團(tuán)隊成員 方法相互引用
2、編譯效率低速度慢
//因為工程模塊比較多編譯時每個模塊都會參與
3、測試不獨立
//你寫的代碼測出來問題 有可能不是你的問題 可能是其他開發(fā)人員的問題導(dǎo)致(測試環(huán)境復(fù)雜)
4、無法使用自己擅長的設(shè)計模式
//一個項目多人開發(fā) 如果所有代碼都在一起 肯定會有一個統(tǒng)一的設(shè)計模式 不然項目會很亂
。。。。
反正就是 項目業(yè)務(wù)比較復(fù)雜時 多人開發(fā)會暴露出一系列的問題。
此時 如果每個人都負(fù)責(zé)編寫一個獨立的組件 就不會出現(xiàn)上述問題
三、組件化最終效果
1、組件獨立
獨立編寫 :可以使用自己擅長的方式別寫代碼
獨立編譯 :速度快
獨立運行 :速度快
獨立測試 :定位問題快 省去重復(fù)測試
2、一次封裝永久使用
如果你的其他項目中想要使用這個組件 直接引用即可
四、組件化實戰(zhàn)考慮的問題
1、需要把哪些內(nèi)容封裝成一個組件
一般分為三種 基礎(chǔ)組件、功能組件、業(yè)務(wù)組件
基礎(chǔ)組件
1、基本配置:如常量/變量、宏定義
2、分類:系統(tǒng)各個類的分類
3、網(wǎng)絡(luò):如對AFN的封裝、對SDWebImage的封裝...
4、工具:如 日期處理工具、文件處理工具、設(shè)備信息獲取工具...
...
功能組件
1、控件:如 輪播器、選項菜單、圖文菜單、彈幕...
2、功能:如 斷點續(xù)傳、音頻處理
...
業(yè)務(wù)組件
1、業(yè)務(wù)1
2、業(yè)務(wù)2
3、業(yè)務(wù)3
...
n、業(yè)務(wù)n
三者之間的關(guān)系
先看圖

5894832B47D6ADE4C667E6221F9CD0CE.png
1、最上層肯定是業(yè)務(wù)組件 ,然后基礎(chǔ)組件和功能組件同一級別
2、業(yè)務(wù)組件 可以依賴基礎(chǔ)組件 也可以依賴 功能組件
3、業(yè)務(wù)組件之間最好不要相互依賴
原因是:降低業(yè)務(wù)組件之間的依賴 能夠方便的抽離出 各個組件 來達(dá)到解耦的目的
4、基礎(chǔ)組件和功能組件 最好也不要相互依賴
原因是:降低業(yè)務(wù)組件之間的依賴 能夠方便的抽離出 各個組件 來達(dá)到解耦的目的
假設(shè) 功能組件 有一個小小的功能需要使用 基礎(chǔ)組件 那么他就需要去依賴(引用) 基礎(chǔ)組件
這樣一搞 在編譯的時候就會把基礎(chǔ)組件的所有小的組件給引用到功能組件中
在編譯的時候基礎(chǔ)組件就會全部被編譯
還有就是 功能組件依賴基礎(chǔ)組件 將來再抽離功能組件的時候就無法單獨把功能組件抽離出來
解決這個問題 就是把功能組件里需要的基礎(chǔ)功能 從基礎(chǔ)組件中拷貝一份過來,雖然這樣麻煩了一些 但是能夠達(dá)到解耦的效果。
2、每個組件以什么樣的形式存在
1、組件內(nèi)部根據(jù)個人喜好劃分命名文件夾
2、每個組件都以pod庫的形式存在
3、擁有單獨的測試工程 每個組件可以單獨測試
3、以怎樣的形式集成各個組件
通過cocoapods來安轉(zhuǎn)各個組件
4、組件之間如何通訊
1、披露公開API
2、利用中間件 傳遞
五、組件化過程中的解耦
1、如果一個組件中依賴其他公共功能 該如何處理
1、直接copy代碼,雖然麻煩,但是他的好處就是快,無需產(chǎn)生依賴,
對于一些不重要的方法和工具也可以直接copy到內(nèi)部使用
2、把組件依賴的代碼 封裝成一個pod庫 然后依賴pod庫
2、組件內(nèi)部需要對接某個服務(wù) 該如何處理
如:圖文菜單組件的封裝 內(nèi)部有圖文加載
可以使用一個代理 或則block 把顯示圖片的代碼丟出去 讓外界來做處理