在直播間開發中,隨着業務愈來愈複雜,以往MVC,或mvvm式的架構不太能知足業務和技術的要求。舉例來講,若是產品想進行ABTest,對某些用戶整個下掉坐席功能,有什麼樣的方法能夠作到既不影響現有功能又能比較優雅的方式呢。咱們在多變複雜的現實環境中,和將來不肯定的因素下,又有什麼樣的架構方案能夠比較完美的解決這些問題,就是今天探討的組件化/變形金剛式開發。objective-c
咱們先定義一下本文用到的術語概念吧,以避免產生沒必要要的理解障礙或誤解。api
插件/組件化是指,一個組件以一種便捷的方式在容器中添加
,移除
,查找
,配置
bash
對應的api有 addcomponent,removecomponent,getcomponent架構
組件Component,一個UI或功能的比較完整的模塊。如公屏組件,顯示用戶發言,或進場的信息的模塊。app
容器Container,是多個組件的集合,用於完成特定產品上的特定功能,如直播間模塊,直播間的組件有公屏組件,座位席組件,營收送禮組件,活動條組件。mvvm
st=>start: 列表
e=>end: 關閉
op=>operation: 進入直播間
cond=>condition: 點了關閉?
st->op->cond
cond(yes)->e
cond(no)->op
複製代碼
好比在直播間模塊中,直播間有進入,觀看,退出直播間的事件,用戶鑑權有登陸踢出,這些事件均可以完整的通知到各個組件。ide
以觀看端爲例上下滑動就須要支持的多個直播間並存的場景,每一個直播間有相同的組件功能。函數
統一配置信息組件化
組件須要用到一下共同的數據,或配置共同的數據,如uid,roomId,roomNameui
因爲涉及到保密性,這裏不貼代碼,用純文字或僞代碼的形式講述大體過程。
I
開頭通常表示protocol,裏面的實現@protocol 組件管理
-(void)添加組件;
-(void)移除組件;
-(id)根據名字找到組件;
-(void)移除全部的組件;
@end
複製代碼
@protocol 組件的代理
-(instancetype)初始化組件;
-(void)開始添加組件;
-(void)準備移除組件;
-(void)房間號變化;
-(void)用戶被踢出;
-(void)用戶信息變動;
@end
複製代碼
@protocol 組件信息
-(id)appid
-(id)房間號
-(id)用戶id
-(id)房間信息
-(api)組件的api
@end
複製代碼
如公屏的
@protocol 公屏的protocol
-(bool)發送公屏
@end
複製代碼
另外有營收,坐席等其餘組件相似。
1.根據protocol找到實例
有一個大前提是須要根據protocol找到對應的實例。
介紹一個比較簡單的方法,根據protocol的名字和直播間id把當前實例保存到數據中心,下次須要取得實例的時候就直接取得該實例。GetComponentByProtocol(protocol)
隱藏實現類細節。僅僅公開出protocol
有個技巧是使用c函數去建立實例和完成組裝如 RegisterPublicScreenComponent()
直播間配置相關的東西最好在初始化的時候,默認加載。注意初始化以前不要使用模塊的方法,這個能夠在設計上考慮怎麼避免
有了以前的基礎,假設咱們已經有了直播,公屏,坐席,送禮這些模塊,如今須要把他們組裝起來了。
因而有了如下的代碼
[ATH_MIDWARE(ILivingRoom) createLivingRoom]
RegisterVideoComponent()
RegisterPublicScreenComponent()
RegisterSeatMembersCompnent()
RegisterSendGiftComponent()
複製代碼
須要把一個模塊去掉,註釋掉那個Register便可
若是咱們把RegisterVideoComponent
註釋,就變成了文字直播間了,也一樣支持送禮等功能。
推行組件化實際上是一個很痛苦的事情,面臨着解耦和執行兩個大問題。
解耦是須要分離出職責,找到組件核心的功能,實現而且對外聲明必要的api
執行,前提須要理解整個組件化的核心思想,其中的溝通必不可少。如何定位和防止/提示問題也是考驗架構師的能力。