code-review-checklist-zh:code-review-checklist

时间:2026-07-25 13:36:02 来源:互联网

代码审查清单

概述

提供进行彻底代码审查的系统性清单。此技能帮助审查者确保代码质量、发现缺陷、识别安全问题,并在整个代码库中保持一致性。

何时使用此技能

  • 在审查拉取请求时使用
  • 在进行代码审计时使用
  • 在为团队建立代码审查标准时使用
  • 在培训新开发者掌握代码审查实践时使用
  • 在确保审查不漏项时使用
  • 在创建代码审查文档时使用

工作方式

第1步:理解背景

在审查代码之前,我会帮助你了解:

  • 这段代码解决什么问题?
  • 需求是什么?
  • 哪些文件被修改了,为什么?
  • 是否有相关的问题或工单?
  • 测试策略是什么?

第2步:审查功能

检查代码是否能正确工作:

  • 它解决了所陈述的问题吗?
  • 边界情况是否得到处理?
  • 错误处理是否恰当?
  • 是否存在逻辑错误?
  • 是否符合需求?

第3步:审查代码质量

评估代码的可维护性:

  • 代码是否可读且清晰?
  • 命名是否具有描述性?
  • 结构是否合理?
  • 函数/方法是否聚焦单一职责?
  • 是否存在不必要的复杂性?

第4步:审查安全性

检查安全问题:

  • 输入是否经过验证?
  • 敏感数据是否受到保护?
  • 是否存在SQL注入风险?
  • 身份验证/授权是否正确?
  • 依赖是否安全?

第5步:审查性能

查找性能问题:

  • 是否存在不必要的循环?
  • 数据库访问是否优化?
  • 是否存在内存泄漏?
  • 缓存使用是否恰当?
  • 是否存在N+1查询问题?

第6步:审查测试

验证测试覆盖:

  • 新代码是否有测试?
  • 测试是否覆盖边界情况?
  • 测试是否有意义?
  • 所有测试是否通过?
  • 测试覆盖率是否足够?

示例

示例1:功能审查清单

## Functionality Review

### Requirements
- [ ] Code solves the stated problem
- [ ] All acceptance criteria are met
- [ ] Edge cases are handled
- [ ] Error cases are handled
- [ ] User input is validated

### Logic
- [ ] No logical errors or bugs
- [ ] Conditions are correct (no off-by-one errors)
- [ ] Loops terminate correctly
- [ ] Recursion has proper base cases
- [ ] State management is correct

### Error Handling
- [ ] Errors are caught appropriately
- [ ] Error messages are clear and helpful
- [ ] Errors don't expose sensitive information
- [ ] Failed operations are rolled back
- [ ] Logging is appropriate

### Example Issues to Catch:

**❌ Bad - Missing validation:**
```javascript
function createUser(email, password) {
  // No validation!
  return db.users.create({ email, password });
}
```

**✅ Good - Proper validation:**
```javascript
function createUser(email, password) {
  if (!email || !isValidEmail(email)) {
    throw new Error('Invalid email address');
  }
  if (!password || password.length < 8) {
    throw new Error('Password must be at least 8 characters');
  }
  return db.users.create({ email, password });
}
```

示例2:安全审查清单

## Security Review

### Input Validation
- [ ] All user inputs are validated
- [ ] SQL injection is prevented (use parameterized queries)
- [ ] XSS is prevented (escape output)
- [ ] CSRF protection is in place
- [ ] File uploads are validated (type, size, content)

### Authentication & Authorization
- [ ] Authentication is required where needed
- [ ] Authorization checks are present
- [ ] Passwords are hashed (never stored plain text)
- [ ] Sessions are managed securely
- [ ] Tokens expire appropriately

### Data Protection
- [ ] Sensitive data is encrypted
- [ ] API keys are not hardcoded
- [ ] Environment variables are used for secrets
- [ ] Personal data follows privacy regulations
- [ ] Database credentials are secure

### Dependencies
- [ ] No known vulnerable dependencies
- [ ] Dependencies are up to date
- [ ] Unnecessary dependencies are removed
- [ ] Dependency versions are pinned

### Example Issues to Catch:

**❌ Bad - SQL injection risk:**
```javascript
const query = `SELECT * FROM users WHERE email = '${email}'`;
db.query(query);
```

**✅ Good - Parameterized query:**
```javascript
const query = 'SELECT * FROM users WHERE email = $1';
db.query(query, [email]);
```

**❌ Bad - Hardcoded secret:**
```javascript
const API_KEY = 'sk_live_abc123xyz';
```

**✅ Good - Environment variable:**
```javascript
const API_KEY = process.env.API_KEY;
if (!API_KEY) {
  throw new Error('API_KEY environment variable is required');
}
```

示例3:代码质量审查清单

## Code Quality Review

### Readability
- [ ] Code is easy to understand
- [ ] Variable names are descriptive
- [ ] Function names explain what they do
- [ ] Complex logic has comments
- [ ] Magic numbers are replaced with constants

