睡眠不足的资深测试:为什么我讨厌你的‘Magic Numbers’
Source: Dev.to

现在是凌晨 3:14。
你的手机在床头柜上嗡嗡作响。值班警报在尖叫,生产服务器着火了。
你踉跄地起床,打开笔记本电脑,单眼半睁地盯着屏幕。你昏昏沉沉,惊慌失措。你根本没有在想 Big O 表示法或 C++ 的历史。你只想止血,然后继续睡觉。
你打开导致崩溃的文件,看到下面的代码:
if (user.status === 2 && (now - user.ts) > 86400) {
terminate(user);
}
你只有三秒钟的时间来弄清这段代码的作用。
2是什么?错误码?管理员等级?被暂停的账户?86400是什么?缓冲区大小?内存限制?毫秒级超时?
因为你使用了原始数字,我现在必须向上滚动 50 行或在另外三个文件中搜索,才能理解你的逻辑。
这就是 睡眠不足的高级测试。而你已经不及格。
魔法数字是“上下文吸血鬼”
在业界,我们把这些原始值称为 魔法数字。它们很危险。
魔法数字是出现在逻辑中间、没有解释的原始值。我把它们称为 上下文吸血鬼,因为它们把代码的意义吸走了。
作为新人,你可能会想,“我知道 86400 是什么。它是一天的秒数,显而易见。”
这并不显而易见。 在凌晨 3 点更不是。对新入职的同事也不是。甚至对 六个月后的你 也不是。
当你写代码时,你是在为两个受众写:
- 计算机: 它不在乎。它喜欢数字。
- 人类: 我们数学不好,需要上下文。
你的工作不是让数学运算正确,而是让 意图 清晰。
代码:把谜题变成句子
前——神秘盒子
// Why 86400? Why 2?
// The developer has to do math in their head while the server burns.
if (user.status === 2 && (now - user.ts) > 86400) {
terminate(user);
}
后——专业的新人
const STATUS_SUSPENDED = 2;
const SECONDS_IN_DAY = 86400;
const isSuspended = user.status === STATUS_SUSPENDED;
const isExpired = (now - user.timestamp) > SECONDS_IN_DAY;
// Now we read the INTENT, not the math.
if (isSuspended && isExpired) {
terminateAccount(user);
}
专业做法
在第一个例子里,我必须解码矩阵。
在第二个例子里,我在阅读一句话:
如果用户被暂停且时间已过期,则终止账户。
编译器为两个代码片段生成的二进制完全相同,但第二个片段可以防止 bug,节省时间,最重要的是让你的高级开发者更快回到睡眠。
别做吸血鬼。给你的常量命名。
不要仅仅为了取悦编译器而写代码。
本文摘自我的手册 《专业新人:编写有意义的代码》。它是一本关于未成文工程规则的实战指南。
👉 获取完整手册