Java 中的代码审查:检查什么以及如何提供反馈
代码审查不仅仅是合并拉取请求前的一种形式。它是提升代码质量、分享知识和预防错误的强大工具。对于初级 Java 开发者来说,参与审查常常会引发恐惧:“万一我被批评了怎么办?”,“如果我漏掉了关键错误怎么办?”。在本文中,我们将分析在检查 Java 代码时应注意什么,以及如何提供既能帮助人又不会打击积极性的反馈。
1. Java 代码中要检查什么:面向初学者的清单
第一步也是最重要的一步是知道要看什么。不要试图一下子找到所有问题。专注于关键领域。以下是 Java 代码审查的基本清单:
- 逻辑与正确性:代码是否解决了既定任务?是否存在明显的逻辑错误?边界情况是否得到正确处理?
- 命名:变量、方法和类的名称是否符合 Java 约定(camelCase、PascalCase)?它们是否具有描述性?
int a不好,int numberOfUsers好。 - 错误处理:是否有 try-catch 块?是否使用了具体的异常类型而不是通用的
Exception?异常是否被静默吞噬(空的 catch)? - 性能:是否存在明显的问题,例如在循环内创建对象、在循环中使用
+进行字符串拼接(应使用StringBuilder),或不必要的方法调用? - 测试:代码是否被单元测试覆盖?它们是否只检查正向场景,还是也检查负面和边界场景?
一个应该在审查中被注意到的糟糕代码示例:
public void processData(List data) { for (Object item : data) { String s = ""; for (int i = 0; i < 1000; i++) { s += item.toString() + i; // 潜在的性能问题 } System.out.println(s); }}这里有什么问题?在循环中使用 + 会创建许多中间 String 对象。最好替换为 StringBuilder。另外,缺少对 data 的 null 检查。
2. 如何提供建设性反馈
代码审查中最困难的部分不是技术检查,而是沟通。你的目标不是展示谁更聪明,而是帮助团队成长。以下是一些规则:
- 关注代码,而不是作者。不要说“你写了糟糕的代码”,而要说“这个方法可以使用 Stream API 简化”。
- 使用提问形式。用提问代替陈述。例如:“为什么这里选择了 ArrayList 而不是 LinkedList?考虑到频繁在列表开头插入,LinkedList 可能更高效”。
- 解释“为什么”。简单的“改掉这个”不起作用。要写:“我们把
==替换为.equals()来比较字符串,因为==比较的是引用,而不是内容”。 - 表扬好的代码。如果看到优雅的解决方案,要指出来。“这里很好地使用了 Builder 模式——代码可读性大大提高了”。
糟糕评论示例:“这是垃圾代码,重写”。好评论示例:“我觉得这个块可以提取成一个单独的私有方法,以提高主方法的可读性。你觉得呢?”
3. Java 新手常见错误以及如何指出它们
了解常见错误,你就能更快地发现它们并给出更相关的建议。以下是初级 Java 开发者在审查中经常遇到的前三大错误: