组件化概述
随着项目Swift化、跨平台混合开发、业务越来越复杂等的因素,不管是老项目重构还是新项目开发,都需要引入组件化架构开发思维。
组件化开发方案在业务类型多、开发团队大、多APP多功能有交叉、多语言混编的项目所体现出来的优势尤为明显。
组件化开发带来的好处:
1、业务划分更清晰,接受容易,可按组件分配开发任务;
2、开发测试过程中,可以只编译某组件部分代码,不需要编译整个项目代码;
3、组件二进制化可加快项目编译速度;
4、排查问题容易,某个组件出现问题,直接对组件进行处理;
5、集成方便,像搭积木一样组装,项目维护性强。
组件化的思想其实就是解决模块业务之间的强依赖,引入一个中间层(中间人)进行解耦,让中间层进行统一调度。
(强依赖:模块A调用模块B的服务,需要在A模块中import B)
每个组件使用pod远程私有库以独立工程的形式存在。
自顶向下设计,自低向上实现
难点:解决组件之间的交互通信;基于不同业务进行的项目架构组件划分;需要处理的细节多。
组件间的通信是有成本的,尽量将业务封装在组件内部,对外统一提供简单的接口,即“高内聚,低耦合”原则。
混编模块化划分不应该从业务拆分,而是从底层抽离,例如 Extension、工具类等
组件间的通讯
一个组件内部需要调用另外一个组件中的服务,或者打开另外一个组件中的控制器并传值
宿主工程充当中间件
组件统一披露API:
需要提供哪些服务给外界;
外界需要给我提供哪些服务(让外界以block的形式,或者通知的形式传递数据到组件内部,内部做相应处理)
示例小demo
引入中间件 & 中间件设计方案参考
1、MGJRouter方案
在组件内部任何地方调用/注册服务,可以不统一接口服务;
每个业务组件都需要依赖这个框架;
硬解码,url-block维护成本较高;
不过蘑菇街也提供了Protocol方案做补充,将所有涉及到硬编码的都放在组件的PublicHeader.h中。
详细参考MGJRouter
示例小demo
2、Target-Action方案
每个组件提供一个统一披露的接口文件;
中间件维护分类(每个组件对应一个分类,硬解码写在分类内部,通过运行时进行物理解耦);
组件和框架之间无依赖关系。
详细参考Casa Taloyum的iOS应用架构谈 组件化方案
CTMediator
示例小demo
3、Swift/OC混编的协议-服务类方案
创建一个PublicModule,存放各个组件的协议Lotus,每个协议内定义了各自组件所提供的服务
在各个组件中,实现PublicModule中对应的协议类,称为Lotusoot,Lotusoot中具体实现了服务的逻辑
所有组件都要依赖PublicModule,通过PublicModule下的Lotusoot即可调用其它模块的服务
由于Swift中没有+(void)load方法,需要在didFinishLaunchingWithOptions方法中加入注册路由这一步。
详细参考Lotusoot
Lotusoot解说
示例小demo
组件化最终达到的效果
1、组件独立:独立编写、独立编译、独立运行、独立测试
2、资源的重用:功能代码的重复使用
3、高效的迭代:增删模块
4、可配合二进制化,最大化的提高项目编译速度