15-代码规范与代码审查

代码规范与代码审查

从个人习惯到团队协作:建立可落地的代码规范体系与高效的代码审查流程


学习目标

读完本文,你将学会:

  • 制定适合团队的代码规范(命名、注释、文件组织)
  • 掌握代码审查的最佳实践和检查清单
  • 使用 Git Hooks 自动化规范检查
  • 理解 Commit Message 规范与版本管理

一、代码规范体系

1.1 命名规范

// ✅ 清晰、一致的命名// 常量: SCREAMING_SNAKE_CASEconstMAX_RETRY_COUNT=3;constAPI_BASE_URL='https://api.example.com';// 变量/函数: camelCaseletuserCount=0;functionfetchUserData(userId){}// 类/构造函数: PascalCaseclassUserManager{}classHttpRequestErrorextendsError{}// 私有属性: 下划线前缀 或 #privateFieldclassBankAccount{#balance=0;// 真正私有(推荐)_internalCache={};// 约定私有}// 布尔值: 使用 is/has/should/can 前缀constisLoading=true;consthasPermission=false;constshouldRetry=true;// 文件命名// components/UserProfile.jsx// utils/dateHelpers.js// constants/apiEndpoints.js

1.2 注释规范

/** * 计算订单总金额(含税费和运费) * @param {Object} order - 订单对象 * @param {number} order.subtotal - 小计金额 * @param {number} order.taxRate - 税率(如 0.08) * @param {number} order.shipping - 运费 * @returns {number} 总金额(保留两位小数) * @throws {Error} 当 subtotal 为负数时抛出 * @example * calculateTotal({ subtotal: 100, taxRate: 0.08, shipping: 10 }) * // => 118.00 */functioncalculateTotal(order){if(order.subtotal<0){thrownewError('subtotal cannot be negative');}consttax=order.subtotal*order.taxRate;returnNumber((order.subtotal+tax+order.shipping).toFixed(2));}// 行内注释:解释"为什么",而非"做什么"// ❌ 错误:重复代码显而易见的含义letcount=0;// 初始化计数器为 0// ✅ 正确:解释业务原因letcount=0;// 从 0 开始,API 要求分页参数从 0 起算

1.3 文件组织规范

src/ ├── assets/ # 静态资源(图片、字体) │ ├── images/ │ └── fonts/ ├── components/ # 通用组件 │ ├── Button/ │ │ ├── index.jsx │ │ ├── Button.test.jsx │ │ └── Button.module.css │ └── Input/ ├── pages/ # 页面级组件 │ ├── Home/ │ └── About/ ├── hooks/ # 自定义 Hooks ├── utils/ # 工具函数 │ ├── date.js │ ├── validate.js │ └── request.js ├── constants/ # 常量 │ ├── api.js │ └── config.js ├── services/ # API 服务层 └── styles/ # 全局样式 ├── variables.css └── global.css

二、代码审查(Code Review)

2.1 审查清单

## 代码审查检查清单 ### 功能正确性 - [ ] 代码是否实现了需求? - [ ] 边界条件是否处理? - [ ] 错误处理是否完善? ### 代码质量 - [ ] 命名是否清晰、一致? - [ ] 函数是否过长(>50 行需拆分)? - [ ] 是否避免了重复代码? - [ ] 是否有不必要的复杂度? ### 安全性 - [ ] 是否有 SQL/XSS 注入风险? - [ ] 敏感数据是否安全处理? - [ ] 权限检查是否到位? ### 性能 - [ ] 是否有明显的性能问题? - [ ] 循环中是否有不必要的操作? - [ ] 大数据量处理是否合理? ### 测试 - [ ] 是否有对应的单元测试? - [ ] 测试是否覆盖主要路径? - [ ] 测试用例名称是否清晰?

2.2 审查原则

1. 对事不对人 ❌ "你这里写错了" ✅ "这个变量名可能会让人误解,建议改为..." 2. 解释为什么 ❌ "不要这样写" ✅ "这里如果用户传入 null 会抛异常,建议添加默认值" 3. 区分严重级别 🔴 Blocker: 必须修复(安全问题、功能错误) 🟡 Warning: 建议修复(代码异味、性能问题) 🟢 Nitpick: 可选修复(格式、命名偏好) 4. 及时响应 - 提交者应在 24h 内响应评论 - 审查者应在收到修改后尽快再次审查

