Skip to content

代码审查

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

审查意见:

  1. 使用有意义的函数和变量名
  2. 添加类型注解
  3. 添加文档字符串
  4. 使用 is None 而非 == None
  5. 改善缩进和格式

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

  1. 审查整个文件:

    • 右键 → AnalyzeInspect Code with MyDeskBot
  2. 审查选中代码:

    • 选中代码块
    • 右键 → Review Code with MyDeskBot
  3. 实时审查:

    • 保存文件时自动触发
    • 在设置中启用 Auto-review on save

VS Code

  1. 打开审查面板:

    • 命令面板 → MyDeskBot: Review Code
    • 快捷键: Ctrl+Shift+R
  2. 审查当前文件:

    • 右键 → "Review current file with MyDeskBot"
  3. 审查选中代码:

    • 选中代码 → 右键 → "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);
  1. 资源泄漏 (第 67 行) 严重级别: High 位置: InputStream is = new FileInputStream(file);

    问题: InputStream 未在 finally 块中关闭

    建议: 使用 try-with-resources

🟡 中等问题 (3 个) ───────────────────────────────────────────────────

  1. 缺少异常处理 (第 23 行) 严重级别: Medium
  2. 代码重复 (第 78-85, 92-99 行) 严重级别: Medium 建议: 提取公共方法
  3. 方法过长 (第 15-60 行, 46 行) 严重级别: Medium 建议: 拆分为多个小方法

🟢 轻微问题 (5 个) ───────────────────────────────────────────────────

  1. 缺少 JavaDoc (第 15 行)
  2. 魔法数字 1000 (第 32 行)
  3. 未使用的导入 (第 3 行)
  4. 命名不规范 (变量 'd' 应改为 'data')
  5. 缺少单元测试

✅ 良好实践 ───────────────────────────────────────────────────

• 使用了常量定义 • 日志记录完善 • 遵循了命名规范 • 代码结构清晰

📈 改进建议 ───────────────────────────────────────────────────

优先级排序:

  1. 修复 SQL 注入问题 (Critical)
  2. 添加异常处理 (High)
  3. 提取重复代码 (Medium)
  4. 分拆长方法 (Medium)
  5. 添加 JavaDoc (Low)
  6. 编写单元测试 (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 critical

3. PR 审查

bash
# 审查 PR 的变更文件
mydeskbot review --pr $PR_NUMBER --comment

下一步