代码CR(Code Review)一般做什么?(Java版)

在 Java 开发中,代码 CR(Code Review,代码审查) 是保障代码质量、统一团队规范、发现潜在问题的重要环节。以下是 Java 代码 CR 的核心关注点和具体实践:


一、代码 CR 的核心目标

  1. 代码质量:确保代码正确性、健壮性、可维护性。
  2. 规范统一:遵循团队编码规范,保持代码风格一致。
  3. 风险预防:发现潜在 Bug、性能瓶颈、安全隐患。
  4. 知识共享:促进团队成员技术交流,提升整体水平。

二、Java 代码 CR 的 10 大审查重点

1. 代码规范与风格
  • 命名规范:类名大驼峰、方法名小驼峰、常量全大写。
    // Bad ❌
    public class userService { ... }
    
    // Good ✅
    public class UserService { ... }
    public static final int MAX_RETRY_TIMES = 3;
    
  • 代码格式:缩进、空格、括号位置(遵循团队约定或工具如 Checkstyle)。
  • 注释清晰:关键逻辑需有注释,避免冗余或无意义注释。
    // Bad ❌
    int a = 10; // 设置a为10
    
    // Good ✅
    // 根据用户等级计算折扣率(等级越高折扣越大)
    double discountRate = calculateDiscount(userLevel);
    

2. 面向对象设计
  • 单一职责原则:类/方法是否职责单一。
    // Bad ❌:一个方法处理订单又发送邮件
    public void processOrderAndSendEmail(Order order) { ... }
    
    // Good ✅:拆分职责
    public void processOrder(Order order) { ... }
    public void sendOrderConfirmationEmail(Order order) { ... }
    
  • 继承与多态:避免过度继承,优先使用组合。
  • 接口设计:接口是否简洁,是否符合开闭原则。

3. 异常处理
  • 捕获具体异常:避免直接 catch (Exception e)
    // Bad ❌
    try { ... } catch (Exception e) { ... }
    
    // Good ✅
    try { ... } catch (FileNotFoundException e) { ... }
    
  • 资源释放:确保 ConnectionStream 等资源在 finallytry-with-resources 中关闭。
    // Good ✅
    try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
        // 使用资源
    } catch (IOException e) { ... }
    
  • 自定义异常:业务异常应封装为明确的异常类型。

4. 性能优化
  • 避免重复计算:循环内减少冗余操作。
    // Bad ❌:每次循环都调用 size()
    for (int i=0; i < list.size(); i++) { ... }
    
    // Good ✅
    int size = list.size();
    for (int i=0; i < size; i++) { ... }
    
  • 对象复用:减少不必要的对象创建(如字符串拼接用 StringBuilder)。
  • 集合使用:根据场景选择 ArrayList/LinkedList,初始化指定容量。

5. 线程安全
  • 共享资源同步:多线程访问共享数据时使用 synchronized 或并发工具。
    // Bad ❌:非线程安全的累加
    private int count = 0;
    public void increment() { count++; }
    
    // Good ✅
    private AtomicInteger count = new AtomicInteger(0);
    public void increment() { count.incrementAndGet(); }
    
  • 避免死锁:按固定顺序获取锁,设置超时机制。

6. 安全性
  • SQL 注入:禁止拼接 SQL,使用预编译 PreparedStatement
    // Bad ❌
    String sql = "SELECT * FROM users WHERE id = " + userId;
    
    // Good ✅
    String sql = "SELECT * FROM users WHERE id = ?";
    PreparedStatement stmt = connection.prepareStatement(sql);
    stmt.setInt(1, userId);
    
  • 敏感数据:日志中避免输出密码、Token 等。
  • 输入校验:对用户输入做合法性校验(如正则表达式)。

7. 测试覆盖
  • 单元测试:关键逻辑是否有测试用例,边界条件是否覆盖。
    // 示例:JUnit 测试
    @Test
    void testCalculateDiscount() {
        assertEquals(0.9, calculateDiscount(Level.VIP));
        assertEquals(1.0, calculateDiscount(Level.NORMAL));
    }
    
  • Mock 依赖:使用 Mockito 隔离外部服务依赖。

8. 可读性与维护性
  • 方法长度:单个方法不超过 50 行(可配置),过长需拆分。
  • 魔法数字:避免直接使用未解释的字面量。
    // Bad ❌
    if (status == 3) { ... }
    
    // Good ✅
    private static final int STATUS_COMPLETED = 3;
    if (status == STATUS_COMPLETED) { ... }
    
  • 复杂度控制:降低圈复杂度(Cyclomatic Complexity),避免多重嵌套。

9. 依赖管理
  • 包引入:移除无用 import,避免依赖冲突。
  • 版本管理:Maven/Gradle 依赖版本是否统一。

10. 日志规范
  • 日志级别:合理使用 DEBUG/INFO/ERROR
  • 日志内容:关键操作需记录日志,包含上下文信息。
    // Bad ❌
    logger.error("Error occurred");
    
    // Good ✅
    logger.error("Failed to process order [orderId={}, userId={}]", orderId, userId, e);
    

三、代码 CR 的辅助工具

工具类型常用工具作用
静态代码分析SonarQubeSpotBugs检查代码漏洞、坏味道
代码格式化SpotlessCheckstyle自动格式化代码,强制风格统一
依赖管理Maven Dependency Plugin分析依赖冲突
测试覆盖率JaCoCoCobertura统计测试覆盖率
代码审查平台GitHub PRGitLab MR在线协作审查代码

四、代码 CR 的流程建议

  1. 小步提交:每次 PR/MR 只包含一个明确的功能或修复。
  2. 明确描述:提交时写明背景、改动点、测试结果。
  3. 自动化检查:在 CI/CD 流程中集成代码扫描、测试和构建。
  4. 分层审查
    • 第一层:工具自动化检查(格式、静态分析)。
    • 第二层:开发者自检(测试用例、文档更新)。
    • 第三层:人工审查(设计合理性、业务逻辑)。

五、常见代码坏味道(Code Smells)

  • 重复代码:提取公共方法或工具类。
  • 过长参数列表:封装为对象或使用 Builder 模式。
  • 过度注释:代码应自解释,注释仅补充“为什么”而非“做什么”。
  • 僵尸代码:删除无用代码、注释掉的代码。

六、总结

Java 代码 CR 是持续改进代码质量的核心实践,需结合人工经验与自动化工具,重点关注 设计合理性、规范符合性、可维护性。通过 CR 不仅能提升代码质量,还能促进团队技术成长,形成高效协作的文化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值