| name | proj-review |
| description | 代码审查检查清单和流程。用于代码提交前的自检、PR审查、代码质量检查。 |
代码审查
适用场景
- 代码提交前自检
- Pull Request 审查
- 代码质量检查
审查流程
前置: 任务文档校验 → Step 0: 编译检查 → Step 1: 功能检查 → Step 2: 代码规范 → Step 3: 安全检查 → Step 4: 性能检查 → Step 5: 自动修复 → Step 6: 测试检查 → Step 7: 输出报告
前置:任务文档校验
- 确认全流程任务文档存在
- 若缺失,先创建任务文档骨架并补齐流程状态与上下文快照
- 将“代码审查”状态标记为进行中
Step 0: 编译检查(前置)
执行 mvn compile 检查:
如有编译错误,先修复再继续审查。
审查清单
1. 功能检查
2. 代码规范
3. 安全检查(安全红线)
强制规则 - 违反必须修复:
其他安全检查:
4. 性能检查(性能红线)
强制规则 - 违反必须修复:
其他性能检查:
5. 日志检查
6. 异常处理
Step 5: 自动修复
对于以下问题,直接修复而非仅报告:
| 问题类型 | 修复方式 |
|---|
| NPE 风险(Integer/Long 比较) | 改用 equals() 或 Objects.equals() |
| 类名与文件名不匹配 | 修改类名与文件名一致 |
缺少 @ApiLog 注解 | 添加注解 |
| 硬编码常量 | 提取为常量或使用 BaseConstant |
Step 6: 测试检查
常见问题
命名问题
int a = 1;
String str = "hello";
public void process() {}
int userCount = 1;
String userName = "hello";
public void processOrder() {}
空指针风险
User user = userMapper.selectById(id);
return user.getName();
User user = userMapper.selectById(id);
if (user == null) {
throw new BusinessException(ErrorCode.DATA_NOT_EXIST);
}
return user.getName();
SQL 注入风险
@Select("SELECT * FROM user WHERE name = '" + name + "'")
@Select("SELECT * FROM user WHERE name = #{name}")
N+1 查询
List<Order> orders = orderMapper.selectList();
for (Order order : orders) {
User user = userMapper.selectById(order.getUserId());
}
List<Order> orders = orderMapper.selectList();
Set<Long> userIds = orders.stream().map(Order::getUserId).collect(toSet());
Map<Long, User> userMap = userMapper.selectBatchIds(userIds)
.stream().collect(toMap(User::getId, Function.identity()));
深度分页
SELECT * FROM order LIMIT 100000, 10;
SELECT * FROM order WHERE id > #{lastId} ORDER BY id LIMIT 10;
批量操作
mapper.insertBatch(largeList);
List<List<Entity>> batches = Lists.partition(largeList, 500);
for (List<Entity> batch : batches) {
mapper.insertBatch(batch);
}
Step 7: 输出报告
使用模板生成审查报告:审查报告模板
同步更新任务文档:
- 产物清单记录审查报告路径
- 流程状态总览标记“代码审查”为已完成
- 更新下一步指令(生成测试或运行测试)
注意事项
- 客观公正 - 基于规范和最佳实践
- 具体明确 - 指出具体问题和位置
- 提供建议 - 不只指出问题,也给出解决方案
- 区分级别 - 严重问题必须修复,建议可选