蘑菇街的方案: 蘑菇街組件化的技術方案
對應的demo
上面的反駁 Casa提出了不同意見,下半部分是下面蘑菇街修改的回應
對應的demo
蘑菇街的修改 自己方案做了進一步優(yōu)化
大佬Bang的總結1 梳理總結
大佬mrpeak的總結2 iOS組件化方案
阿里的方案(有參考casa)casa對此的評價是?:用更臃腫的體量做了同樣的事情
以下是看完上面文章的總結
- iOS組件化的方式:
1. catagory(Casa稱之為target - action方式)
方式為:
【模塊編寫對應的中間層catagory - 中間層 - 模塊調(diào)用catagory的方法】
catagory有兩種方式:
- runtime,通過字符串映射獲取類,用NSMethodSignature傳遞多個參數(shù)
- 由模塊創(chuàng)立者管理,該引入的類引入,寫法跟常規(guī)的類調(diào)用一樣,以model代替dictionary作為參數(shù)傳遞
catagory可以引伸出的protocol方式:
【模塊編寫對應的catagory 和protocol - 中間層 - 模塊引入protocol,調(diào)用catagory的方法】
這樣@import module后使用protocol才能敲出protocol的方法,邏輯分工更加清晰
2. url
通過【模塊注冊url的操作block -中間層以url為key緩存block- 模塊調(diào)用url調(diào)用block】
url只有一種方式:
字符串做key,dictionary做參數(shù),無法傳遞復雜參數(shù)
url可以引出protocol:
【模塊注冊protocol -中間層以protocol 為key緩存實現(xiàn)了協(xié)議方法的Class- 模塊通過中間層獲取Class調(diào)用協(xié)議方法】
其實就基本等價于catagory的protocol方式
區(qū)別:
catagory的protocol是應用在中間層的,需要一行代碼用來創(chuàng)建帶protocol的中間層對象指針,一行代碼調(diào)用協(xié)議方法(也能以[(id<Protocol>)center method]的形式一行代碼完成),但由于XCode天生殘疾,OC里面Class<Protocol>是敲不出protocol里的類方法的(能編譯,但沒有提示),也就不能把中間層做成只有類方法的形式
url的protocol是應用在模塊內(nèi)部對應的類,需要一行獲取類的代碼,一行創(chuàng)建實現(xiàn)協(xié)議的對象的代碼(也可以中間層直接返回創(chuàng)建好的對象),一行調(diào)用協(xié)議方法的代碼,寫多了還挺煩人的
進一步的總結
- 不安全性:
以dictionary做參數(shù)能帶來最大化的解藕,但會導致模塊修改后運行時的錯誤無法被編譯時檢測,相比耦合性,穩(wěn)定性更重要,所以參數(shù)傳model會比dictionary更好
以url的形式也會帶來模塊修改后的運行時潛在錯誤,改成注冊protocol能減少安全性問題
3 以url的形式很容易被外部入侵,尤其是接入APPDelegate.openURL后,需要額外的安全處理(比如內(nèi)部調(diào)用的時候加key做判斷,過濾掉一些外部調(diào)用)
-
書寫方便:
使用純catagory不需要手動做指針變換,不需要獲取實現(xiàn)協(xié)議的類,不需要做其他額外的操作
-
動態(tài)性:
使用url的方式可以動態(tài)下發(fā)注冊,蘑菇街以此實現(xiàn)當線上模塊出現(xiàn)致命bug時可以動態(tài)切換到h5頁面
綜上,高安全性,書寫方便的做法:
- 建立一個中間層空類,每個模塊都需要引入這個類
- 使用類方法來處理通信減少書寫
- 使用純catagory,每個模塊內(nèi)部維護一份或多份中間層的catagory,該引用類就引用,怎么普通怎么寫,沒必要在模塊內(nèi)部用runtime,該暴露的model就暴露出來給其他模塊,建立一個總結多分catagory的頭文件,pod編寫時把catagory和總結頭文件暴露出來就行
- 使用的時候@import對應的模塊,直接敲出中間層的方法(但這樣就不適合OC++的項目了......只能單獨import總結頭文件)
- 必要時連push/present都可以在模塊內(nèi)部實現(xiàn),然后需要時用block返回結果model
純catagory接入動態(tài)性方案
當服務器下發(fā)到替換文件時(記得加密),在中間層主類中使用runtime把對應的catagory替換成打開網(wǎng)頁,具體參考Aspects jrswizzle RSSwizzle等Method Swizzling的第三方