上面写了8篇组件化的笔记,实际上是4种方案,每种方案是单组件&多组件的记录。
这一篇不拓展,仅仅是整合这4种方案,对比各个方案的利弊。
上文档:
=========================== Protocol方案 ===========================
构成形式:组件管理中心+协议中心
优点:
1 参数类型清晰明了,调用时能知道提供的服务。
2 注册表为字符串,不会造成较大的内存常驻。
3 多个组件时,无需新建文件,在协议中心添加协议即可。
4 如果提供的服务发生改动,只需要修改服务方的操作即可,对调用方影响较小。
5 数据的返回处理较便利。
6 如需添加新服务,只要分别在协议中心和接口VC改动。
7 所有组件功能集中在协议中心里,便于管理。
8 服务方不存在时,便于统一处理。
9 调用时,有代码提示。
缺点:
1 需要在load中进行注册,假设组件中有100个暴露的接口VC,则需要在这100个VC中注册,太多会对Main线程有影响。
2 组件与组件管理中心以及协议中心均存在耦合。
3 协议方法如发生改动(比如修改一个参数类型),则需要在对应的组件中修改,还会影响调用者。
4 协议中心维护成本较高。
5 调用时稍繁琐。
6 理解稍困难。
=========================== Router方案 ===========================
构成形式:路由中心
优点:
1 使用简单,便于理解。
2 组件只与路由中心产生耦合,依赖较少。
3 如果提供的服务发生改动,只需要修改服务方提供的Block即可,对调用方影响较小。
4 多组件时,无需新建文件,仅需添加注册信息。
5 如需添加新服务,只要在接口VC添加Block,并注册即可。
6 Router的维护成本较低。
7 处理无服务时,可统一处理。
缺点:
1 参数不明确
2 需要在load中进行注册,假设组件中有100个暴露的接口VC,则需要在这100个VC中注册,太多会对Main线程有影响。
3 注册时会产生一定的内存常驻,注册的越多,内存常驻越大。
4 使用URL硬编码,不便于维护。
5 数据的返回需要额外构建Block。
6 所有组件的功能都是注册在路由中心,不便于做模块业务区分。
7 调用服务时无相应的代码提示,所有服务均为open。
=========================== LDBus方案 ===========================
构成形式:调解器+协议
优点:
1 新增服务时,只需要在接口VC和协议中做处理。
2 调整服务时,对调用方影响较小,只需要在接口VC中做调整。
3 组件功能集中,一个组件在一个协议中处理,与其它服务无交叉。
4 调用较简单,理解较易。
5 服务管理较简单,单个组件的服务在对应的协议中。
6 便于统一管理无服务的状态。
缺点:
1 协议中的注册列表采取硬编码
2 协议耦合组件,需要暴露组件VC的头文件。
3 多组件时,需要构建新的文件。
4 参数不明确
5 数据的返回需要额外构建Block
6 要在load时注册,假设有100个组件,则需要注册100次,太多会对Main线程有影响。
7 注册时,会持有实例对象,多组件会产生较大的内存常驻。
8 多组件时会有多个协议,协议维护成本相对较高。
9 服务方不存在时,不便于统一处理。
10 调用服务时,无代码提示,均为open...。
11 因多组件多协议,导致维护成本较高。
=========================== CTMediator方案 ===========================
构成形式:调解器+调解器类目+组件业务文件
优点:
1 调解器不需要进行维护。
2 参数清晰明确。
3 无需在load时注册,对Main线程无影响。
4 无需持有对象,不产生内存常驻。
5 使用Runtime,组件与调解器 解耦合。
6 改动服务时,仅需要在组件业务文件中做调整,对其他文件无影响。
7 数据返回较便利。
8 服务调整时,对调用方影响较小。
9 单个组件功能比较集中。
10 服务方不存在时,可以统一处理。
11 调用服务较简单。
缺点:
1 较难理解
2 多组件时,要新建文件,且对文件名和文件中的方法有严格要求。
3 服务与模块相关联,相对较分散。
4 调解器类目在调用组件业务文件时,无代码提示,Runtime。
5 空壳项目整合组件后,他人接手时,比较费时,除非有非常详细的开发文档。
不知道有没有觉得云里雾里的,没有一个整体的宏图?
我就上一个直观的图,费了我好大的劲啊:
屏幕快照 2016-07-05 11.16.59.png解释一下,这里面所有的✅符号表示该方案在这一个方面是比较好的,❌表示该方案在这一个方面是不太有优势的。
拿维护成本来说,✅表示成本较低,❌表示成本较高。
Main线程,✅表示不影响Main线程,❌表示在load方法中进行注册,多了会影响Main线程。
加油~
网友评论