This post was updated 2223 days ago and some of the ideas may be out of date.

一、前言:

公司业务代码耦合性严重,需要进行组件化拆分,但是业务需求在不断的涌来。一方面业务开发不能停,另一方面老代码还是要拆分。产品经理提出业务任务,程序员提出组件化拆分任务,为了避免这场大战,如何可以兼顾两者呢?
图1:

二、思考过程:

2.1 模式一

建立组件,然后在新组件里面重写呗?
这种方式如果是新业务可以,但是面对老业务,可能最初的开发人员已经离职,可能代码都没有注释,会有很大的风险。重写代码,时间会特别长,原本开发一年的APP,怎么可能快速重写?测试怎么可能快速测试完?岂不是又要花费一年?不仅开发周期长,并行的业务需求怎么办?显然这个并不适用于业务与拆分并行开发的情景下。

2.2 模式二

建立组件,然后一个一个文件往组件里面移动。
这种方式,我们会发现,移动一个文件,然后就会有好多报错引用,把引用的文件移动进来之后,移动进来的又有其他的引用。文件间的相互引用问题会让我们无法将程序编译起来。并且模块内容不完整,看不到尽头。

2.3 模式三

建立组件,然后把这个模块的文件夹移动到组件工程中去。减法拆分。
把主工程代码也都移动到组件工程中去。程序可以独立编译起来,然后我们一个一个删除主工程的其他代码。删除一个我们编译一个。这样减法拆分我们可以保证每次程序可以运行起来,但是还是会面临无法和业务需求一起开发的情景。

2.4 模式四

不建立组件,我们只在主工程中建立新文件夹,按模块拆分。
此时让业务并行的开发人员在另一个独立文件夹中开发业务,不影响拆分文件夹。
这个模式指的是我们还是在主工程下拆分,只是我们将这个模块的文件都移动到新文件夹下,然后保证新文件夹下的文件都是独立的,不引用其他模块头文件。但是很多controller里面可能有几十个头文件引用,我们如果去挨个去检查这个文件的位置,我想这个速度真的是让人无法接受。拆分人员非要疯掉了。

三、我认为的拆分模式

我认为拆分最重要的一步就是把组件独立出去成一个cocoapod包。组件独立出去,才能逐步优化自己组件内的代码。就好比国家建立了,才能逐步发展自己的经济政治。而建立国家的第一步是建立政权,也就是一个模块的文件夹,待时机成熟,再将建立国家,也就是模块的独立。

3.1 建立文件夹

假设我们要对业务My进行组件化拆分,我们在主工程中建立业务My的文件夹,然后将涉及到业务My的代码文件都移动到这个文件夹中去。
例如我们现在的My组件中有以下文件:
图2:

3.2 利用工具进行引用的筛选并处理

这里思想要是引用了上面的模式四,但是如果让我去一个一个文件去找,那我可接受不了,于是iOS组件化拆分工具Nestling应运而生(APPStore传送门->点我跳转)
图3:

我们选中My模块,右键“show in Finder”,将这个文件夹拖入 Nestling 标题栏,Nestling 可以快速检索出该目录以及子目录中的所有h和m文件。如图有12个待处理的文件。
图4:

假设My的上一层文件夹里面的所有内容也属于My这个组件的,我们可以在“要查询的文件夹路径”输入My的父文件夹。这里我们就直接选择My文件夹吧。

另外我们在“输入要忽略的头文件名称”的输入框中输入要排除的头文件名称,当然也可以不排除,例如这里我填写“AppPreferences.h”,在实际开发过程中这里推荐填写公有第三方库的头文件以及公司自己的基础库头文件。
点击“检测”。
如图,我们从My的文件夹里的所有h和m文件中查询出了9个import头文件,这9个头文件并不在My文件夹里。接下来我们只需要“一键导出import文件列表”,然后去想办法处理这些头文件就可以了。
图5:

如图这就是我们剪贴板导出的需要处理的文件,并列出的头文件的具体位置。
图6:

我们可以不断处理检测,重复以上步骤,最后将整个引用依赖全部处理掉,大大节省了编译的时间以及搜寻文件所在位置的时间。最重要的是我们还可以给上级反馈拆分进度,因为还剩多少个未处理的文件,一清二楚。

3.3 组件独立

我们最后的结果是,筛选工具筛出的文件为空。这就证明我们把引用都解决了。也快要到给测试交付的时间了,此时将业务同学的那个文件夹移动进来,按照相同步骤简单检测处理下就可以了。然后将组件独立就可以了。如果不知道如何建立私有库可以参考我的上篇文章《CocoaPods私有库创建与使用》

四、补充:

人数多的团队协作开发,往往伴随着很多意外。有的小伙伴独立组件按照他们自己的模式来,但是他们自己组件里面其实和主工程重复了很多文件。主工程引用之后,运行不起来了。只能编译一次解决一次。这里同样是看不到头,不知道解决到何年何月。于是这里我在Nestling上加上了另一个功能“文件查重”。
假设我们要对比A文件夹和B文件夹之间有没有文件重复。
图6:

我们将两个文件夹分别拖拽至左右两个头部。
点击“检测”按钮。
图7:

点击“一键导出”到剪贴板,我们粘贴到文稿中可以看到如下:
图8:

我们可以看到A文件夹中的位置拼接B文件夹中的位置,我们对此文件进行处理就可以了。

五、总结:

在业务与拆分并行开发在实际中很常见,以上的拆分方式我认为是风险最小,最可控的方式。在任何节点拆分随时可以停止,不会因为拆分影响到业务开发以及上线。只要组件独立了,以后的事情就是在组件里面优化就可以了。
如果你有更好的方案欢迎留言讨论。