BeeHive-阿里开源iOS模块解耦框架源码解析

网友zhanglPeng在我一篇博客评论区邀请我写一篇BeeHive原理解析,我答应了他,刚好周末有一点点时间,于是抽空看了下BeeHive源码写下这篇文章。如有见解不到之处敬请提出指正。

BeeHive

BeeHive是一款阿里开源应用于iOS工程模块化编程框架。吸收了Spring框架 Service的理念来实现模块间的API耦合,原理即是向Mediator注册Protocol和相应的Impl.

大家来找茬

BeeHive是阿里开源。。里开源。。开源。。源。。

代码我没细看,稍微看了下实现原理,但是竟然发现两处明显命名错误

第一处

tigger?难道不是trigger吗。为了防止自己被打脸,我用了几款主流翻译软件(除沪江小D)得出结果跳跳虎,沪江小D翻译的结果有一种解释是触发器,但触发器是名词不是动词呀。

第二处

这行代码作用是让开发者设置是否允许BeeHive抛出异常,仔细看Expection(期望)。。。正确的应该是exception

暂时只发现2处,欢迎大家有兴趣下载源码来找茬。

框架结构

– BHContext

APP上下文对象,记录APP的API环境等信息。为了方便让其他开发者扩展配置,BHContext持有了一个BHConfig,开发者可以利用BHConfig提供的API 配置自定义扩展信息,如下图

那么问题来了,BHContext持有了一个BHConfig对象,但是BHConfig类中提供的均是类方法,我仔细瞄了好几眼,一个实例方法都没有,那BHContext持有的BHConfig对象有什么用,+(instancetype) shareInstance;接口又有什么用,不理解。

另通过这种方式扩展配置信息会导致一定量的HardCode,带来维护和使用上的不便。实际效果远不如BHConfig中挂一个property看的直观,而且可能一些公司的应用环境超过了BHEnvironmentType枚举中列出的环境,也不好拓展。

还有上面代码中的函数 -(返回值)和函数名中间有些有空格有些没空格。作为一个以公司名义开源的框架好歹CodeReview下吧。。。

– BHModuleManager

模块管理器。启动时需要被BHModuleManager管理的Module都会被注册,且缓存了所有被注册Module的实例对象.

注册方式:
##一.动态注册

需要被动态注册的Module,在该Module的实现文件.m中,复制宏BeeHiveMod(ShopModule),(具体原理我只了解了七七八八就不做过多解释了,想了解的同学可以去查询资料..)

BHModuleManager- (void)registedAnnotationModules方法内,由BHAnnotation调用内部的static NSArray* BHReadConfiguration(char *section)方法获取到内存中以宏定义中特殊命名的数据,转换成ModuleClassName,再通过runtime构建相应的Module实例对象进行缓存.

##二.加载local pilst

把需要注册的Module配置在相应的plist文件中,也可以配置Module的level,启动时加载plist文件,读取存储了ModuleClassName的list,通过runtime的反射构建需要注册的Module实例对象进而缓存

##三.主动注册

在需要注册的Module+ (void)load方法中调用[BeeHive registerDynamicModule:[self class]];主动注册

以上注册方式任意选择一种,我建议在项目中统一用一种注册方式.

BHModuleManager中缓存了所有被注册Module的一份实例,但是他不对外提供获取Module的接口,所以我认为凡是遵守BHModuleProtocol协议的Module做的事情仅限于处理系统事件和一些应用事件。他并非我们理解的普通的业务Module

Module不能在外部alloc 出来,因为你即使创建一个新的Module实例出来,你并不在BHModuleManager的管理下,是无法接收BHModuleManager分发的系统事件,创建出来没有意义。

– BHServiceManager

BHModuleManager一样提供了3种注册方式,不过只能用其中一种方式注册,如果同时用2种方式注册会抛出异常。
BHServiceManager对外提供了根据protocol获取到相应的Impl实例(原理和我第一篇组件化总结-protocol注册方案一样),这是BeeHive最核心的功能。

– BHServiceProtocol

没什么可讲的,就2个接口

– BHModuleProtocol

定义的Module生命周期回调接口,以及系统事件接口。BHServiceManager会在接收到系统事件后,分发给所有在他内部管理的并且实现BHModuleProtocol相应接口的Module

– BeeHive

对外的入口模块,采用了外观设计模式,BHServiceManagerBHModuleManager2个类没有对外暴露,由BeeHive对外提供相应的接口,BeeHive内部调用BHServiceManagerBHModuleManager相应的接口.

Beehive里面的代码规范包括一些匪夷所思的接口定义,总让我感觉不像是大厂开源的作品,不过有一些设计思路还是很值得学习借鉴。希望Beehive会越来越好!

1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部