9级代码审查

---
name: "advanced-code-review"
description: "执行9轮由浅到深层的代码审查,从基础编译检查到架构安全性能全面审核。Invoke when user requests deep code review or comprehensive code audit."
---

# 高级代码审查技能 (Advanced Code Review Skill)

## 概述

本技能定义了一套完整的9轮代码审查流程,由浅入深地检查代码质量,确保代码在编译、语法、设计、安全、性能、架构等各方面都达到高标准。

## 9轮审查流程

### 第 1 轮:基础编译检查
**目标:** 确保代码可以编译,没有语法错误

**检查清单:**
- [ ] 所有方法是否都已定义
- [ ] 所有引用的类型是否存在
- [ ] 接口实现是否完整
- [ ] 缺少的 using 语句
- [ ] 语法错误
- [ ] 警告信息分析

**工具命令:**
```bash
dotnet build -p:TreatWarningsAsErrors=false --verbosity normal
```

---

### 第 2 轮:语法规范检查
**目标:** 检查代码语法规范和风格一致性

**检查清单:**
- [ ] 命名规范(类名、方法名、变量名)
- [ ] 代码缩进和格式
- [ ] 括号使用一致性
- [ ] 空行和空格使用
- [ ] 文件编码(UTF-8)
- [ ] 行尾符一致性(LF/CRLF)

**工具命令:**
```bash
dotnet format --verify-no-changes
dotnet format --verbosity diagnostic
```

---

### 第 3 轮:代码重复检查 (DRY原则)
**目标:** 识别代码重复,确保遵循DRY原则

**检查清单:**
- [ ] 重复的方法实现
- [ ] 重复的代码块
- [ ] 重复的常量定义
- [ ] 重复的异常处理模式
- [ ] 重复的字符串字面量

**常见问题和修复:**
1. **重复的方法逻辑**
   ```csharp
   // 问题:同步和异步方法重复逻辑
   public bool Execute() { /* 重复逻辑 */ }
   public async Task<IPluginResult> ExecuteAsync() { /* 相同逻辑 */ }
   
   // 修复:复用异步方法
   public bool Execute()
   {
       return ExecuteAsync(null!).GetAwaiter().GetResult().IsSuccess;
   }
   ```

2. **重复的常量**
   ```csharp
   // 问题:多处硬编码
   if (count > 100) { }
   
   // 修复:使用常量
   private const int MaxItemCount = 100;
   if (count > MaxItemCount) { }
   ```

---

### 第 4 轮:设计模式检查
**目标:** 检查设计模式和架构原则

**检查清单:**
- [ ] 单一职责原则(SRP)
- [ ] 开闭原则(OCP)
- [ ] 里氏替换原则(LSP)
- [ ] 接口隔离原则(ISP)
- [ ] 依赖倒置原则(DIP)
- [ ] 依赖注入使用
- [ ] 工厂模式、单例模式等正确使用
- [ ] 循环依赖检测

**常见设计问题:**
1. **违反单一职责**
   ```csharp
   // 问题:类职责过多
   public class UserManager
   {
       public void CreateUser() { }
       public void SendEmail() { }  // 不应该在这里
       public void LogActivity() { }  // 不应该在这里
   }
   
   // 修复:分离职责
   public class UserManager { }
   public class EmailService { }
   public class ActivityLogger { }
   ```

2. **魔法数字**
   ```csharp
   // 问题:魔法数字
   axis.Stop(2); // 2 是什么意思?
   
   // 修复:使用枚举
   axis.Stop((int)StopMode.DecelerationStop);
   ```

---

### 第 5 轮:异常处理检查
**目标:** 确保异常处理的一致性和正确性

**检查清单:**
- [ ] 异常类型是否具体
- [ ] 是否捕获了特定异常而非通用Exception
- [ ] 异常消息是否有意义
- [ ] 是否记录了异常信息
- [ ] 是否重新抛出了异常(throw vs throw ex)
- [ ] 资源是否在finally块中释放
- [ ] 是否使用了using语句

**最佳实践:**
```csharp
// 好的异常处理
try
{
    // 业务逻辑
}
catch (FileNotFoundException ex)
{
    _logger.LogError(ex, "配置文件未找到: {Path}", configPath);
    throw; // 重新抛出,保持堆栈
}
catch (OperationCanceledException)
{
    _logger.LogWarning("操作被取消");
    throw; // 让上层处理
}
catch (Exception ex)
{
    _logger.LogError(ex, "操作失败");
    return false;
}
finally
{
    // 清理资源
}
```

---

### 第 6 轮:资源管理检查
**目标:** 检查资源泄漏和内存管理

