阿里BeeHive源碼小讀

本文是一篇個(gè)人學(xué)習(xí)筆記壶谒,記錄以供后續(xù)學(xué)習(xí)參考水泉。

一爸业、項(xiàng)目思路

引用Github中 原文: BeeHive是用于iOS的App模塊化編程的框架實(shí)現(xiàn)方案,吸收了Spring框架Service的理念來(lái)實(shí)現(xiàn)模塊間的API耦合恐疲。

二腊满、項(xiàng)目概述

整個(gè)項(xiàng)目代碼簡(jiǎn)單,結(jié)構(gòu)清晰培己,優(yōu)缺點(diǎn)共存碳蛋,個(gè)人不太傾向于目前使用,但是一些思路和做法應(yīng)該學(xué)習(xí)漱凝。相比其他廠出品的模塊化方案疮蹦,BeeHive有些稍顯隨意。有另一個(gè)名字更適合:“內(nèi)部模塊解耦框架”茸炒。

項(xiàng)目通過(guò)兩個(gè)集合用以維護(hù)模塊化信息愕乎,Module集合和Service集合。Module集合中維護(hù)每個(gè)模塊中Module的class壁公,Service集合維護(hù)Service(Protocol)和實(shí)現(xiàn)Impl(ViewController)感论。每個(gè)模塊包含Protocol,Module紊册,Impl比肄,Service三層結(jié)構(gòu),Service可替換Protocol不能算一層獨(dú)立結(jié)構(gòu)囊陡。

Protocol定義Service提供的行為芳绩,對(duì)模塊外暴露出來(lái),使用者依賴相關(guān)Protocol文件進(jìn)行調(diào)用撞反。模塊內(nèi)部可能包含多個(gè)Service妥色,行為集中到一個(gè)或者多個(gè)Protocol中,實(shí)現(xiàn)使用一個(gè)或多個(gè)ViewController遏片。
但是模塊內(nèi)部只有一個(gè)Module對(duì)象(NSObject)嘹害,用于接收App生命周期和Module生命周期的回調(diào)。同時(shí)吮便,通過(guò)Module的處理笔呀,可以選擇通過(guò)動(dòng)態(tài)(Dynamic)方式或注解(Annotation)方式在App啟動(dòng)時(shí)或指定時(shí)刻進(jìn)行注冊(cè)。而整體App和Module的生命周期回調(diào)髓需,通過(guò)AppDelegate繼承许师,在BHAppDelegate中處理。

缺點(diǎn):

  • 項(xiàng)目的思路感覺(jué)有些冗余。
    每個(gè)Module要提供四類文件:Protocol枯跑,Module惨驶,Impl(ViewController),Service(介于Protocol和Impl之間)敛助。如果Module本身采用非MVC模式下,單個(gè)模塊文件分層更多屋确,不利于理解和管理纳击。
  • 代碼內(nèi)部數(shù)據(jù)結(jié)構(gòu)有待優(yōu)化
    比如BHServiceManager內(nèi)部維護(hù)了一個(gè)數(shù)組,數(shù)組中的對(duì)象是key為Service攻臀,value為Impl的字典焕数。與其這樣,為什么不直接使用NSMutableDictionary刨啸,key使用Service堡赔,實(shí)現(xiàn)為Impl呢牢酵?檢索的時(shí)候減少了手動(dòng)循環(huán)過(guò)程沮稚。
  • 解耦
    README中也提到敦第,主旨為Service和Impl解耦但是無(wú)法避免對(duì)Protocol的解耦荤牍。

優(yōu)點(diǎn):

  • 宏定義實(shí)現(xiàn)動(dòng)態(tài)配置
    __attribute((used,section("segmentname,sectionname")))
    通過(guò)宏定義预伺,把變量統(tǒng)一存儲(chǔ)到特殊內(nèi)存塊中進(jìn)行一次性讀取比較方便礼预。但是目前沒(méi)啥業(yè)務(wù)場(chǎng)景把还。
  • 生命周期回調(diào)
    可以做成Protocol實(shí)現(xiàn)生命周期回調(diào)定義校焦。
  • Lock
    對(duì)于集合類非線程安全宫蛆,進(jìn)行加鎖處理艘包,使用NSRecursiveLock。

三耀盗、項(xiàng)目結(jié)構(gòu)

BeeHive:

項(xiàng)目對(duì)外主入口想虎。通過(guò)+registerDynamicModule:動(dòng)態(tài)增加Service,-registerService:(Protocol*) service:(Class)創(chuàng)建Service(Protocol)和Impl(.h+.m)的關(guān)聯(lián)叛拷。通過(guò)-createService:創(chuàng)建或獲取Service舌厨。

BHServiceManager:

