iOS应用模块化的思考及落地方案(一)模块的划分及模块化工做流程

1.0 什么是模块化

不少关于重构设计模式的介绍中,常常提到的几个词语是复用解耦git

模块化之因此被提出,也更可能是为了解决这几个问题。github

复用能够减小重复造轮子的状况,很容易理解的是,咱们常用的github上的第三方框架,好比,AFNetworking等,有了这些组件,咱们就不须要再写一遍了。swift

解耦能够减小类或文件之间的关联,若是一个类引用了其余10个类,那么当咱们看到这个类或修改这个类的时候,咱们同时须要关注另外10个类,了解它们与本类的关联状况。若是你的类,没有与其余任何类关联,你在阅读代码的时候,彻底能够忘记其余代码的存在,只看这一个文件就够了。设计模式

咱们能够看出,低耦合的系统,可以将无数简单的模块,组成复杂的工程。复用很明显可以提高工做效率,解放生产力。api

这样一来,你的系统是简单的,清晰的,当你重构或修改系统的时候,能够没必要有任何顾虑。网络

而实现低耦合可复用的手段,每每就称为模块化。框架

在实际开发中,模块每每被定义为可以独立实现单一任务的代码单元。异步

从代码角度讲,一个功能,一个文件,一个类,甚至一个函数,均可以成为一个模块。模块化

除了上述优势以外,模块化以后,每一个模块能够单独开发,单独测试,也更容易作内部代码的权限管理。函数

上面已经说过,整个系统都是由不一样的模块构成。那么问题的难点就在于,如何定义模块的边界。

2.0 模块的划分及通讯

在客户端实际开发中,根据模块的使用方式,能够大体分为2种。

第一种,提供很是基础功能,会频繁地被其余模块引用,其余模块能够直接引入这些模块的api进行调用。好比:网络模块,经常使用工具类,布局,图片,其余依赖的第三方框架。

第二种,提供有价值的产品功能,更多的是页面的展现接口,它历来不被别的模块直接引用,更多地经过异步的方式来进行通讯(使用路由)。好比:会员模块,付费模块,短视频模块等等。

另外,除了这两种模块以外,还有一种模块既会被其余模块频繁地引用,也会提供页面的展现接口。好比:登录,收藏,关注等功能。这种模块须要为其余模块提供数据及修改接口,有时候还须要展现UI。

其实对于第三种模块来讲,能够根据数据和展现,拆分为2个模块:一个模块用于对外部提供数据,能够被其余模块直接引用;另外一个模块用于经过异步的方式进行页面的展现。

3.0 iOS模块化的实践方案

3.1 模块化工做流程

iOS中的模块化,不一样的模块是经过动态库/静态库的方式引入到主工程中的。

动态库和静态库的区别无需多说,可根据须要自行选择。

cocoapods是一个很是优秀的模块管理工具。

咱们使用cocoapods来管理不一样的模块时,代码能够以3种存在形式出现,分别是:源码,静态库,动态库。

因此在模块化以前,咱们须要提早进行的工做有:

  • 安装cocoapods
  • 创建pod私有库,用来存储咱们全部模块的podspec文件

咱们建立一个新模块工做流应该是这样的:

  • 创建一个新工程,修改必要设置
  • 创建Podfile文件,添加依赖,而后执行pod install安装依赖
  • 开始开发工做,开发过程当中,你可能须要创建一个Demo工程或者Demo target用于在开发过程当中,测试你的静态库api
  • 编写单元测试
  • 测试经过后,你须要将代码提交到git中,而且打一个tag
  • 编写podspec文件
  • 检查podspec文件的正确性
  • 使用pod repo push命令将podspec文件推到pod私有库中
  • 若是其余模块想要引用这个模块,按照pod标准使用方式安装依赖便可

3.2 可能遇到的问题

在上述流程中,可能遇到的问题有:

  1. podspec文件怎么写?
  2. podspec文件提交和更新须要怎么作?
  3. Podfile文件怎么写?
  4. 若是我开发的模块依赖了咱们以前开发的其余的模块该怎么处理?若是我依赖的模块也须要修改,应该怎样处理?
  5. 产生循环依赖怎么办?A依赖B,B又依赖A。
  6. 怎样处理图片等资源文件
  7. 如何进行OC与swift的混编
  8. framework如何编译,如何减肥,如何合并

4.0 流程自动化

咱们能够看到,建立模块化的过程流程比较多,涉及的技术也不少:cocoapods,Xcode设置,资源管理,Swift&OC编译管理,静态库接入方式等等。

其中不少技术内容其实并不经常使用,在开发过程当中,咱们遇到问题后,即时查阅文档解决,过了一段时间,遇到一样的问题可能还须要再查阅。

并且,不一样的人在实践过程当中,可能会遇到相同的问题,每一个人都须要解决一次。

流程过多,还容易由于误操做而产生错误,这种问题很难解决,每每遇到就会花费大量时间处理。

咱们再回头看一下工做流程,其实不少工做都是固定不变的,每次建立新模块都是重复一样的过程,所以这部分流程咱们能够经过自动化脚本自动完成。

咱们哪些工做可使用脚本完成呢?

  1. 建立模块工程Demo工程,自动设置里面的Build Setting选项,并使用.xcworkspace来管理
  2. 部份内容根据用户输入,自动建立podspec文件,并检查其正确性
  3. 根据用户输入的依赖模块,自动建立不一样工程的Podfile文件,并使用pod install安装依赖
  4. 管理模块目录结构,脚本可以方便的对模块进行增删改查
  5. 若是某个模块依赖的是咱们本身开发的其余模块,那么被依赖的模块会以local path的方式引入到工程中,这样咱们能够在当前模块的工程中直接修改依赖模块的代码并进行测试,不须要打开多个工程。开发完成后,分别进行提交。
  6. 自动安装脚本所依赖的软件和环境
  7. 记录已经push到私有库的模块,方便处理多依赖模块的开发
  8. 开发完成后,使用脚本一键推送到pod库中
  9. 对已经在pod库中的模块进行二次开发时,能够一键拉取工程并安装全部依赖

完成上面的功能后,咱们能够发现:

  1. 对于全新的模块,咱们可使用脚本,一键建立工程,而后就能够进行业务开发了,开发以后,只须要再执行一个脚本,就可以推送到私有库中,不须要了解cocoapods和Xcode设置的任何细节。
  2. 对于二次开发的模块,咱们一样适用脚本,一键拉取工程及全部依赖,仅仅关注业务开发便可。开发完成后,一样使用脚本一键推送到私有库中。

--完--

  1. iOS应用模块化的思考及落地方案(一)模块的划分及模块化工做流程
  2. iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用
相关文章
相关标签/搜索