**检查清单:**
- [ ] IDisposable接口是否正确实现
- [ ] 是否使用了using语句
- [ ] 事件订阅是否有对应的取消订阅
- [ ] 大对象是否及时释放
- [ ] 静态集合是否会导致内存泄漏
- [ ] 定时器是否正确停止和释放
- [ ] 非托管资源是否正确释放

**常见问题:**
```csharp
// 问题:事件未取消订阅导致内存泄漏
public class Plugin
{
    public Plugin()
    {
        SomeService.Instance.OnData += HandleData;
    }
    // 缺少 Dispose 方法取消订阅
}

// 修复:正确实现 IDisposable
public class Plugin : IDisposable
{
    private bool _disposed = false;
   
    public Plugin()
    {
        SomeService.Instance.OnData += HandleData;
    }
   
    public void Dispose()
    {
        if (!_disposed)
        {
            SomeService.Instance.OnData -= HandleData;
            _disposed = true;
        }
        GC.SuppressFinalize(this);
    }
}
```

---

### 第 7 轮:安全检查
**目标:** 识别安全漏洞和风险

**检查清单:**
- [ ] SQL注入检查(禁止字符串拼接SQL)
- [ ] XSS漏洞检查(输出编码)
- [ ] 敏感信息泄露(日志、异常消息)
- [ ] 文件路径遍历检查
- [ ] 反序列化安全
- [ ] 密码和密钥硬编码检查
- [ ] 权限验证检查
- [ ] 输入验证和清理

**危险模式:**
```csharp
// ❌ 危险:SQL注入
string sql = "SELECT * FROM Users WHERE Name = '" + userName + "'";

// ✅ 安全:参数化查询
string sql = "SELECT * FROM Users WHERE Name = @userName";
command.Parameters.AddWithValue("@userName", userName);

// ❌ 危险:日志中记录敏感信息
_logger.LogInformation("用户密码: {Password}", password);

// ✅ 安全:敏感信息脱敏
_logger.LogInformation("用户登录: {UserId}", userId);
```

---

### 第 8 轮:性能优化检查
**目标:** 识别性能瓶颈和优化机会

**检查清单:**
- [ ] 循环中是否有重复计算
- [ ] 字符串拼接是否使用StringBuilder
- [ ] LINQ查询是否重复执行
- [ ] 是否使用了异步IO
- [ ] 集合类型选择是否合理
- [ ] 是否有不必要的装箱拆箱
- [ ] 缓存策略是否合理
- [ ] 异步方法是否正确使用

**常见性能问题:**
```csharp
// ❌ 问题:循环中重复访问属性
for (int i = 0; i < list.Count; i++)  // 每次循环都访问 Count

// ✅ 优化:缓存属性值
for (int i = 0, count = list.Count; i < count; i++)

// ❌ 问题:字符串拼接
string result = "";
foreach (var item in items)
    result += item;  // 创建大量临时对象

// ✅ 优化:使用 StringBuilder
var sb = new StringBuilder();
foreach (var item in items)
    sb.Append(item);

// ❌ 问题:异步方法同步等待
var result = SomeAsyncMethod().Result;  // 可能导致死锁

// ✅ 正确:使用 await
var result = await SomeAsyncMethod();
```

---

### 第 9 轮:架构和可维护性检查
**目标:** 检查整体架构和长期可维护性

**检查清单:**
- [ ] 项目结构是否清晰
- [ ] 命名空间组织是否合理
- [ ] 依赖关系是否清晰
- [ ] 是否有循环依赖
- [ ] 接口定义是否稳定
- [ ] 代码复杂度是否过高
- [ ] 测试覆盖率是否足够
- [ ] 文档是否完整
- [ ] 代码注释质量

**架构检查:**
```csharp
// ❌ 问题:直接依赖具体实现
public class Plugin
{
    private readonly SqlConnection _connection;  // 依赖具体类
}

// ✅ 正确:依赖抽象
public class Plugin
{
    private readonly IDbConnection _connection;  // 依赖接口
   
    public Plugin(IDbConnection connection)  // 构造函数注入
    {
        _connection = connection;
    }
}
```

---

## 审查执行流程

