Skip to content

14 comprehensive checklist

omeyang edited this page Sep 16, 2026 · 1 revision

综合检查清单

本文档整合所有代码质量标准的检查清单,用于代码提交前自查和 Code Review。


快速检查(必须通过)

提交前必须执行以下检查:

golangci-lint run ./...          # 静态分析
gocyclo -over 10 internal/       # 复杂度
go test ./... -cover             # 测试覆盖率

必须全部通过,否则禁止提交。


分层检查清单

1. 质量意识检查

态度检查

  • 必须追求"优秀"而非"能跑"
  • 应该质疑不合理的现有代码
  • 必须考虑长期可维护性
  • 应该从业务角度抽象,避免技术绑架
  • 禁止以"原来就这样"为由拒绝改进

质量检查

  • 正确性:测试覆盖率不低于 90%(核心业务不低于 95%)
  • 可维护性:函数不超过 70 行,复杂度不超过 10
  • 健壮性:错误处理完善
  • 性能:P99 不超过 100ms
  • 可观测性:日志、监控完善

设计平衡检查

  • 禁止过度设计(抽象需 2 种及以上实现)
  • 不应该过度追求性能(牺牲可读性)
  • 禁止过度 Mock(业务逻辑不 Mock)

2. 测试标准检查

TDD 流程检查

  • 应该遵循 TDD 流程(红 -> 绿 -> 重构)
  • 应该测试先于实现编写
  • 必须每个测试验证一个明确的行为

覆盖率检查

  • 核心业务逻辑不低于 95%
  • API 层不低于 90%
  • 整体代码不低于 90%
  • 边界条件必须有覆盖

Mock 策略检查

  • 应该 Mock 外部依赖(数据库、HTTP、消息队列)
  • 禁止 Mock 核心业务逻辑
  • 禁止 Mock 简单结构体
  • 应该验证 Mock 调用次数

3. 接口与抽象检查

接口设计检查

  • 接口必须小而专注(单一职责)
  • 应该优先使用单方法接口
  • 接口命名禁止包含包名
  • 接口应该按职责拆分

抽象时机检查

  • 必须有 2 种及以上实现时才抽象
  • 禁止为了抽象而抽象
  • 必须遵循 YAGNI 原则

抽象层次检查

  • 同一函数抽象层次必须一致
  • 禁止抽象泄漏
  • 接口禁止暴露实现细节

4. 代码健壮性检查

错误处理检查

  • 所有错误必须处理(禁止用 _ 忽略)
  • 必须使用 %w 包装错误
  • 错误应该携带足够上下文
  • 必须使用 errors.Is 和 errors.As 判断错误

边界条件检查

  • 必须检查 nil
  • 必须检查空字符串
  • 必须检查空切片
  • 必须检查数值边界
  • 必须检查索引越界

输入验证检查

  • API 层必须验证参数
  • Service 层应该验证业务规则
  • 禁止信任外部输入

并发安全检查

  • 必须保护共享状态
  • 必须使用 -race 检测数据竞争
  • 必须安全使用 channel

安全编码检查

  • 必须防止 SQL/NoSQL 注入
  • 必须防止命令注入
  • 禁止在日志中记录敏感信息
  • 应该使用加密存储密码

5. 函数设计检查

职责检查

  • 函数能用一句话(无"并且")描述功能
  • 函数体内操作处于同一抽象层次
  • 函数不超过 70 行,应该不超过 40 行
  • 嵌套深度不超过 3 层

参数与返回值检查

  • 参数不超过 3 个(不含 ctx),超过用结构体
  • 参数顺序:ctx → 主输入 → 选项
  • 无裸布尔参数
  • 无输出参数(out parameter)
  • 返回值不超过 3 个,error 在最后

设计原则检查

  • 命令函数和查询函数分离(CQS)
  • 纯计算逻辑无副作用
  • 使用 Guard Clause 提前返回
  • 副作用集中在函数末尾

6. 封装与信息隐藏检查

导出决策检查

  • 所有导出的标识符都有明确的外部使用者
  • 没有"以防万一"的导出
  • 有约束的字段不导出

结构体设计检查

  • 有约束的类型提供了构造函数
  • 构造函数校验了参数合法性
  • DTO/配置结构体可以导出字段

包 API 面积检查

  • 导出函数/方法不超过 15 个
  • 导出类型不超过 5 个
  • 使用 internal/ 隐藏实现包
  • 没有导出的全局可变状态

7. 内聚耦合检查

可扩展性检查

  • 新增功能不应该修改现有代码
  • 应该使用策略模式替代 if-else

