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

发布: (2025年12月11日 GMT+8 19:49)
4 min read
原文: Dev.to

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,节省时间,最重要的是让你的高级开发者更快回到睡眠。

别做吸血鬼。给你的常量命名。
不要仅仅为了取悦编译器而写代码。


本文摘自我的手册 《专业新人:编写有意义的代码》。它是一本关于未成文工程规则的实战指南。

👉 获取完整手册

Back to Blog

相关文章

阅读更多 »

真心弃用

请提供您希望翻译的具体摘录或摘要文本,我才能为您进行简体中文翻译。

为什么要使用设计模式?

重要的是要理解,Design Patterns 从来不是为了被随意拼凑的捷径,也不是以草率的“一刀切”方式应用于……