三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从“意大利面”到整洁代码:我是如何用SonarQube重构遗留项目的

从“意大利面”到整洁代码:我是如何用SonarQube重构遗留项目的

从“意大利面”到整洁代码:我是如何用SonarQube重构遗留项目的

接手一个结构混乱的遗留项目,就像面对一盘煮过头的意大利面——各种逻辑纠缠不清,随便动一处就可能引发连锁反应。去年我遇到这样一个Java项目:12万行代码,零单元测试,循环复杂度平均超过20。团队里没人敢碰核心模块,每次修Bug都像在拆炸弹。直到引入SonarQube这套"代码X光机",我们才找到重构的突破口。

1. 初识SonarQube:给代码做全面体检

第一次扫描结果令人窒息:247个严重问题58%的代码重复率,还有3个高危安全漏洞。控制台输出的ERROR 137错误(内存不足)反而成了最不严重的问题——至少我们知道怎么解决它。通过调整sonar-scanner的JVM参数,我们让扫描过程稳定运行:

SONAR_SCANNER_OPTS="-Xmx4g -XX:MaxPermSize=512m"

提示:对于大型项目,建议在非工作时间执行首次扫描,避免影响CI/CD流水线

扫描报告中最有价值的三个维度:

  1. 可靠性:空指针异常风险、未处理的异常
  2. 可维护性:代码重复率、圈复杂度
  3. 安全性:SQL注入风险、硬编码密码

2. 制定重构优先级:先止血,再美容

面对海量问题,我们建立了这样的处理策略:

优先级问题类型处理策略工具辅助
P0内存泄漏/安全漏洞立即修复FindSecBugs插件
P1重复代码块(>30行)提取公共方法/组件SonarLint实时检测
P2圈复杂度>15的方法拆分子方法/策略模式IntelliJ重构工具
P3命名不规范逐步修正代码审查时处理

实际执行时发现一个反直觉现象:修复前20%的高优先级问题后,剩余问题的修复难度下降了近40%。这是因为核心结构的改善产生了杠杆效应。

3. 实战重构技巧:从外科手术到器官移植

3.1 处理"上帝类"

有个被称为CommonUtils的类包含了387个方法,承担了从日期格式化到加密解密的所有职责。我们采用"外科手术式"重构:

  1. 先用git blame确认近期修改频率高的方法
  2. 对高频修改的方法使用提取类重构:
    // 重构前 public class CommonUtils { public static String encrypt(String data) { /*...*/ } public static Date parseDate(String str) { /*...*/ } } // 重构后 public class CryptoUtils { public static String encrypt(String data) { /*...*/ } } public class DateUtils { public static Date parseDate(String str) { /*...*/ } }

3.2 消灭重复代码

SonarQube的重复代码检测帮我们发现了跨模块的相似逻辑。通过模板方法模式统一处理:

// 重复的订单处理逻辑 public abstract class OrderProcessorTemplate { public final void processOrder(Order order) { validate(order); calculate(order); save(order); notify(order); } protected abstract void calculate(Order order); // 其他步骤默认实现... }

4. 持续质量门禁:让整洁成为习惯

引入质量门禁后,任何导致以下指标恶化的MR都会被自动拒绝:

  • 代码覆盖率下降超过5%
  • 新增重复代码超过10行
  • 方法圈复杂度超过15

我们在GitLab CI中配置了这样的检查步骤:

sonar-check: stage: quality-gate script: - sonar-scanner - curl -u $SONAR_TOKEN: "" "${SONAR_HOST}/api/qualitygates/project_status?projectKey=${CI_PROJECT_NAME}" | grep -q '"status":"OK"'

六个月后,关键指标的变化令人欣慰:

  • 平均圈复杂度从24降到9
  • 单元测试覆盖率从0%提升到65%
  • 生产环境缺陷率下降72%

最意外的收获是:当新成员看到SonarQube仪表盘从红色变成绿色时,团队对代码的敬畏感自然形成了。现在每次提交代码前,大家会习惯性地用SonarLint做本地扫描——这或许比任何代码规范文档都有效。

← 返回列表