【代码可视化实践】代码变更影响分析 | 京东云技术团队
1.前言
笔者前文“浅析代码可视化”中讲述了代码可视化的基本实现原理,并给出了一些业界的应用场景。由于涉及原理和技术范围较广,以笔者能力难以做到面面俱到,为了减少信息传递偏差,便给出了一些信息来源供读者深入阅读。不过针对文中提到应用场景中的一些小的功能点,可以拿出来详尽的分析一下实现方案,以小见大。因此本文将针对代码可视化在代码变更影响分析上的应用做较详细的阐述,希望能对大家有所帮助。
2.场景
先用2个常见的开发场景来还原描述为什么我们需要“代码变更影响分析”。
场景1:修改了方法①逻辑,以为只会影响入口A便只回归了相关的场景,上线后发现影响了入口B的逻辑,造成了线上事故;
场景2:修改了方法②逻辑,并回归了所有已知的流量入口,但上线一段时间后出现了大量异常告警,原来是影响了定时任务和MQ消费逻辑;
其他等等......
“代码变更影响分析”具体的可以描述为:如何感知代码改动造成功能逻辑变化的影响范围,具体到影响了哪些类、方法、入口以及调用拓扑。
3.方案
针对需求,下面给出一种基于源码静态分析的实现方案。
4.实现
下面阐述基于Java8的具体实现方案
4.1 方法调用拓扑生成
- 基本思路
使用JGit拉取远程仓库到本地后使用JavaParser对源码进行分析,从而得到类、方法和方法调用信息,基于此构建方法调用拓扑图。
- 实现步骤
步骤一:使用JGit将远程仓库拉取到本地
步骤二:设置JavaParser配置并解析项目所有源码文件
步骤三:遍历所有类文件获取类、方法和方法调用信息
步骤四:识别项目入口类和方法(示例代码仅实现了spring http入口识别)
步骤五:将入口方法作为起始节点,基于方法和调用关系生成方法调用拓扑图
(用来解析的代码示例在src/main/java/com/analysis/code/example包下)
4.2 代码变更影响分析
- 基本思路
通过Git Diff获取变更影响了哪些Java类文件,然后对变更前后的类文件进行源码解析得到类方法列表并对比前后差异得到变更影响的方法节点,最后结合之前生成的方法拓扑信息得到变更影响拓扑图。
- 实现步骤
步骤一:使用JGit获取分支变更影响了哪些文件
步骤二:使用JavaParser对变更前后的Java文件进行解析,获取变更前后类的方法列表
步骤三:依次对照变更前后方法体信息(去除了注释影响,并格式化了代码),得到变更影响了哪些方法
步骤四:结合方法拓扑生成变更影响结果
5.总结
越早评估出改动的影响面将更容易把风险扼杀在摇篮里,以更小的成本避免事故的发生。本文提供了一种"代码变更影响分析"功能的粗粒度实现方案,综合运用了Git、源码分析、可视化图表等技术。不过针对愈发复杂的业务现状,文中描述的功能还比较初级,还需要按场景进行针对性的增强和细化,从而真正做到对开发者有帮助。
6.参考
作者:京东科技 谢骁
来源:京东云开发者社区 转载请注明来源
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
🎉OpenTiny Vue 开源组件库突破 1000 Star ⭐
你好,我是 Kagol。 今天是感恩节,我们怀着无比激动的心情,庆祝 TinyVue 达到 1000 Star ⭐ 感谢所有支持 OpenTiny 开源社区的朋友们! 2023年2月16日,TinyVue 正式开源。 和业界组件库相比,OpenTiny Vue 最大的特色就是使用 Renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 / Vue3 / React,支持 PC / Mobile 端,并支持函数级别的逻辑定制和全模板替换,灵活性好、二次开发能力强。 我们拥有更丰富的组件,目前组件数量已经超过100个,除了业界常见组件之外,我们还提供了一些独有的特色组件,如:Split 面板分割器、IpAddress IP 地址输入框、Calendar 日历、Crop 图片裁切等。 经过9个多月的持续打磨,我们发布了6个大版本,支持了更加丰富的特性,能力更强、体验更好。 完成 Monorepo 和 TypeScript 工程改造 支持 Vue2.7 支持 VitePress 服务端渲染 官网提供 Composition API 写法的示例 提供 Playground 代...
- 下一篇
Promise规范与原理解析 | 京东物流技术团队
摘要 Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景、更快速定位问题。 Promise出现的原因 首先我们先来看一段代码:异步请求的层层嵌套 function fn1(params) { const xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState === 4 && xmlHttp.status === 200) { const fn1Data = {name: 'fn1'} console.log(fn1Data, 'fn1Data'); // 请求2 (function fn2() { xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState === 4 && xmlHttp.status === 200) ...
相关文章
文章评论
共有0条评论来说两句吧...