代码审查
MyDeskBot 的智能代码审查功能帮助您实时发现代码问题、提高代码质量,并遵循最佳实践。
目录
审查类型
1. 代码质量审查
检查代码的可读性、可维护性和一致性:
发现问题:
python
# ❌ 问题代码
def p(u):
if u.n==None or u.n=='':return False
if not '@' in u.e:return False
return True建议改进:
python
# ✅ 改进建议
def is_valid_user(user):
"""验证用户信息是否完整有效"""
if user.name is None or user.name == '':
return False
if '@' not in user.email:
return False
return True审查意见:
- 使用有意义的函数和变量名
- 添加类型注解
- 添加文档字符串
- 使用
is None而非== None - 改善缩进和格式
2. 安全审查
识别潜在的安全漏洞:
发现问题:
javascript
// ❌ SQL 注入风险
app.get("/user/:id", (req, res) => {
const query = `SELECT * FROM users WHERE id = ${req.params.id}`;
db.query(query, (err, result) => {
res.json(result);
});
});安全建议:
javascript
// ✅ 使用参数化查询
app.get("/user/:id", (req, res) => {
const query = "SELECT * FROM users WHERE id = ?";
db.query(query, [req.params.id], (err, result) => {
res.json(result);
});
});安全问题:
- 🔴 高危: SQL 注入漏洞
- 建议使用参数化查询或 ORM
- 添加输入验证和清理
3. 性能审查
识别性能瓶颈和优化机会:
发现问题:
java
// ❌ 性能问题
public List<User> findActiveUsers(List<User> users) {
List<User> activeUsers = new ArrayList<>();
for (User user : users) {
if (user.isActive()) { // 每次都调用数据库查询
activeUsers.add(user);
}
}
return activeUsers;
}优化建议:
java
// ✅ 批量查询
public List<User> findActiveUsers(List<User> users) {
List<Long> userIds = users.stream()
.map(User::getId)
.collect(Collectors.toList());
// 批量查询活跃状态
Map<Long, Boolean> activeStatus = userRepository.batchCheckActive(userIds);
return users.stream()
.filter(u -> activeStatus.getOrDefault(u.getId(), false))
.collect(Collectors.toList());
}性能建议:
- 🟡 中等: N+1 查询问题
- 使用批量查询代替循环查询
- 考虑添加缓存
4. 错误处理审查
检查异常处理是否完善:
发现问题:
python
# ❌ 错误处理缺失
def fetch_data(url):
response = requests.get(url)
data = response.json()
return data改进建议:
python
# ✅ 完善的错误处理
def fetch_data(url: str, timeout: int = 10) -> dict:
"""从指定 URL 获取并解析 JSON 数据
Args:
url: 目标 URL
timeout: 超时时间(秒)
Returns:
解析后的 JSON 数据
Raises:
requests.RequestException: 网络请求失败
ValueError: JSON 解析失败
"""
try:
response = requests.get(url, timeout=timeout)
response.raise_for_status()
return response.json()
except requests.Timeout:
raise requests.RequestException(f"请求超时: {url}")
except requests.HTTPError as e:
raise requests.RequestException(f"HTTP 错误: {e.response.status_code}")
except ValueError:
raise ValueError(f"JSON 解析失败: {url}")5. 并发安全审查
检查并发访问的潜在问题:
发现问题:
java
// ❌ 线程不安全
public class Counter {
private int count = 0;
public void increment() {
count++; // 非原子操作
}
public int getCount() {
return count;
}
}修复建议:
java
// ✅ 线程安全
public class Counter {
private final AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}安全问题:
- 🔴 高危: 竞态条件
- 使用原子类或同步机制
- 考虑不可变设计
使用方式
IntelliJ IDEA
审查整个文件:
- 右键 → Analyze → Inspect Code with MyDeskBot
审查选中代码:
- 选中代码块
- 右键 → Review Code with MyDeskBot
实时审查:
- 保存文件时自动触发
- 在设置中启用
Auto-review on save
VS Code
打开审查面板:
- 命令面板 →
MyDeskBot: Review Code - 快捷键:
Ctrl+Shift+R
- 命令面板 →
审查当前文件:
- 右键 → "Review current file with MyDeskBot"
审查选中代码:
- 选中代码 → 右键 → "Review selection with MyDeskBot"
Neovim
vim
" 审查当前文件
:MyDeskBotReview
" 审查选中代码 (Visual 模式)
:'<,'>MyDeskBotReview审查标准
代码质量标准
| 类别 | 标准 | 严重级别 |
|---|---|---|
| 命名 | 使用清晰、有意义的名称 | 🟡 中等 |
| 格式 | 遵循项目代码风格 | 🟢 低 |
| 注释 | 复杂逻辑添加注释 | 🟢 低 |
| 复杂度 | 圈复杂度 < 10 | 🟡 中等 |
| 重复率 | 代码重复 < 5% | 🟡 中等 |
安全标准
| 类别 | 标准 | 严重级别 |
|---|---|---|
| SQL 注入 | 使用参数化查询 | 🔴 高 |
| XSS | 输出时转义 HTML | 🔴 高 |
| CSRF | 使用 CSRF 令牌 | 🔴 高 |
| 认证 | 实施适当的认证机制 | 🔴 高 |
| 加密 | 敏感数据加密存储 | 🔴 高 |
| 输入验证 | 所有输入进行验证 | 🟡 中等 |
性能标准
| 类别 | 标准 | 严重级别 |
|---|---|---|
| 查询优化 | 避免全表扫描 | 🟡 中等 |
| 缓存策略 | 合理使用缓存 | 🟢 低 |
| 资源管理 | 及时释放资源 | 🟡 中等 |
| 算法复杂度 | 时间复杂度合理 | 🟡 中等 |
最佳实践标准
| 类别 | 建议 | 严重级别 |
|---|---|---|
| SOLID 原则 | 遵循设计原则 | 🟢 低 |
| DRY | 不重复代码 | 🟡 中等 |
| KISS | 保持简单 | 🟢 低 |
| YAGNI | 不过度设计 | 🟢 低 |
| 测试覆盖 | 单元测试覆盖 > 80% | 🟡 中等 |
自定义规则
配置审查规则
json
{
"mydeskbot": {
"review": {
"enabled": true,
"rules": {
"security": {
"level": "strict",
"rules": ["sql_injection", "xss", "csrf", "insecure_deserialization"]
},
"performance": {
"level": "moderate",
"rules": ["n_plus_one_query", "missing_cache", "inefficient_loops"]
},
"quality": {
"level": "standard",
"rules": ["complexity_check", "code_duplication", "naming_convention"]
}
},
"severity": {
"critical": true,
"high": true,
"medium": true,
"low": false
}
}
}
}自定义审查提示词
lua
-- Neovim 配置示例
require('mydeskbot').setup({
review = {
custom_prompts = {
security = [[
请从安全角度审查以下代码:
1. 检查是否有 SQL 注入风险
2. 检查是否有 XSS 漏洞
3. 验证输入是否充分
4. 检查敏感数据处理
使用严重级别标记问题:
🔴 Critical: 必须立即修复
🟡 High: 应该尽快修复
🟢 Low: 可以延后处理
]],
performance = [[
请从性能角度审查以下代码:
1. 识别性能瓶颈
2. 建议优化方案
3. 估算性能提升
4. 评估优化成本
]]
}
}
})排除特定规则
json
{
"mydeskbot.review": {
"excludeRules": [
"line_length", // 不检查行长度
"unused_imports" // 不检查未使用的导入
],
"excludePatterns": [
"**/test/**", // 排除测试文件
"**/vendor/**" // 排除第三方代码
]
}
}审查输出示例
完整审查报告
═══════════════════════════════════════════════════════
代码审查报告
文件: src/controllers/UserController.java
═══════════════════════════════════════════════════════
📊 总体评分: B (75/100)
🔴 严重问题 (2 个)
───────────────────────────────────────────────────
1. SQL 注入风险 (第 45 行)
严重级别: Critical
位置: String query = "SELECT * FROM users WHERE id = " + id;
问题: 直接拼接 SQL 语句可能导致注入攻击
建议:
```java
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setInt(1, id);资源泄漏 (第 67 行) 严重级别: High 位置: InputStream is = new FileInputStream(file);
问题: InputStream 未在 finally 块中关闭
建议: 使用 try-with-resources
🟡 中等问题 (3 个) ───────────────────────────────────────────────────
- 缺少异常处理 (第 23 行) 严重级别: Medium
- 代码重复 (第 78-85, 92-99 行) 严重级别: Medium 建议: 提取公共方法
- 方法过长 (第 15-60 行, 46 行) 严重级别: Medium 建议: 拆分为多个小方法
🟢 轻微问题 (5 个) ───────────────────────────────────────────────────
- 缺少 JavaDoc (第 15 行)
- 魔法数字 1000 (第 32 行)
- 未使用的导入 (第 3 行)
- 命名不规范 (变量 'd' 应改为 'data')
- 缺少单元测试
✅ 良好实践 ───────────────────────────────────────────────────
• 使用了常量定义 • 日志记录完善 • 遵循了命名规范 • 代码结构清晰
📈 改进建议 ───────────────────────────────────────────────────
优先级排序:
- 修复 SQL 注入问题 (Critical)
- 添加异常处理 (High)
- 提取重复代码 (Medium)
- 分拆长方法 (Medium)
- 添加 JavaDoc (Low)
- 编写单元测试 (Low)
预计改进时间: 2-3 小时 ═══════════════════════════════════════════════════════
## 集成 CI/CD
### GitHub Actions
```yaml
name: Code Review
on:
pull_request:
branches: [ main ]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: MyDeskBot Review
uses: mydeskbot/action@v1
with:
api-key: ${{ secrets.MYDESKBOT_API_KEY }}
files: |
src/**/*.java
src/**/*.ts
severity: medium
fail-on: critical
- name: Comment PR
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const report = fs.readFileSync('review-report.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: report
});GitLab CI
yaml
code_review:
stage: test
script:
- mydeskbot review --output review-report.md --fail-on critical
artifacts:
paths:
- review-report.md
expire_in: 1 week
allow_failure: true最佳实践
1. 定期审查
bash
# 每周审查一次主分支
mydeskbot review --branch main --schedule "0 9 * * 1"2. 提交前审查
bash
# Git hook (pre-commit)
#!/bin/bash
mydeskbot review --staged --fail-on critical3. PR 审查
bash
# 审查 PR 的变更文件
mydeskbot review --pr $PR_NUMBER --comment