首页 > 其他分享 >【代码可视化实践】代码变更影响分析

【代码可视化实践】代码变更影响分析

时间:2023-11-24 09:34:08浏览次数:29  
标签:影响 代码 可视化 步骤 方法 变更

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.参考

JavaParser

JGit-CookBook

Graphviz

Graphviz-Java

作者:京东科技 谢骁

来源:京东云开发者社区 转载请注明来源

标签:影响,代码,可视化,步骤,方法,变更
From: https://www.cnblogs.com/Jcloud/p/17853016.html

相关文章

  • 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析|附代码数据
    原文链接:http://tecdat.cn/?p=9024原文出处:拓端数据部落公众号  最近我们被要求撰写关于GAM的研究报告,包括一些图形和统计输出。用GAM进行建模时间序列我已经准备了一个文件,其中包含四个用电时间序列来进行分析。数据操作将由data.table程序包完成。将提及的智能电表数据......
  • idea的Java窗体可视化工具Swing UI Designer的简单使用(一)
    0、问题总结Warning:java:源值1.5已过时,将在未来所有发行版中删除:   Error:java:Compilationfailed:internaljavacompilererror:   1、窗体的初使用创建GUIForm      注意使用这个关闭模式:  使用jFrame.pack();替换jFrame.setSi......
  • ez_curl【代码审计】
    ez_curl【代码审计】[难度:4]题目描述代码审计类题目,附上代码:<?phphighlight_file(__FILE__);$url='http://back-end:3000/flag?';**$input=file_get_contents('php://input');****$headers=(array)json_decode($input)->headers;**for($i=0;$i<......
  • 代码随想训练营第三十九天(Python)| 62.不同路径、63. 不同路径 II、343. 整数拆分
    62.不同路径classSolution:defuniquePaths(self,m:int,n:int)->int:#dp[i][j]代表到达dp[i][j]有多少不同路径dp=[[0]*nfor_inrange(m)]#初始化foriinrange(m):dp[i][0]=1forjinra......
  • 印度程序员指针部分部分代码
    #include"stdio.h"intmain(){ intx=5; int*p=&x; *p=6;//可以不改变x的值来修改输出 int*(*q)=&p;//即p=*q int*(*(*r))=&q;//即r=*p printf("%d\n",*p); printf("%d\n",*q); printf("%d\n",**q);//即*p pr......
  • 代码随想录-链表
    203.移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/description//***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):......
  • 代码随想录-数组
    704.二分查找https://leetcode.cn/problems/binary-search/description/classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){......
  • 软件开发费用是多少?验收时看看有没有这些代码!
    在当今时代,软件开发已经成为企业竞争的关键因素之一,然而,许多企业在面对软件开发时,往往会面临一个问题:软件开发费用是多少?验收时又该如何检查这些代码呢?本文将为你解答这些问题,并分享一些基础的代码知识。一、软件开发费用是多少?首先,我们需要明白软件开发费用的影响因素有很多,包......
  • Springboot文件上传代码笔记
    1.在src下创建filter包,包内Class名UploadFilterpackagecom.gd.filter;importorg.apache.catalina.servlet4preview.http.HttpServletRequest;importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletResponse;impor......
  • 低代码表单设计器:可视化+灵活+易操作,降本增效轻松实现!
    在现代化办公环境中,拥有先进的低代码表单设计器,可以让企业降本又增效,节约企业成本的同时,也能高效利用企业内部资源,为实现数字化转型升级提供夯实根基。那么,低代码表单设计器拥有什么样的特点?每种特点的优势表现在哪里?通过这篇文章,我们一起了解灵活、易操作、可视化的低代码表单设......