### Structure
- [ ] Functions are small and focused
- [ ] Code follows DRY principle (Don't Repeat Yourself)
- [ ] Proper separation of concerns
- [ ] Consistent code style
- [ ] No dead code or commented-out code

### Maintainability
- [ ] Code is modular and reusable
- [ ] Dependencies are minimal
- [ ] Changes are backwards compatible
- [ ] Breaking changes are documented
- [ ] Technical debt is noted

### Example Issues to Catch:

**❌ Bad - Unclear naming:**
```javascript
function calc(a, b, c) {
  return a * b + c;
}
```

**✅ Good - Descriptive naming:**
```javascript
function calculateTotalPrice(quantity, unitPrice, tax) {
  return quantity * unitPrice + tax;
}
```

**❌ Bad - Function doing too much:**
```javascript
function processOrder(order) {
  // Validate order
  if (!order.items) throw new Error('No items');
  
  // Calculate total
  let total = 0;
  for (let item of order.items) {
    total += item.price * item.quantity;
  }
  
  // Apply discount
  if (order.coupon) {
    total *= 0.9;
  }
  
  // Process payment
  const payment = stripe.charge(total);
  
  // Send email
  sendEmail(order.email, 'Order confirmed');
  
  // Update inventory
  updateInventory(order.items);
  
  return { orderId: order.id, total };
}
```

**✅ Good - Separated concerns:**
```javascript
function processOrder(order) {
  validateOrder(order);
  const total = calculateOrderTotal(order);
  const payment = processPayment(total);
  sendOrderConfirmation(order.email);
  updateInventory(order.items);
  
  return { orderId: order.id, total };
}
```

最佳实践

✅ 应该这样做

  • 审查小改动 - 较小的PR更容易彻底审查
  • 先检查测试 - 验证测试通过并覆盖新代码
  • 运行代码 - 尽可能在本地测试
  • 提出疑问 - 不要假设,主动寻求澄清
  • 建设性反馈 - 提供改进建议,而不是单纯批评
  • 关注重要问题 - 不要纠结微小的风格问题
  • 使用自动化工具 - Linter、格式化工具、安全扫描器
  • 审查文档 - 检查文档是否已更新
  • 考虑性能 - 思考扩展性和效率
  • 检查回归 - 确保现有功能仍然可用

❌ 不要这样做

  • 不要不看就批准 - 实际审查代码
  • 不要含糊其辞 - 提供带示例的具体反馈
  • 不要忽视安全 - 安全问题至关重要
  • 不要跳过测试 - 未测试的代码会带来问题
  • 不要粗鲁 - 保持尊重和专业
  • 不要走过场 - 每次审查都应带来价值
  • 不要在疲劳时审查 - 你会遗漏重要问题
  • 不要忘记上下文 - 理解全局图景

完整审查清单

审查前准备

  • 阅读PR描述和关联问题
  • 了解要解决的问题是什么
  • 检查CI/CD中的测试是否通过
  • 拉取分支并在本地运行

功能

  • 代码解决了所陈述的问题
  • 边界情况得到处理
  • 错误处理恰当
  • 用户输入经过验证
  • 无逻辑错误

安全

  • 无SQL注入漏洞
  • 无XSS漏洞
  • 身份验证/授权正确
  • 敏感数据受到保护
  • 无硬编码密钥

性能

  • 无不必要的数据库查询
  • 无N+1查询问题
  • 使用高效算法
  • 无内存泄漏
  • 缓存使用恰当

代码质量

  • 代码可读且清晰
  • 命名具有描述性
  • 函数聚焦且短小
  • 无代码重复
  • 遵循项目约定

测试

  • 新代码有测试
  • 测试覆盖边界情况
  • 测试有意义
  • 所有测试通过
  • 测试覆盖率足够

文档

  • 代码注释解释原因,而非内容
  • API文档已更新
  • README已在必要时更新
  • 破坏性变更已文档化
  • 必要时提供迁移指南

Git

  • 提交信息清晰
  • 无合并冲突
  • 分支与主分支保持同步
  • 未提交不必要的文件
  • .gitignore配置正确

常见陷阱

问题:遗漏边界情况

症状: 代码在正常路径下工作,但在边界情况下失败 解决方案: 提出"如果……会怎样?"的问题

  • 如果输入为null会怎样?
  • 如果数组为空会怎样?
  • 如果用户未认证会怎样?
  • 如果网络请求失败会怎样?

问题:安全漏洞

症状: 代码暴露安全风险 解决方案: 使用安全检查清单

  • 运行安全扫描器(npm audit, Snyk)
  • 检查OWASP Top 10
  • 验证所有输入
  • 使用参数化查询
  • 绝不信任用户输入

问题:测试覆盖率差

症状: 新代码没有测试或不充分的测试 解决方案: 要求所有新代码都有测试

  • 函数的单元测试
  • 功能的集成测试
  • 边界情况测试
  • 错误情况测试

问题:代码不清晰

症状: 审查者无法理解代码的功能 解决方案: 要求改进

  • 更好的变量命名
  • 解释性注释
  • 更小的函数
  • 清晰的结构

审查评论模板

请求修改

**Issue:** [Describe the problem]

**Current code:**
```javascript
// Show problematic code
```

**Suggested fix:**
```javascript
// Show improved code
```

**Why:** [Explain why this is better]

提出问题

**Question:** [Your question]

**Context:** [Why you're asking]

**Suggestion:** [If you have one]

表扬优秀代码

**Nice!** [What you liked]

This is great because [explain why]

相关技能

  • @requesting-code-review - 准备代码供审查
  • @receiving-code-review - 处理审查反馈
  • @systematic-debugging - 调试审查中发现的问题
  • @test-driven-development - 确保代码有测试

其他资源

  • Google Code Review Guidelines
  • OWASP Top 10
  • Code Review Best Practices
  • How to Review Code

专业提示: 每次审查都使用清单模板,确保一致性和全面性。根据团队的特定需求定制它!