三、Git 工作流与提交规范

3.1 Commit Message 规范(Conventional Commits)

<type>(<scope>): <subject> <body> <footer>

类型说明:

类型含义示例
feat新功能feat(user): 添加用户登录功能
fix修复 bugfix(api): 修复空指针异常
docs文档更新docs(readme): 更新安装说明
style代码格式style: 修复缩进
refactor重构refactor(utils): 提取公共函数
test测试相关test(user): 添加登录单元测试
chore构建/工具chore(deps): 升级 lodash
# 示例feat(auth): 支持 OAuth2.0 登录 - 集成 Google 和 GitHub 登录 - 添加 token 刷新机制 - 更新登录页面 UI Closes#123

3.2 Git Hooks 自动化

# 安装 husky 和 lint-stagednpminstall--save-dev husky lint-staged# 初始化 huskynpx husky init
// package.json{"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix","prettier --write"],"*.{css,scss,json,md}":["prettier --write"]}}
# .husky/pre-commitnpx lint-staged# .husky/commit-msgnpx--no-- commitlint--edit${1}
// commitlint.config.jsmodule.exports={extends:['@commitlint/config-conventional'],rules:{'type-enum':[2,'always',['feat','fix','docs','style','refactor','test','chore']],'subject-full-stop':[0,'never'],'subject-case':[0,'never']}};

四、代码度量与质量控制

4.1 复杂度指标

// 圈复杂度示例functiongetGrade(score){// 圈复杂度: 5if(score>=90)return'A';if(score>=80)return'B';if(score>=70)return'C';if(score>=60)return'D';return'F';}// 使用查找表降低复杂度(圈复杂度: 1)constGRADE_MAP=[{min:90,grade:'A'},{min:80,grade:'B'},{min:70,grade:'C'},{min:60,grade:'D'}];functiongetGrade(score){constentry=GRADE_MAP.find(g=>score>=g.min);returnentry?entry.grade:'F';}

4.2 SonarQube 质量门禁

# sonar-project.propertiessonar.projectKey=my-project sonar.sources=src sonar.tests=src/__tests__ sonar.javascript.lcov.reportPaths=coverage/lcov.info# 质量门禁sonar.qualitygate.wait=true

二、常见误区与注意点

误区正确做法
代码审查是找茬审查是团队协作,共同提升代码质量
规范越多越好规则要可执行、可遵守,适度即可
一次审查提所有问题区分优先级,Blocker 必须修,Nitpick 可协商
Commit Message 随便写规范的提交信息便于生成 CHANGELOG 和回滚
只在提交前检查配置 IDE 实时提示,问题尽早发现

三、动手练习

练习 1:审查一段问题代码

给出一组包含命名不规范、缺少错误处理、重复代码的示例,按检查清单逐项审查。

练习 2:配置完整的前端工程规范

配置 ESLint + Prettier + Husky + Commitlint 的完整工作流。


四、AI 辅助学习

4.1 本节知识点的 AI 提问模板

  • “如何制定适合小团队的代码规范?”
  • “代码审查时如何给出有建设性的反馈?”
  • “Commit Message 规范的完整规则是什么?”

4.2 警惕 AI 的常见错误

  • AI 可能推荐过于严格的规则集,需根据团队规模调整
  • AI 可能混淆不同的 Git 工作流(Git Flow vs GitHub Flow)

五、配套代码

本文示例代码位于:CODE-ADVANCED/15-代码规范与代码审查/

文件名说明
code-review-checklist.md代码审查检查清单模板
commitlint-demo.jsCommit Message 规范验证示例
husky-setup.shHusky + lint-staged 配置脚本

六、本章小结

  • 代码规范包括命名、注释、文件组织三个层面
  • 代码审查应以协作态度进行,区分问题优先级
  • Conventional Commits 规范便于自动化版本管理和 CHANGELOG 生成
  • Git Hooks 实现提交前自动化检查,防止问题代码入库

如果本文对你有帮助,欢迎点赞、收藏、关注专栏。有任何问题可以在评论区交流!