Skip to content
On this page

代码审查速查表

审查前检查清单

快速概览

  • [ ] 阅读提交描述和目的
  • [ ] 理解业务需求背景
  • [ ] 检查变更文件数量(理想<500行)
  • [ ] 确认代码风格与项目一致

上下文检查

  • [ ] 了解相关模块功能
  • [ ] 确认API变更影响范围
  • [ ] 检查依赖关系

代码质量检查

命名规范

  • [ ] 变量/函数名清晰表达意图
  • [ ] 遵循项目命名约定(camelCase, PascalCase等)
  • [ ] 避免缩写和单字母变量(除循环计数器)
  • [ ] 常量使用大写下划线格式

函数设计

  • [ ] 函数长度<50行
  • [ ] 单一职责原则
  • [ ] 参数数量≤3个(使用对象参数)
  • [ ] 返回值类型一致

注释质量

  • [ ] 解释为什么,而非是什么
  • [ ] 复杂算法需要详细注释
  • [ ] JSDoc函数文档完整
  • [ ] 避免注释掉的代码

安全检查

输入验证

  • [ ] 所有外部输入都经过验证
  • [ ] 使用参数化查询防止SQL注入
  • [ ] 验证数据类型和格式
  • [ ] 限制输入长度

输出编码

  • [ ] HTML输出经过转义
  • [ ] 防止XSS攻击
  • [ ] JSON输出安全

权限控制

  • [ ] 验证用户权限
  • [ ] 敏感操作双重验证
  • [ ] 避免信息泄露

性能检查

算法效率

  • [ ] 避免O(n²)复杂度(除非必要)
  • [ ] 循环中避免重复计算
  • [ ] 使用适当的数据结构

数据库查询

  • [ ] 避免N+1查询问题
  • [ ] 使用适当索引
  • [ ] 只选择需要的字段

内存管理

  • [ ] 及时清理事件监听器
  • [ ] 避免内存泄漏
  • [ ] 合理使用缓存

错误处理

异常处理

  • [ ] 关键操作有错误处理
  • [ ] 不要忽略错误
  • [ ] 有意义的错误信息
  • [ ] 适当的错误日志记录

边界条件

  • [ ] 空值处理
  • [ ] 数组边界检查
  • [ ] 数值范围验证

测试检查

单元测试

  • [ ] 核心逻辑有测试覆盖
  • [ ] 边界条件测试
  • [ ] 错误路径测试
  • [ ] 测试用例清晰命名

集成测试

  • [ ] 关键流程测试
  • [ ] 数据库交互测试
  • [ ] API端点测试

前端特定检查

用户界面

  • [ ] 响应式设计
  • [ ] 可访问性(ARIA标签)
  • [ ] 键盘导航支持

性能优化

  • [ ] 避免不必要的重渲染
  • [ ] 图片优化
  • [ ] 代码分割和懒加载

状态管理

  • [ ] 状态更新逻辑正确
  • [ ] 避免竞态条件
  • [ ] 异步操作妥善处理

后端特定检查

API设计

  • [ ] RESTful设计原则
  • [ ] 一致的状态码
  • [ ] 清晰的错误响应格式

数据处理

  • [ ] 数据验证在服务层
  • [ ] 事务管理正确
  • [ ] 数据库连接池使用

常见问题速查

JavaScript常见问题

javascript
// ❌ Bad
if (x = 5) // 赋值而非比较

// ✅ Good
if (x === 5)

// ❌ Bad
for (var i = 0; i < arr.length; i++) {
  setTimeout(() => console.log(i)); // 输出: 5, 5, 5, 5, 5
}

// ✅ Good
for (let i = 0; i < arr.length; i++) {
  setTimeout(() => console.log(i)); // 输出: 0, 1, 2, 3, 4
}

// ❌ Bad
const result = arr.map(item => { item.newProp = true; return item; }); // 修改原对象

// ✅ Good
const result = arr.map(item => ({ ...item, newProp: true }));

安全漏洞示例

javascript
// ❌ SQL注入风险
const query = `SELECT * FROM users WHERE id = ${userId}`;

// ✅ 参数化查询
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);

// ❌ XSS风险
res.send(`<div>${userInput}</div>`);

// ✅ 输出转义
res.send(`<div>${escapeHtml(userInput)}</div>`);

审查反馈模板

肯定部分

  • "逻辑清晰,易于理解"
  • "测试覆盖全面"
  • "错误处理得当"
  • "代码结构良好"

建议改进

  • "考虑添加输入验证"
  • "函数可以拆分以提高可读性"
  • "这里可能存在性能问题"
  • "需要更详细的错误处理"

严重问题

  • "存在安全漏洞"
  • "缺少边界条件检查"
  • "可能导致内存泄漏"
  • "影响系统稳定性"

工具推荐

静态分析

  • ESLint: 代码风格和质量
  • SonarQube: 代码质量分析
  • CodeClimate: 持续代码质量监控

测试工具

  • Jest: JavaScript测试框架
  • Cypress: 端到端测试
  • Puppeteer: 浏览器自动化

安全工具

  • OWASP ZAP: 安全扫描
  • Snyk: 依赖安全检查
  • Retire.js: 检测易受攻击的JavaScript库

审查时间管理

小型变更 (<200行)

  • 15-30分钟
  • 重点关注逻辑正确性

中型变更 (200-500行)

  • 30-60分钟
  • 详细检查所有方面

大型变更 (>500行)

  • 分批审查
  • 重点关注架构和设计
  • 安排多次审查会议

反馈原则

建设性反馈

  • 具体而非模糊
  • 提供解决方案
  • 关注代码而非个人
  • 区分重要和次要问题

沟通技巧

  • 使用"我们"而非"你"
  • 承认好的实现
  • 询问而非命令
  • 鼓励讨论

记住:代码审查的目标是提高代码质量和团队技能,而不是批评。

理想情况:每次审查都能学到新东西!