【程式碼視覺化實踐】程式碼變更影響分析

京東雲開發者發表於2023-11-24

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

作者:京東科技 謝驍

來源:京東雲開發者社群 轉載請註明來源

相關文章