(一)概念
将一个单一工程的项目,分解成为各个独立的组件,然后按照某种方式,任意组织成一个拥有完整业务逻辑的工具
如果单一工程,业务线比较少,人数比较少,普通的开发模式基本满足需求。但一旦项目发展越来越庞大,业务主线越来越多,开发人员也越来越多,就会出现一系列的问题,比如:项目模块耦合严重、编译速度很慢、测试不独立、无法使用自己擅长的设计模式等等。。。
(二)组件化达到的效果
- 组件独立:独立编写、独立编译、独立运行、独立测试
- 资源重用:功能代码的重复使用
- 高效迭代:增删模块
- 配合二进制化,最大化的提高项目的编译速度
(三)组件化需要考虑的问题
1. 需要把哪些内容划分成一个组件
- 基础组件
- 基本配置:常量、宏定义……
- 分类:各种系统类的扩展
- 网络:对AFNetworking/Alamofire、SDWebImage/Kingfisher的封装……
- 工具:日期时间的处理、文件处理、设备信息获取……
- 功能组件:
- 控件:弹幕、轮播器、选项菜单、图文菜单……
- 功能:断点下载、音频处理……
- 业务组件:
- 根据业务线划分:业务一、业务二……
2. 组件间的依赖关系
基础组件和业务组件为同一级,同一级之间最好不要产生依赖关系
业务组件可以依赖任何基础组件和功能组件
3. 每个组件以什么样的形式存在
- 组件内部:根据设计模式进行文件夹的划分
- 组件形式:每个组件以pod库的形式存在
- 组件测试:单独的测试工程
4. 以什么样的形式集成各个组件
以Cocoapods的形式安装各个组件
5. 组件间的通讯
- 披露中间API
- 通过中间件中转
6. 附加问题
- 如何提高编译速度?
- 如何解决重复的操作流程?
- 库的升级维护问题?
(四)组件化过程中,分离各个组件的难点
1. 如果一个组件里面依赖其他的组件该如何处理
把组件依赖的代码直接copy到组件中
先把组件依赖的代码做成一个pod库,然后让组件依赖pod库
2. 如果组件内部,需要对接某个服务,该如何处理
问题:比如图文菜单控件的封装,肯定需要用到加载网络图片。
处理方式:使用block或delegate让外部实现