耦合度检查

  • 必须依赖接口而非实现
  • 禁止使用全局变量
  • 禁止硬编码依赖
  • 应该使用依赖注入
  • 单包 Fan-out 不超过 5
  • 无控制耦合(不传递控制标志)

内聚度检查

  • 模块职责必须单一
  • 模块内功能必须高度相关
  • 禁止有 "工具类"、"通用类"
  • 应该按功能分包,而非技术分包
  • 包内聚度通过删除法/命名法验证

边界设计检查

  • 系统边界做了输入验证和协议转换
  • 系统边界不包含业务逻辑
  • 不同层使用不同数据模型(必要时)
  • 分层验证(API 格式 → Service 业务 → Model 数据)
  • 外部系统通过防腐层隔离

依赖方向检查

  • 依赖方向必须清晰(上层依赖下层)
  • 禁止循环依赖
  • 核心业务禁止依赖基础设施细节
  • 接口定义在使用方,而非实现方

8. 可观测性检查

可测试性检查

  • 依赖必须可注入
  • 函数职责必须单一
  • 禁止使用全局状态
  • 时间应该可控(注入 TimeProvider)

日志与监控检查

  • 关键路径必须有日志(入口、出口、错误)
  • 必须使用结构化日志
  • 应该暴露监控指标(/metrics)
  • 应该支持分布式追踪

可读性检查

  • 命名必须见名知义
  • 函数应该不超过 70 行
  • 参数应该不超过 3 个
  • 嵌套应该不超过 3 层
  • 代码风格必须一致

9. 性能检查

性能意识检查

  • 必须避免 N+1 查询
  • 应该避免重复计算
  • 应该避免不必要的内存分配
  • 数据库查询应该有索引
  • 应该批量操作替代逐个操作

缓存检查

  • 热点数据应该有缓存
  • 缓存必须有过期时间
  • 应该避免缓存雪崩

并发检查

  • 应该使用 Goroutine 池限制并发
  • Goroutine 必须有生命周期管理
  • 禁止 Goroutine 泄漏

10. 质量门禁检查

静态分析检查

  • golangci-lint run ./... 必须无错误
  • 禁止有未处理的错误
  • 禁止有未使用的变量/函数
  • 禁止有安全问题

复杂度检查

  • 圈复杂度必须不超过 10(核心业务)
  • 函数长度应该不超过 70 行
  • 单文件长度必须不超过 800 行

测试检查

  • 单元测试覆盖率必须不低于 90%
  • 所有测试必须通过
  • 禁止有 flaky 测试

安全检查

  • govulncheck ./... 必须无漏洞
  • 禁止有硬编码密码
  • 输入验证必须完善

命令速查表

代码质量检查

# 格式化
gofmt -w .
goimports -w .

# 静态分析
golangci-lint run ./...

# 复杂度
gocyclo -over 10 internal/

# 测试
go test ./... -v
go test ./... -cover
go test ./... -race

# 性能测试
go test -bench=. -benchmem ./...

# 安全检查
govulncheck ./...

快速修复

# 自动格式化
gofmt -w .

# 自动修复 lint 问题
golangci-lint run --fix ./...

# 自动添加/删除 import
goimports -w .

Code Review 检查表

功能检查

  • 功能符合需求
  • 边界条件处理正确
  • 错误处理完善
  • 有单元测试覆盖

设计检查

  • 接口设计合理
  • 抽象层次一致
  • 没有过度设计
  • 耦合度低,内聚度高

质量检查

  • 代码清晰易读
  • 命名见名知义
  • 没有魔法数字
  • golangci-lint 通过
  • 测试覆盖率达标

安全检查

  • 输入验证完善
  • 无注入风险
  • 敏感数据加密
  • 无硬编码密码/密钥

性能检查

  • 无明显性能问题
  • 数据库查询有索引
  • 批量操作优化
  • 无内存泄漏

可观测性检查

  • 关键操作有日志
  • 日志携带足够上下文
  • 有监控指标

提交前最后确认

必须完成

  • 代码已自测通过
  • 单元测试覆盖率不低于 90%
  • golangci-lint run ./... 无错误
  • gocyclo -over 10 无输出
  • 提交信息清晰
  • 关联 Issue/任务单号

应该完成

  • 性能测试通过
  • 安全扫描通过
  • 文档已更新
  • 自己先 Review 一遍代码

禁止行为

  • 禁止提交未格式化的代码
  • 禁止提交有 lint 错误的代码
  • 禁止提交未测试的代码
  • 禁止提交复杂度过高的代码
  • 禁止跳过 CI/CD 检查

参考资料

Clone this wiki locally