Appearance
代码审查速查表
审查前检查清单
快速概览
- [ ] 阅读提交描述和目的
- [ ] 理解业务需求背景
- [ ] 检查变更文件数量(理想<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行)
- 分批审查
- 重点关注架构和设计
- 安排多次审查会议
反馈原则
建设性反馈
- 具体而非模糊
- 提供解决方案
- 关注代码而非个人
- 区分重要和次要问题
沟通技巧
- 使用"我们"而非"你"
- 承认好的实现
- 询问而非命令
- 鼓励讨论
记住:代码审查的目标是提高代码质量和团队技能,而不是批评。
理想情况:每次审查都能学到新东西!