iOS组件化-前言

337 阅读4分钟

为什么要组件化

随着业务的发展,IT项目的体积变得越来越大,参与开发人员也会增多。开发过程中也会容易出现很多问题,像

  1. 项目体积过大造成编译速度变慢,影响开发效率。

  2. 不同业务模块的代码互相引用。当一个模块有业务需求需要修改时候,修改过程中可能导致另外一个业务模块的功能出错

  3. 没有清晰的项目结构,可能会重复开发同一个基础功能。

  4. 单元测试麻烦,每次要验证一个功能,都要重新编译,运行app。

对于这些问题,其实都是会影响个人和团队的开发效率的。要解决这些问题,项目的组件化很重要。其实组件化这个词,我个人觉得称为模块化更合适。因为其中主要的思想是把工程根据业务划为一个一个可以独立编译的模块,然后再用壳工程把模块组装起来,模块间的调用通过模块提供对外访问的接口。但是无论是模块化还是组件化,都只是一个称呼,所以这个文章主要是以组件化这个比较主流的叫法为主。

什么是组件化

在讨论组件化之前,先顺便说一下组件化和MVC,MVP,MVVM,VIPER,和app分层架构的概念。

其实像MVC,MVP,MVVM,VIPER这些经常看到的词汇,探讨的是UI和数据间的交互,UI和UI所要展示出来的数据是通过怎样的一种形式组织起来的。

而app的分层架构,如三层架构(UI层,服务层,数据层),四层结构(UI层,服务层,网络调用层,数据层),探讨的是业务与业务之间的调用,通过服务层去调用实际的业务类,减少类与类之间的耦合。

对于组件化,其实就是根据业务对项目进行拆分成一个可独立编译的工程,然后再通过某种方式进行模块间的调用。

对于此,我觉得组件化有两个基本要求

  1. 拆分出来的各个模块间可以独立编译,当一个模块在修改时候,不会导致另外一个模块的编译报错

  2. 模块间可以相互调用

组件化的问题和实现

从上面可知,组件化其实就是项目的拆分和组合。因此,组件化有两大问题要解决

  1. 项目怎么拆分多个模块

  2. 模块间怎么相互调用

对于项目拆分,需要考虑到以下的问题

  1. 通过怎样的形式拆分项目,拆分的粒度该怎么区分

  2. 拆分出来的项目怎么进行版本管理

  3. 拆分的时候资源文件怎么存储和读取

4.拆分的时候怎么进行单元测试

对于粒度怎么拆分,还要根据项目情况去做判断,但是对于2,3,4这些问题可以使用CocoaPods去解决,同样对于不想公开的组件,可以用CocoaPods组件私有化,这里放到另外一片文章分析iOS组件化(一)-利用CocoaPods拆分项目和私有化

对于模块间的调用,需要考虑到以下问题

1 模块间怎么调用

2 组件化以后对app的动态化是否有帮助

3 由于模块和模块间没有直接的业务类调用,怎么确保模块间的调用时正确的。

4 模块化间怎么进行回调(像商品模块和购物车模块,商品模块中调用购物车模块的加入购物车功能,将结果回调给商品页面,进而进行商品页面的信息更新)

其实现在有网络上有一些比较成熟的框架可以去实现模块间的调用,如阿里参考了后台开发Spring框架Service而开发的BeeHive,蘑菇街基于URL的路由MGJRouter,还有基于target-action的CTMediator。

对于选择哪个方案,得具体问题具体分析,得看每个公司的项目情况。对于我而言,我更倾向于蘑菇街的

对于蘑菇街的这个基于url路由的方案

优点如下1 使用起来简单方便,而且源码只有三百多行,都是一些基础的API。对于团队的学习成本低,当不满足需求时候,可以很容易的实现扩展,对于MGJRouter的源码分析,放到另外一篇文章

  1. 基于URL的方式,具有一定的动态性。当线上app出现如闪退这些严重的bug的时候,可以通过后台下发跳转规则,进行服务降级,跳到指定的页面。

  2. 有容错机制

缺点如下

  1. 基于URL的方式,需要维护大量的URL.

  2. 对于错误,无法通过编译的方式

  3. 对于复杂的对象传输不方便