用Python脚本分析iOS工程跨模块引用

一个结构清晰的工程不仅有利于团队新成员快速熟悉,还有利于功能的稳定迭代。但是随着项目的不断迭代,整体结构往往趋于混乱,这就需要我们在结构上做一些控制,一是制定开发规范限制跨模块引用,二是通过脚本工具不定期检测整个工程引用情况,保障其合理性。

查找资料发现了https://github.com/nst/objc_dep,该工具能分析出所有引用关系并且结合 GraphViz 或 OmniGraffle 图像化输出结果。但该工具无法分析跨模块引用情况,所以我用Python基于字符串匹配编写的一个小工具,可以扫描出指定目录下的跨模块引用,下面介绍一下整体思路。

分析流程

上图列出了完整的分析过程,拆解成以下几个步骤:

根据指定的目录,将该目录下的所有第一级目录作为模块名,用Map的结构构建文件关系,结果类似

从第一步里的每个具体文件中提取出引用列表,结果类似,表示文件1引用了2、3、4,此时还不知道2、3、4是否是跨模块引用

将第二步中提取出的引用文件和第一步中的文件关系进行比较,获取出引用文件的归属模块

构造数据结构存储引用关系

格式化打印出跨模块引用关系

代码实现构建文件关系

这里的思路是将指定路径的第一级目录设置为模块名,并将该模块名下的所有文件组织成文件列表建立键值对关系,最终结构类似

提取文件引用列表

这里是用关键字匹配的方式提取出指定文件的引用列表,到这一步还不知道哪些文件是跨模块引用的

分析跨模块引用

最关键的是这一步,这里采用的是直接遍历的方式来查找跨模块关系,代码较长这里就不贴出了,感兴趣的可以查看Demo工程,最终生成如下格式的数据

格式化打印

这一步就是将前面生成的数据格式化输出以便直观查看引用关系。

用法说明

以下例子基于Demo工程 AnalyseDependencyDemo 进行演示,该工程有4个模块,如下图所示:

使用该脚本分析跨模块引用关系的结果如下:

再结合使用https://github.com/nst/objc_dep图像化显示引用关系如下图所示:

可见该工程的引用关系十分混乱,不利于长期维护,因此有必要做一些结构分层。还是以上面的工程为例,我们抽象出一个中间层,所有业务层都向下引用该层,但不允许反向依赖,整理后的结构如下图所示:

使用该脚本分析跨模块引用关系的结果如下:

再使用https://github.com/nst/objc_dep图像化结果如下:

整理后的工程引用关系清晰,数据流向单一,有利于工程的可维护性和扩展性,因此十分有必要不定期在工程里检查模块间的引用情况,避免到了后期维护成本过高。

该脚本还支持指定分析两个模块间的引用情况,参数1 跨模块引用 参数2 的结果如下:

总结

这个脚本的原理比较简单,关键是要有这个意识,在版本迭代过程中时刻注意控制工程结构的合理性,不定期使用这个脚本检测跨模块引用情况,等到了后期无法维护的时候再回头重构的成本就会很高。

附Demo地址:https://github.com/hiXgb/AnalyseDependencyDemo

你看见了我的小熊吗?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180613G217KF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券