系统化代码审查模式,涵盖安全性、性能、可维护性、正确性与测试,附带严重等级和结构化反馈指导
代码检讨检查列表 : 深思熟虑, 结构化的代码检讨方法
功能概述
代码检讨检查列表 : 深思熟虑, 结构化的代码检讨方法是一项面向实际任务的技能,主要用于系统化地通过每个维度而不是随机扫描;OpenClaw / Moltbot / Clawbot.;
核心要点
- Review Viments.。
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
使用与执行
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
结果检查与注意事项
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
代码审查清单
采用全面、结构化的方式审查代码。请系统性地逐项检查每个维度,而非随机浏览。
安装
OpenClaw / Moltbot / Clawbot
npx clawhub@latest install code-review
审查维度
| 维度 | 关注点 | 优先级 |
|---|---|---|
| Security | 漏洞、认证、数据泄露风险 | Critical |
| Performance | 响应速度、内存使用、可扩展性瓶颈 | High |
| Correctness | 逻辑错误、边界情况、数据完整性 | High |
| Maintainability | 可读性、代码结构、面向未来的设计 | Medium |
| Testing | 测试覆盖率、测试质量、可靠性 | Medium |
| Accessibility | WCAG 合规性、键盘导航支持、屏幕阅读器兼容性 | Medium |
| Documentation | 注释、API 文档、变更日志条目 | Low |
安全审查清单
对每一处变更均需检查以下安全漏洞:
- SQL 注入 — 所有数据库查询均使用参数化语句或 ORM;禁止将用户输入直接拼接到 SQL 字符串中
- XSS — 用户提供的内容在渲染前必须进行转义或净化;如使用
dangerouslySetInnerHTML或其等效机制,须有充分理由且确保安全 - CSRF 防护 — 状态变更类请求必须携带有效的 CSRF Token;Cookie 的 SameSite 属性已正确设置
- 认证(Authentication) — 每个受保护的端点在处理请求前,必须验证用户是否已通过身份认证
- 授权(Authorization) — 对资源的访问必须严格限制在当前请求用户的权限范围内;杜绝 IDOR 类漏洞
- 输入校验 — 所有来自外部的输入(URL 参数、Header、请求体、文件上传等)均需在服务端进行类型、长度、格式及取值范围校验
- 密钥管理(Secrets Management) — 源码中不得硬编码 API Key、密码、Token 或其他凭证;所有密钥应通过环境变量或密钥管理服务(Vault)注入
- 依赖安全性 — 新增依赖必须来自可信源、处于活跃维护状态,且无已知 CVE 漏洞
- 敏感数据处理 — PII(个人身份信息)、Token、密钥等不得记录到日志、不得出现在错误消息中、不得返回至 API 响应体
- 速率限制(Rate Limiting) — 公共接口与认证接口均需配置合理速率限制,防止暴力破解与滥用
- 文件上传安全 — 上传文件须校验类型与大小,存储路径须位于 Web 根目录之外,并以安全的 Content-Type 头提供服务
- HTTP 安全响应头 — 已正确配置 Content-Security-Policy、X-Content-Type-Options、Strict-Transport-Security 等安全头
性能审查清单
- N+1 查询 — 数据库访问模式已优化为批量查询或 JOIN;避免在循环中逐条发起查询
- 非必要重渲染 — 组件仅在其相关状态或属性变更时才触发重渲染;对可测量收益的场景应用 memoization
- 内存泄漏 — 事件监听器、订阅、定时器与周期任务均在组件卸载或资源销毁时被正确清理
- 构建包体积 — 新增依赖支持 Tree-shaking;大型库采用动态加载;禁止仅为单个函数而引入整库
- 懒加载(Lazy Loading) — 计算密集型组件、路由及首屏以下内容均已启用懒加载 / 代码分割
- 缓存策略 — 开销较大的计算结果与 API 响应均已配置合适的缓存机制(如 memoization、HTTP 缓存头、Redis)
- 数据库索引 — 查询中涉及过滤与排序的字段均已建立索引;新增查询已通过 EXPLAIN 进行验证
- 分页机制 — 列表类端点与查询均已启用分页或游标式分页;禁止无限制的 SELECT *
- 异步操作 — 耗时较长的任务已交由后台作业或队列处理,避免阻塞请求线程
- 图片与静态资源优化 — 图片尺寸适配、采用现代格式(WebP/AVIF),并依托 CDN 分发
正确性审查清单
- 边界情况(Edge Cases) — 已处理空数组、空字符串、零值、负数及最大值等场景
- 空值处理(Null/Undefined Handling) — 对可能为空的值访问前均已做显式检查;通过可选链(Optional Chaining)或防护条件(Guard Clause)避免运行时错误
- 差一错误(Off-by-One Errors) — 循环边界、数组切片、分页偏移量及范围计算均已验证
- 竞态条件(Race Conditions) — 对共享状态的并发访问已通过锁、事务或原子操作保障一致性
- 时区处理(Timezone Handling) — 时间戳统一以 UTC 存储;展示层负责时区转换
- Unicode 与编码(Unicode & Encoding) — 字符串操作兼容多字节字符;文本编码明确指定为 UTF-8
- 整数溢出 / 精度问题(Integer Overflow / Precision) — 大数运算或货币计算已选用合适类型(如 BigInt、Decimal)
- 错误传播(Error Propagation) — 异步调用及外部服务抛出的错误已被捕获并妥善处理;Promise 不会被静默吞没
- 状态一致性(State Consistency) — 多步状态变更具备事务性;部分失败后系统仍保持有效状态
- 边界值校验(Boundary Validation) — 已对合法取值范围的边界值(最小值、最大值、恰好等于阈值)进行测试
可维护性审查清单
- 命名清晰性(Naming Clarity) — 变量、函数与类名具有描述性,能直观体现其设计意图
- 单一职责(Single Responsibility) — 每个函数 / 类 / 模块仅承担一项职责;单一关注点的修改不会波及无关代码
- DRY 原则 — 重复逻辑已提取为通用工具;复制粘贴的代码块已合并
- 圈复杂度(Cyclomatic Complexity) — 函数分支逻辑简洁;深度嵌套结构已重构
- 错误处理(Error Handling) — 错误在恰当边界被捕获,附带上下文记录,并以有意义的方式向上暴露
- 废弃代码清理(Dead Code Removal) — 已移除注释掉的代码、未使用的导入、不可达分支及过时的功能开关
- 魔法数字与字符串(Magic Numbers & Strings) — 字面量值已提取为具语义的命名常量
- 风格一致性(Consistent Patterns) — 新增代码严格遵循现有代码库约定
- 函数长度(Function Length) — 函数足够简短,可一目了然;过长函数已拆解
- 依赖方向(Dependency Direction) — 依赖关系指向内层(如 infrastructure → domain);核心业务逻辑不反向依赖 UI 或框架层
测试审查清单
- 测试覆盖率(Test Coverage) — 新增逻辑路径均有对应测试;关键路径同时覆盖正常流程与异常场景
- 边界情况测试(Edge Case Tests) — 测试覆盖边界值、空输入、null 值及错误条件
- 非脆弱测试(No Flaky Tests) — 测试确定性强;不依赖时间、外部服务或共享可变状态
- 测试独立性(Test Independence) — 每个测试独立构建并销毁自身状态;测试执行顺序不影响结果
- 有意义的断言(Meaningful Assertions) — 断言聚焦于行为与结果,而非实现细节
- 测试可读性(Test Readability) — 测试遵循 Arrange-Act-Assert 模式;测试名称准确描述场景与预期结果
- 模拟规范性(Mocking Discipline) — 仅对外部边界(网络、数据库、文件系统)进行模拟
- 回归测试(Regression Tests) — Bug 修复必须包含复现原问题并验证已解决的测试用例
审查流程
分三轮通读代码,切勿试图一次完成全部审查。
| 轮次 | 关注点 | 耗时 | 重点检查项 |
|---|---|---|---|
| 第一轮 | 高层结构 | 2–5 分钟 | 架构适配性、文件组织、API 设计、整体方案合理性 |
| 第二轮 | 逐行细节 | 主要耗时 | 逻辑错误、安全问题、性能缺陷、边界情况 |
| 第三轮 | 边界情况与加固 | 5 分钟 | 故障模式、并发问题、边界值、缺失测试 |
第一轮(2–5 分钟)
- 通读 PR 描述及关联 Issue
- 浏览变更文件列表 —— 变更范围是否合理?
- 评估整体方案 —— 这是否是解决该问题的恰当方式?
- 确认变更未导致架构漂移(Architectural Drift)
第二轮(审查主要耗时)
- 自上而下逐行阅读每个文件 Diff
- 对照上述各清单逐项核查每个函数变更
- 验证所有 I/O 边界处的错误处理逻辑
- 对任何引发疑虑的内容及时标记 —— 信任你的直觉
第三轮(5 分钟)
- 思考该代码在生产环境中可能发生的故障场景
- 检查此前标记路径是否补充了相应测试
- 验证回滚安全性 —— 此变更能否在不丢失数据的前提下安全回退?
- 确认文档与变更日志(Changelog)是否按需更新
严重程度分级
为每条评论标注严重程度,便于作者快速识别哪些问题会阻断合并。
| 等级 | 标签 | 含义 | 是否阻断合并? |
|---|---|---|---|
| Critical | [CRITICAL] |
存在安全漏洞、数据丢失风险或导致生产环境崩溃 | 是 |
| Major | [MAJOR] |
存在 Bug、逻辑错误或显著性能退化 | 是 |
| Minor | [MINOR] |
有助于降低未来维护成本的改进建议 | 否 |
| Nitpick | [NIT] |
风格偏好、命名建议或微小清理项 | 否 |
务必在每条评论开头添加严重程度标签,消除理解歧义。
反馈撰写规范
基本原则
- 具体明确 — 指出确切行号,并解释问题本质,而非简单断言“此处有误”
- 阐明原因 — 说明潜在风险或后果,而非仅复述规则
- 提供方案 — 尽可能给出具体修改建议或可运行的代码片段
- 以问代令 — 对主观判断点使用提问语气:“您觉得……如何?”
- 肯定亮点 — 明确指出简洁的实现、巧妙的优化或完备的测试
- 区分阻断与非阻断项 — 使用严重程度标签帮助作者快速识别优先级
示例评论
反面示例:
此处有误,请修正。
正面示例:
[MAJOR]此查询将用户输入直接拼接进 SQL 字符串(第 42 行),存在 SQL 注入风险。建议改用参数化查询:SELECT * FROM users WHERE id = $1
反面示例:
为何未补充测试?
正面示例:
[MINOR]新增的calculateDiscount()函数包含多个分支路径,建议补充零数量与负价格等边界情况的测试用例,以防回归。
反面示例:
我会用不同方式实现。
正面示例:
[NIT]当前实现效果良好。另一种思路是将重试逻辑抽离为共享的withRetry()封装器 —— 此为可选优化,可后续跟进。
审查反模式
避免以下常见误区,以免浪费时间并损害团队信任:
| 反模式 | 说明 |
|---|---|
| 走形式审批(Rubber-Stamping) | 未经审阅即批准。制造虚假信心,导致缺陷流入生产环境。 |
| 伪优先级争论(Bikeshedding) | 花费 30 分钟争论变量命名,却忽视一个潜在竞态条件。 |
| 因风格阻断(Blocking on Style) | 拒绝批准仅因格式问题 —— 此类问题应由 Linter 自动强制执行。 |
| 过度管控(Gatekeeping) | 强行要求采用个人偏好的实现方式,而提交方案本身完全正确。 |
| 路过式审查(Drive-by Reviews) | 仅留下一条模糊评论便不再跟进。请承诺全程参与闭环。 |
| 范围蔓延审查(Scope Creep Reviews) | 提出与当前 PR 无关的重构需求,此类工作应拆分为独立 PR。 |
| 滞留式审查(Stale Reviews) | 任由 PR 悬置数日。应在 24 小时内完成审查,或主动移交他人。 |
| 情绪化表达(Emotional Language) | 使用“这很糟糕”或“明显错误”等表述。请批评代码,而非开发者本人。 |
绝对禁止事项
- 绝对禁止未逐行审阅即批准 —— 走形式审批比不审查危害更大
- 绝对禁止仅因风格偏好阻断 PR —— 交由 Linter 自动约束;人工审查聚焦逻辑正确性
- 绝对禁止未标注严重程度的反馈 —— 模糊性将导致无效返工
- 绝对禁止未说明原因即要求修改 —— “请修复此处”无法传递任何知识
- 绝对禁止单次审查超过 400 行 —— 理解力急剧下降;大 PR 应拆分为多次审查
- 绝对禁止跳过安全审查清单 —— 一个遗漏的漏洞,其危害远超百条风格建议
- 绝对禁止人身攻击 —— 审查对象是代码,不是开发者;请始终假定对方善意
热门AI工具
相关专题
Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。
0
2026.10.28
Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。
0
2026.10.28
Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。
0
2026.10.28
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.6万人学习
共6课时 | 54.7万人学习
最新文章