1、在熟悉业务及技术现状阶段,可以使用自动化工具对工程中现有的代码、技术架构进行分析,获取当前需要重构的代码的依赖和调用关系信息,确定重构过程的变动影响,使用自动化的方式会更加的精准 。
2、在确定重构方案阶段,可以基于自动化工具产生的数据,支持重构方案的决策,包括是否需要重构,如何重构,调用方如何适配等 。
3、在分阶段实施阶段,可以使用自动化的方式支持代码的重构工作 , 包括需要重构的模块的升级、调用方代码的适配等 。对比IDE提供的查找、替换等基础工具,自动化工具可以批量处理更加复杂的重构工作 。同时实施的阶段通常是繁琐且容易出错的,但使用自动化的方式可以自动完成这些任务,并减少人为错误 。
4、在效果评估及监控阶段,可以使用自动化的方式对重构前后的代码进行对比测试保证功能的一致性,收集关键指标数据,发现指标的异常 。
03、用Python脚本实现模块的调用关析分析在实际的配置数据项的调用关系来看,公开的数据项可为几种情况,对应的重构方案可有不同 。
1、配置数据项仅在XXXSetting模块内使用,这部分数据项不需要接入数据通路 。
2、配置数据项在XXXSetting模块内使用,也在其它的模块中使用,这类数据项在XXXSetting模块中维护,数据项需要接入数据通路 。
3、配置数据项在XXXSetting模块内没有使用,只在一个模块中使用,这类数据项应该迁移到使用该数据项的模块中 。
4、配置数据项在XXXSetting模块内没有使用,但在一个以上模块中使用 , 这类数据项可以在XXXSetting模块中维护 , 但数据项需要接入数据通路 。
基于这样的改造,XXXSetting模块的数据项接口就可以全部不公开,对于配置数据项的变更,只影响依赖配置数据项的模块 。那么每个数据项的调用应该是如何重构呢,用手动查找及分析的方式成本过高 , 在项目实际过程评估及修改出错的概率也会增高,我们使用Python脚本实现了调用关系的分析工具 , 为重构工作提前进行数据支持及决策 。
3.1 提取公开数据项及类型在分析数据项的外部调用情况之前,需要先提取XXXSetting类中所有公开的数据项 。
3.1.1 公开数据项在OC类中的写法Setting文件由OC语言开发 , 在Setting头文件件中公开的数据项的定义,OC类中成员变量的定义,书写方式如下
@property (nonatomic, assign) BOOL value;@property (nonatomic, copy) NSString *value1
3.1.2 提取的是变量类型和变量的名称因头文件中,包含其它非成员变量的代码 , 比如include、前置声明、类定义、空代码行、注释、函数等,需要预处理下代码及使用正则表达式变量定义代码段,依次的读取.h文件中的每一行代码 , 以相关实现及的关键代码如下 。
去除注释因代码中的注释写法存在不确定性,会对后面的正则匹配产生影响,故先把注释删除 。
# 原代码行 @property (nonatomic, copy) NSString *value1; // 注释 ; * () 这些字符都有可能有,会影响后面的正则判断newline = re.sub(r'//.+', "", line)# 处理过后的代码行 @property (nonatomic, copy) NSString *value1;
提取数据项类型及数据项去除注释代码之后,下一步为提取成员变量名称及类型,可以使用正则中的分组匹配的能力,提取变量类型及变量名 。这里使用了正则的原因是代码的写法存在不确定性,@property的写法也会因变量类型不同而变化,故通过分组匹配的方式来实现 。
# 原代码行 @property (nonatomic, copy) NSString *value1;matchObj = re.match(r"@property.+)s+(.*)", line, re.M|re.I)if matchObj:# matchObj.group(1) 是成员变量类型和变量名 -- NSString *value1;
去除无用字符这时的代码行,因为写法的不同及变量的不同 , 需要进行标准化,才能提取出变量类型及变量名,主要为去除 星号(*) 。代码行头中的空格已经过滤(上行代码中的s+) 。
# 原代码行 NSString *value1;newline = line.replace('*', '')# 处理后的代码行 NSString value1;
提取标准化后的数据项类型及数据项这时代码行中只剩下类型 空格 变量名 分号,使用正则的分组匹配,提取类型及变量名 。
# 原代码行 NSString value1;# 正则表达式中s匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ fnrtv],s+代表一个或多个这类的字符matchObj = re.match(r"(.*)s+(.*);", line, re.M|re.I)if matchObj:# valueType = NSStringvalueType = matchObj.group(1)# valueName = value1valueName = matchObj.group(2)
推荐阅读
- 如何使用 Python 和 python-docx 库读取、写入和操作 Word 文件
- 小米cc9支持无线充电,小米cc9pro能无线充电吗
- 海信电视怎么安装斗鱼,海信投屏格式不支持怎么办
- 大S终于露面了,支持具俊晔画展,却素颜发福不敢跟老公同框合影
- 大S露面支持老公画展,身体痊愈“幸福肥”,和具俊晔眉目传情!
- oppok5支持微信视频美颜吗
- 小米cc9pro支持无线充电吗
- 萧敬腾正式官宣结婚!海边婚纱照别具一格,岳父中风多年仍支持!
- 红米note9pro支持5g
- 暴击联盟传世脚本怎么用 斩魔无双传世手游脚本下载攻略