提供了注冊(cè)Service和創(chuàng)建(獲取)Service的方法胡诗。
一個(gè)Service代表一個(gè)模塊邓线,Service分為:本地plist中定義的LocalService,通過(guò)在.m中宏BeeHiveMod(ShopModule)處理的注解AnnotationService煌恢,和在程序運(yùn)行中主動(dòng)注冊(cè)的Service骇陈。
內(nèi)部維護(hù)了一個(gè)數(shù)組,數(shù)組中的對(duì)象是key為Service瑰抵,value為Impl的字典你雌。與其這樣,為什么不直接使用NSMutableDictionary,key使用Service婿崭,實(shí)現(xiàn)為Impl呢拨拓?

BHModuleManager:

提供加載本地Module,注解AnnotationModule和動(dòng)態(tài)DynamicModule的能力氓栈。同時(shí)是提供生命周期回調(diào)的主體渣磷。
內(nèi)部維護(hù)了兩個(gè)數(shù)組分別存儲(chǔ)Module和動(dòng)態(tài)Module及其相應(yīng)的Level。

BHModuleProtocol:

模塊接口定義授瘦,可以設(shè)置level醋界,提供了app和module生命周期進(jìn)行的回調(diào)方法。
如果是DynamicModule提完,整個(gè)Module驅(qū)動(dòng)點(diǎn)應(yīng)該是XXXModule文件形纺,通過(guò)宏定義BeeHiveMod被加載,或者在+load方法中注冊(cè)成為動(dòng)態(tài)DynamicModule徒欣。

BHServiceProtocol:

所有Service Protocol定義必須實(shí)現(xiàn)的底層接口逐样。只提供-singleton:方法用于處理是否使用單例模型。
在使用框架時(shí)打肝,每個(gè)Module中都要有一個(gè)XXXProtocol脂新,內(nèi)部定義用到的實(shí)例變量和調(diào)用方法。
這樣做有非常明顯的弊端:Module間并未完全解耦闯睹,需要依賴ModuleProtocol文件戏羽;XXXProtocol中定義的變量要到Impl中@synthesize一下。

BHContext:

上下文對(duì)象楼吃,提供靜態(tài)環(huán)境變量初始化和維護(hù)始花,相當(dāng)于配置中心。

BHConfig:

內(nèi)部使用可變字典維護(hù)動(dòng)態(tài)環(huán)境變量孩锡,作為BHContext的補(bǔ)充存在酷宵。

BHAppDelegate:

作為真正的AppDelegate,使用者的XXXAppDelegate需要繼承躬窜,同時(shí)自定義-appication:didFinishLaunchingWithOptions:即可浇垦,其他的系統(tǒng)回調(diào)交給BHAppDelegate處理。

BHAnnotation:

提供通過(guò)注解方式荣挨,使用BeeHiveModel和BeeHiveService注冊(cè)Module和Service男韧。具體做法是,在Module的.m文件中默垄,添加宏定義BeeHiveMod(ShopModule)此虑,在編譯期間替換成
char * kShopModuleName_mod = @“ShopModule”,并使用__attribute((used,section("segmentname,sectionname")))把所有包含這段宏轉(zhuǎn)換后的代碼變量口锭,放到一塊特殊的內(nèi)存空間中以BeehiveMods命名朦前。同理處理BeehiveServices。然后在BHAnnotation.m中使用c函數(shù)直接獲取這部分?jǐn)?shù)據(jù),轉(zhuǎn)換成NSString進(jìn)行存儲(chǔ)韭寸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末春哨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恩伺,更是在濱河造成了極大的恐慌赴背,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莫其,死亡現(xiàn)場(chǎng)離奇詭異癞尚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)乱陡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仪壮,“玉大人憨颠,你說(shuō)我怎么就攤上這事』” “怎么了爽彤?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)缚陷。 經(jīng)常有香客問(wèn)我适篙,道長(zhǎng),這世上最難降的妖魔是什么箫爷? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任嚷节,我火速辦了婚禮,結(jié)果婚禮上虎锚,老公的妹妹穿的比我還像新娘硫痰。我一直安慰自己,他們只是感情好窜护,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布效斑。 她就那樣靜靜地躺著,像睡著了一般柱徙。 火紅的嫁衣襯著肌膚如雪缓屠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天护侮,我揣著相機(jī)與錄音敌完,去河邊找鬼。 笑死概行,一個(gè)胖子當(dāng)著我的面吹牛蠢挡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼业踏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼禽炬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起勤家,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腹尖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伐脖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體热幔,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年讼庇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绎巨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蠕啄,死狀恐怖场勤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歼跟,我是刑警寧澤和媳,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站哈街,受9級(jí)特大地震影響留瞳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骚秦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一她倘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骤竹,春花似錦帝牡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懒震。三九已至罩息,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間个扰,已是汗流浹背瓷炮。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留递宅,地道東北人娘香。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓苍狰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親烘绽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淋昭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容