1.0 什么是模塊化
很多關(guān)于重構(gòu)
及設(shè)計模式
的介紹中非凌,經(jīng)常提到的幾個詞語是復(fù)用
及解耦
。
模塊化之所以被提出,也更多是為了解決這幾個問題梅鹦。
復(fù)用
可以減少重復(fù)造輪子的情況,很容易理解的是冗锁,我們經(jīng)常使用的github上的第三方框架齐唆,比如,AFNetworking等冻河,有了這些組件箍邮,我們就不需要再寫一遍了茉帅。
解耦
可以減少類或文件之間的關(guān)聯(lián),如果一個類引用了其他10個類锭弊,那么當(dāng)我們看到這個類或修改這個類的時候堪澎,我們同時需要關(guān)注另外10個類,了解它們與本類的關(guān)聯(lián)情況味滞。如果你的類樱蛤,沒有與其他任何類關(guān)聯(lián),你在閱讀代碼的時候剑鞍,完全可以忘記其他代碼的存在昨凡,只看這一個文件就夠了。
我們可以看出蚁署,低耦合
的系統(tǒng)便脊,能夠?qū)o數(shù)簡單的模塊,組成復(fù)雜的工程光戈。復(fù)用
很明顯能夠提升工作效率就轧,解放生產(chǎn)力。
這樣一來田度,你的系統(tǒng)是簡單的,清晰的解愤,當(dāng)你重構(gòu)或修改系統(tǒng)的時候镇饺,可以不必有任何顧慮。
而實(shí)現(xiàn)低耦合
和可復(fù)用
的手段送讲,往往就稱為模塊化奸笤。
在實(shí)際開發(fā)中,模塊往往被定義為能夠獨(dú)立實(shí)現(xiàn)單一任務(wù)的代碼單元哼鬓。
從代碼角度講监右,一個功能,一個文件异希,一個類健盒,甚至一個函數(shù),都可以成為一個模塊称簿。
除了上述優(yōu)點(diǎn)之外扣癣,模塊化之后,每個模塊可以單獨(dú)開發(fā)憨降,單獨(dú)測試父虑,也更容易做內(nèi)部代碼的權(quán)限管理。
上面已經(jīng)說過授药,整個系統(tǒng)都是由不同的模塊構(gòu)成士嚎。那么問題的難點(diǎn)就在于呜魄,如何定義模塊的邊界。
2.0 模塊的劃分及通信
在客戶端實(shí)際開發(fā)中莱衩,根據(jù)模塊的使用方式爵嗅,可以大致分為2種。
第一種膳殷,提供非巢俾猓基礎(chǔ)功能,會頻繁地被其他模塊引用赚窃,其他模塊可以直接引入這些模塊的api進(jìn)行調(diào)用册招。比如:網(wǎng)絡(luò)模塊,常用工具類勒极,布局是掰,圖片,其他依賴的第三方框架辱匿。
第二種键痛,提供有價值的產(chǎn)品功能,更多的是頁面的展示接口匾七,它從來不被別的模塊直接引用絮短,更多地通過異步的方式來進(jìn)行通信(使用路由)。比如:會員模塊昨忆,付費(fèi)模塊丁频,短視頻模塊等等。
另外邑贴,除了這兩種模塊之外席里,還有一種模塊既會被其他模塊頻繁地引用,也會提供頁面的展示接口拢驾。比如:登陸奖磁,收藏,關(guān)注等功能繁疤。這種模塊需要為其他模塊提供數(shù)據(jù)及修改接口咖为,有時候還需要展示UI。
其實(shí)對于第三種模塊來說稠腊,可以根據(jù)數(shù)據(jù)和展示案疲,拆分為2個模塊:一個模塊用于對外部提供數(shù)據(jù),可以被其他模塊直接引用麻养;另一個模塊用于通過異步的方式進(jìn)行頁面的展示褐啡。
3.0 iOS模塊化的實(shí)踐方案
3.1 模塊化工作流程
iOS中的模塊化,不同的模塊是通過動態(tài)庫/靜態(tài)庫的方式引入到主工程中的鳖昌。
動態(tài)庫和靜態(tài)庫的區(qū)別無需多說备畦,可根據(jù)需要自行選擇低飒。
cocoapods是一個非常優(yōu)秀的模塊管理工具。
我們使用cocoapods來管理不同的模塊時懂盐,代碼可以以3種存在形式出現(xiàn)褥赊,分別是:源碼,靜態(tài)庫莉恼,動態(tài)庫拌喉。
所以在模塊化之前,我們需要提前進(jìn)行的工作有:
- 安裝cocoapods
- 建立pod私有庫俐银,用來存儲我們所有模塊的podspec文件
我們創(chuàng)建一個新模塊工作流應(yīng)該是這樣的:
- 建立一個新工程尿背,修改必要設(shè)置
- 建立Podfile文件,添加依賴捶惜,然后執(zhí)行pod install安裝依賴
- 開始開發(fā)工作田藐,開發(fā)過程中,你可能需要建立一個Demo工程或者Demo target用于在開發(fā)過程中吱七,測試你的靜態(tài)庫api
- 編寫單元測試
- 測試通過后汽久,你需要將代碼提交到git中,并且打一個tag
- 編寫podspec文件
- 檢查podspec文件的正確性
- 使用pod repo push命令將podspec文件推到pod私有庫中
- 如果其他模塊想要引用這個模塊踊餐,按照pod標(biāo)準(zhǔn)使用方式安裝依賴即可
3.2 可能遇到的問題
在上述流程中景醇,可能遇到的問題有:
- podspec文件怎么寫?
- podspec文件提交和更新需要怎么做吝岭?
- Podfile文件怎么寫三痰?
- 如果我開發(fā)的模塊依賴了我們之前開發(fā)的其他的模塊該怎么處理?如果我依賴的模塊也需要修改苍碟,應(yīng)該怎樣處理?
- 產(chǎn)生循環(huán)依賴怎么辦撮执?A依賴B微峰,B又依賴A。
- 怎樣處理圖片等資源文件
- 如何進(jìn)行OC與swift的混編
- framework如何編譯抒钱,如何減肥蜓肆,如何合并
4.0 流程自動化
我們可以看到,創(chuàng)建模塊化的過程流程比較多谋币,涉及的技術(shù)也很多:cocoapods仗扬,Xcode設(shè)置,資源管理蕾额,Swift&OC編譯管理早芭,靜態(tài)庫接入方式等等。
其中很多技術(shù)內(nèi)容其實(shí)并不常用诅蝶,在開發(fā)過程中退个,我們遇到問題后募壕,即時查閱文檔解決,過了一段時間语盈,遇到同樣的問題可能還需要再查閱舱馅。
而且,不同的人在實(shí)踐過程中刀荒,可能會遇到相同的問題代嗤,每個人都需要解決一次。
流程過多缠借,還容易因?yàn)檎`操作而產(chǎn)生錯誤干毅,這種問題很難解決,往往遇到就會花費(fèi)大量時間處理烈炭。
我們再回頭看一下工作流程溶锭,其實(shí)很多工作都是固定不變的,每次創(chuàng)建新模塊都是重復(fù)同樣的過程符隙,因此這部分流程我們可以通過自動化腳本自動完成趴捅。
我們哪些工作可以使用腳本完成呢?
- 創(chuàng)建
模塊工程
及Demo
工程霹疫,自動設(shè)置里面的Build Setting
選項(xiàng)拱绑,并使用.xcworkspace來管理 - 部分內(nèi)容根據(jù)用戶輸入,自動創(chuàng)建
podspec
文件丽蝎,并檢查其正確性 - 根據(jù)用戶輸入的依賴模塊猎拨,自動創(chuàng)建不同工程的
Podfile
文件,并使用pod install
安裝依賴 - 管理模塊目錄結(jié)構(gòu)屠阻,腳本能夠方便的對模塊進(jìn)行增刪改查
- 如果某個模塊依賴的是我們自己開發(fā)的其他模塊红省,那么被依賴的模塊會以
local path
的方式引入到工程中,這樣我們可以在當(dāng)前模塊的工程中直接修改依賴模塊的代碼并進(jìn)行測試国觉,不需要打開多個工程吧恃。開發(fā)完成后,分別進(jìn)行提交麻诀。 - 自動安裝腳本所依賴的軟件和環(huán)境
- 記錄已經(jīng)push到私有庫的模塊痕寓,方便處理多依賴模塊的開發(fā)
- 開發(fā)完成后,使用腳本一鍵推送到pod庫中
- 對已經(jīng)在pod庫中的模塊進(jìn)行二次開發(fā)時蝇闭,可以一鍵拉取工程并安裝所有依賴
完成上面的功能后呻率,我們可以發(fā)現(xiàn):
- 對于全新的模塊,我們可以使用腳本呻引,一鍵創(chuàng)建工程礼仗,然后就可以進(jìn)行業(yè)務(wù)開發(fā)了,開發(fā)之后,只需要再執(zhí)行一個腳本藐守,就能夠推送到私有庫中挪丢,不需要了解cocoapods和Xcode設(shè)置的任何細(xì)節(jié)。
- 對于二次開發(fā)的模塊卢厂,我們同樣適用腳本乾蓬,一鍵拉取工程及所有依賴,僅僅關(guān)注業(yè)務(wù)開發(fā)即可慎恒。開發(fā)完成后任内,同樣使用腳本一鍵推送到私有庫中。
--完--