蘑菇街經過MGJRouter
實現中間層,經過MGJRouter進行組件間的消息轉發,從名字上來講更像是路由器。實現方式大體是,在提供服務的組件中提早註冊block,而後在調用方組件中經過URL調用block,下面是調用方式。html
單例對象
,在其內部維護着一個「URL -> block」
格式的註冊表,經過這個註冊表來保存服務方註冊的block,以及使調用方能夠經過URL映射出block,並經過MGJRouter對服務方發起調用。2.1.1 、MGJRouter調用,代碼模擬對詳情頁的註冊、調用,在調用過程當中傳遞id參數。下面是註冊的示例代碼。git
[MGJRouter registerURLPattern:@"mgj://detail?id=id" toHandler:^(NSDictionary *routerParameters) {
// 下面能夠在拿到參數後,爲其餘組件提供對應的服務
NSString uid = routerParameters[@"id"];
}];
複製代碼
2.1.二、經過openURL:方法傳入的URL參數,對詳情頁已經註冊的block方法發起調用。調用方式相似於GET請求,URL地址後面拼接參數。github
[MGJRouter openURL:@"mgj://detail?id=404"];
複製代碼
2.1.三、也能夠經過字典方式傳參,MGJRouter提供了帶有字典參數的方法,這樣就能夠傳遞非字符串以外的其餘類型參數。web
[MGJRouter openURL:@"mgj://detail?" withParam:@{@"id" : @"404"}];
複製代碼
// A 模塊
- (void)getSomeDataFromB {
B.getSomeData();
}
// B 模塊
- (void)getSomeData {
return self.data;
}
複製代碼
// 接口
@protocol BService <NSObject>
- (void)getSomeData;
@end
// A 模塊, 只依賴接口
- (void)getSomeDataFromB {
id b = findService(@protocol(BService));
b.getSomeData;
}
// B 模塊,實現BService接口
@interface B : NSObject <BService>
- (void)getSomeData {
return self.data;
}
@end
複製代碼
這樣就能夠實現了即知足了模塊之間調用,也實現瞭解耦。網絡
優勢:架構
BeeHive框架框架
優點:擴展組件的生命週期,大廠開源 注意:BeeHive採用GPL開源協議,如有修改,不容許私有化,必須開源分享。模塊化
總體架構casatwy組件化方案分爲兩種調用方式,遠程調用和本地調用,對於兩個不一樣的調用方式分別對應兩個接口。函數
遠程調用經過AppDelegate代理方法傳遞到當前應用後,調用遠程接口並在內部作一些處理,處理完成後會在遠程接口內部調用本地接口,以實現本地調用爲遠程調用服務。工具
本地調用由performTarget:action:params:方法負責,但調用方通常不直接調用performTarget:方法。CTMediator會對外提供明確參數和方法名的方法,在方法內部調用performTarget:方法和參數的轉換。
不要讓穩定的模塊依賴不穩定的模塊, 減小依賴,穩定性 還有一個特色就是會傳遞,好比 B 模塊依賴了 A 模塊,若是 B 模塊很穩定,可是 A 模塊不穩定,那麼B模塊也會變的不穩定了。
提高模塊的複用度,自完備性有時候要優於代碼複用;什麼是自完備性,就是儘量的依賴少的模塊來達到代碼可複用;我有個模塊 Utils 裏面放了大量的category工具方法等,在平常UI產品開發中,依賴這個Utils會很方便,可是我如今要寫一個比較基礎的模塊,應該就要求複用度更高一些,這個時候須要用到Utils裏面的幾個方法,那這個時候還適合直接依賴Utils嗎,固然不合適了,這與咱們上面的設計原則相悖了啊,所以咱們這時候爲了這個模塊的自完備性,就能夠從新實現下這幾個方法,而不是依賴Utils模塊。
每一個模塊只作好一件事情,不要讓Common出現,按照你架構的層數從上到下依賴,不要出現下層模塊依賴上層模塊的現象,業務模塊之間也儘可能不要耦合。
爲何要解耦吧,模塊化並非說你把工程的代碼拆分紅 50 個 pod 或者framework就算完事了,要實現模塊之間真正的解耦纔算真正的模塊化,不然若是模塊之間還都是互相調用代碼,循環依賴,那麼和本來放文件夾裏面沒啥兩樣。那麼什麼是模塊間的解耦呢?模塊解耦的目標就是, 在基於模塊設計原則上, 讓模塊之間沒有循環依賴, 讓業務模塊之間解除依賴。
基礎模塊下沉,這塊其實仍是講的模塊設計,一個工程的架構可能會分爲不少層,然而在開發的過程當中,很容易有人不注意讓應該處於較底層的模塊依賴了上層的模塊,這種狀況下應該對模塊的設計進行改造實現單向依賴。
包括組件中間件,網絡請求,第三方SDK管理封裝,WebView(封裝js,且以服務形式提供),自定義鍵盤,UI基礎組件,分類。而後在項目裏用pod進行管理。其中,針對三方庫,最好再封裝一層,使咱們的項目不直接依賴三方庫,方便後續開發過程當中的更換。
拆分粒度能夠先粗後細,將相對獨立的組件拆分出來。在開發過程當中,對一些獨立的模塊,如:登陸模塊、帳戶模塊等等,也能夠封裝成組件,由於這些組件是項目強依賴的,調用的頻次比較多。另外,在拆分組件化的過程當中,拆分的粒度要合適,儘可能作到組件的獨立性。同時,組件化是一個漸進的過程,不可能把一個完整的工程一會兒所有組件化,要分步進行,經過不停的迭代,來最終實現項目的組件化。
在前兩步都完成的狀況下,咱們能夠根據組件被調用的需求來抽象出組件對外的最小化接口。
組件化方案選型到此結束,但實際實施起來估計又會遇到各類蛋疼的事,尤爲是一些舊項目,一堆一堆無註釋的舊代碼舊邏輯,看起來沒用,但又不敢貿然刪除,每刪除一段代碼就須要把像粑粑同樣的代碼邏輯捋一遍,箇中滋味不便於人細說!
若是您以爲有所幫助,請在GitHub上賞個Star ⭐️,您的鼓勵是我前進的動力
http://limboy.me/tech/2016/03/10/mgj-components.html
http://limboy.me/tech/2016/03/10/mgj-components.html
http://www.open-open.com/lib/view/open1487318191631.html
http://blog.cnbang.net/tech/3080/
http://limboy.me/tech/2016/03/10/mgj-components.html