```
开始审查
    │
    ▼
第 1 轮:基础编译检查
    │
    ├── 发现编译错误?
    │       ├── 是 → 修复后重新编译
    │       └── 否 → 继续
    ▼
第 2 轮:语法规范检查
    │
    ├── 发现格式问题?
    │       ├── 是 → 使用dotnet format修复
    │       └── 否 → 继续
    ▼
第 3 轮:代码重复检查
    │
    ├── 发现重复代码?
    │       ├── 是 → 提取公共方法/常量
    │       └── 否 → 继续
    ▼
第 4 轮:设计模式检查
    │
    ├── 发现设计问题?
    │       ├── 是 → 重构代码
    │       └── 否 → 继续
    ▼
第 5 轮:异常处理检查
    │
    ├── 发现异常处理问题?
    │       ├── 是 → 完善异常处理
    │       └── 否 → 继续
    ▼
第 6 轮:资源管理检查
    │
    ├── 发现资源泄漏风险?
    │       ├── 是 → 实现IDisposable/using
    │       └── 否 → 继续
    ▼
第 7 轮:安全检查
    │
    ├── 发现安全漏洞?
    │       ├── 是 → 立即修复(高优先级)
    │       └── 否 → 继续
    ▼
第 8 轮:性能优化检查
    │
    ├── 发现性能问题?
    │       ├── 是 → 优化代码
    │       └── 否 → 继续
    ▼
第 9 轮:架构可维护性检查
    │
    ├── 发现架构问题?
    │       ├── 是 → 记录并规划重构
    │       └── 否 → 继续
    ▼
生成完整审查报告
```

---

## 审查报告模板

```markdown
## 代码审查报告 - [项目/文件]

### 基本信息
- **审查日期:** YYYY-MM-DD
- **审查人:** [姓名]
- **代码作者:** [姓名]
- **文件路径:** [路径]
- **代码行数:** [行数]

### 审查结果汇总
| 轮次 | 检查项 | 状态 | 问题数 | 严重问题 |
|------|--------|------|--------|----------|
| 1 | 基础编译检查 | ✅/❌ | X | X |
| 2 | 语法规范检查 | ✅/⚠️ | X | X |
| 3 | 代码重复检查 | ✅/⚠️ | X | X |
| 4 | 设计模式检查 | ✅/⚠️ | X | X |
| 5 | 异常处理检查 | ✅/⚠️ | X | X |
| 6 | 资源管理检查 | ✅/⚠️ | X | X |
| 7 | 安全检查 | ✅/⚠️ | X | X |
| 8 | 性能优化检查 | ✅/⚠️ | X | X |
| 9 | 架构可维护性检查 | ✅/⚠️ | X | X |

### 详细问题列表

#### 严重问题(必须修复)
1. **[问题类型]** - [问题描述]
   - **位置:** [文件:行号]
   - **影响:** [影响描述]
   - **修复建议:** [具体方案]

#### 警告问题(建议修复)
1. **[问题类型]** - [问题描述]
   - **位置:** [文件:行号]
   - **建议:** [改进建议]

### 代码质量指标
- **可维护性:** [A/B/C/D]
- **可读性:** [A/B/C/D]
- **安全性:** [A/B/C/D]
- **性能:** [A/B/C/D]
- **架构:** [A/B/C/D]
- **测试覆盖率:** [X%]

### 改进建议
1. [建议1]
2. [建议2]
3. [建议3]

### 审查结论
- [ ] 通过 - 可以直接合并
- [ ] 有条件通过 - 修复小问题后可合并
- [ ] 不通过 - 需要重大修改

**备注:** [其他说明]
```

---

## 工具推荐

### 必备工具
1. **编译检查:** `dotnet build`
2. **代码格式化:** `dotnet format`
3. **代码分析:** `dotnet analyze`
4. **单元测试:** `dotnet test`

### 高级工具
1. **SonarQube** - 全面的代码质量和安全分析
2. **NDepend** - 架构和依赖分析
3. **Coverlet** - 代码覆盖率分析
4. **BenchmarkDotNet** - 性能基准测试
5. **Security Code Scan** - 安全漏洞扫描

### IDE 扩展
1. **Roslynator** - 代码分析和重构
2. **SonarLint** - 实时代码质量检查
3. **ReSharper** - 全面的代码分析工具

---

## 总结

通过9轮由浅入深的代码审查,可以系统地识别和修复代码中的问题,确保代码在功能正确性、设计合理性、安全性、性能和可维护性等方面都达到高标准。

**核心原则:**
1. **从基础到高级** - 先确保代码能编译运行,再检查设计和架构
2. **安全至上** - 安全漏洞必须零容忍
3. **性能敏感** - 关注性能瓶颈和资源管理
4. **可维护性** - 代码是写给人看的,顺便给机器执行
5. **持续改进** - 代码审查是持续的过程,不是一次性的任务
posted @ 2026-02-11 23:33  专注视觉  阅读(3)  评论(0)    收藏  举报