简介
本次拆分是今年某次迭代中,对项目内加油模块拆分的记录。如果有类似开发需求的同学,可做参考
场景
由于加油业务迅速扩张,加油模块成了我们项目内使用频率最高的模块。此时项目组考虑把加油模块单独拆分成一个独立APP,方面加油用户直接使用加油功能。
任务
拆分加油模块为一个独立APP,要求维护同一套代码,包实际体积减小
方案选择
预演的时候,一共提出四种方案如下:
直接新建个APP,把代码copy过去。
优点:简单,基本就是搬砖的活。
缺点:但是缺点也很明显,后续要维护两套代码,这是不能接受的;在APP内新增预编译判断(preprocessor macros),AppDelegate入口处判断是是加油模块,进入加油页,不是则走原来逻辑。
优点:这种方式最简单,也是维护同一套代码。
缺点:包体积不变!我虽然只用加油的功能,但还是要下载整个APP,等于用原来的APP,但是只能使用加油功能。所以这种方案页被舍弃组件化拆分加油模块,这种方式除了工作量大点没其他缺点
是组件化基础上改进的,不把模块传到cocoapods,通过本地管理。相对方案3省去了上传cocoapods的工作,也是最终选定的方案
实现
按照方案四
新建了target,在对应target内的Build Phases内导入需要的Compile Source,链接库,资源文件;
在新的Target对应的AppDelegate内配置入口,编译看效果。发现崩溃,是因为耦合了其他非加油模块的业务类;
发现耦合主要来自:公共工具类,登录模块,支付模块,设备选择,设备新增及其他零星业务耦合;公共工具类解耦,把这个类里设计到业务的方法拆分出去成为独立功能。如:自动登录,分享功能,播放器等,一共拆分出去11个具体业务子功能类。期间涉及到一下拆不出去的功能,就通过runtime的反射调用解耦;
再次对工具类整理,通过分类的方式,细分成NSString,UIImage,时间,UI,及其他操作几个分类;
完成这一步,加油模块使用工具类就不会耦合其他业务线;对登录,支付,设备选择和设备新增模块解耦;通过router中间件的方式解耦,传入类名和参数,中间件根据类名获取类NSClassFromString,创建UIVIewController对象,调用对象的初始化参数方法给对象设置参数,然后把对象返回给业务去做跳转
完成上面步骤,运行起来项目,达到了预期结果。同一套代码,一个新的APP,大小为原来的三分之一不到。
期间也踩了很多坑,pod库的问题,环境的问题,第三方库的问题,业务关联的问题
router核心代码
记住需要传参的类一定要实现初始化参数方法initViewControllerParam
总结
不要写很臃肿的工具类,会造成严重的耦合