JavaScript中的代码审查:检查什么以及如何为初学者提供反馈
\n\nCode review(或代码审查)是指代码在合并到项目主分支之前,由一个或多个开发人员检查软件代码的过程。对于新手来说,这个过程常常令人望而生畏:“万一我漏掉了bug怎么办?”,“如何告诉同事他的代码不好,而又不破坏关系?”
\n\n在本文中,我们将探讨在JavaScript(包括Node.js)代码审查中需要注意什么,以及如何提供有用而非冒犯性的反馈。本文面向刚开始参与代码审查的初级开发人员。
\n\n在JavaScript代码中检查什么:面向初学者的检查清单
\n\n为了使审查结构化,我们将检查分为几个关键部分。不要试图一下子涵盖所有内容——从最关键的项目开始。
\n\n1. 功能和逻辑
\n首先,确保代码解决了既定任务。如果可能,在本地运行它,或者在脑海中遍历所有执行分支。以下是典型问题:
\n- \n
- 是否正确处理了边界情况(空数组、
null、undefined)? \n - 是否存在“魔法数字”(没有解释的数字,例如
if (x > 86400)而不是const ONE_DAY_IN_SECONDS = 86400)? \n - 异步代码(Promise、async/await)是否正常工作? \n
// 不好:魔法数字\nif (user.lastLogin < Date.now() - 86400000) { ... }\n\n// 好:有名称的常量\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\nif (user.lastLogin < Date.now() - ONE_DAY_MS) { ... }\n\n2. 代码风格和格式
\n尽管许多项目使用Prettier和ESLint,但手动检查以下内容仍然值得:
\n- \n
- 遵循统一的风格(缩进、引号、分号)。 \n
- 变量、函数和类的正确命名(变量使用camelCase,类使用PascalCase)。 \n
- 没有注释掉的代码——它只会弄乱文件。 \n
// 不好:信息量不足的名称\nconst d = new Date();\nconst arr = getData(d);\n\n// 好:名称描述了本质\nconst currentDate = new Date();\nconst usersData = fetchUsersData(currentDate);\n\n3. 性能和安全性
\n对于Node.js,以下几点尤其重要:
\n- \n
- 避免在主线程中执行阻塞操作(同步读取文件、繁重循环)。 \n
- 检查内存泄漏(例如,被遗忘的定时器或事件监听器)。 \n
- 验证用户输入(防止SQL注入、XSS)。 \n
// 不好:同步读取会阻塞事件循环\nconst data = fs.readFileSync('bigfile.json', 'utf8');\n\n// 好:异步读取\nconst data = await fs.promises.readFile('bigfile.json', 'utf8');\n\n如何提供反馈:建设性审查的原则
\n\n现在您知道了要检查什么,我们来分析一下代码审查的主要技能——传达意见的能力。您的目标是改进代码,而不是通过贬低作者来证明自己。
\n\n1. 具体且有论据
\n不要写“这段代码不好”,而要写:“这里存在潜在的性能问题:在循环中调用 Array.find() 会导致 O(n²) 的复杂度。我们把它换成 Map 吧”。作者会明白具体哪里不对以及如何修复。
2. 使用“我”句式并提出问题
\n像“我不确定这段代码能否处理空数组的情况。我们可以添加一个检查吗?”这样的措辞比“你忘了处理空数组”听起来更柔和。这可以降低防御性反应并促进对话。
\n\n3. 表扬好的解决方案
\n代码审查不仅仅是批评。如果您看到优雅的解决方案或出色的架构,一定要指出来。例如:“将