用常量替代魔法数字,是将无名数字转为具业务含义的命名,降低理解、修改、测试成本;需集中定义、明确命名、按领域分组,并配合类型系统与封装提升安全性。

用常量替代魔法数字,核心是把“没名字的数字”变成“有业务含义的名字”,让代码自己说话。这不是格式美化,而是降低后续所有人理解、修改、测试的成本。
明确命名,直接表达业务意图
魔法数字(如 if (status === 2))不说明 2 是“审核中”还是“已退款”。换成常量后,意图一目了然:
-
const ORDER_STATUS_PENDING = 2;—— 状态值和语义绑定 -
if (order.status === ORDER_STATUS_PENDING) { ... }—— 不用查文档也能懂 - 命名避免模糊缩写:用
MAX_RETRY_ATTEMPTS而不是RETRY_COUNT,用DEFAULT_TIMEOUT_MS而不是TIMOUT
集中定义,一处修改,全局生效
当业务规则变化(比如重试次数从 3 改为 5),硬编码需全项目搜索替换,极易遗漏;而常量只需改定义处:
- 在统一模块(如
src/constants/status.js)中导出状态对象或枚举式常量 - 多个文件导入使用:
import { ORDER_STATUS_PENDING } from '@/constants/status' - 避免把所有常量塞进一个
GlobalConstants.js—— 按领域分组(状态、错误码、配置默认值),便于定位和维护
配合类型与结构,防止误用
纯数字常量仍可能被错赋值(比如把订单状态传给用户权限字段)。进一步提升安全性:
- 用
Object.freeze封装状态映射对象,防止运行时篡改 - 在 TypeScript 中优先用
enum或const enum,获得编译期检查和 IDE 自动补全 - 对多值组合场景(如权限位),用带方法的对象封装:
Status.isPending(status)比status === 2更健壮
区分哪些该提,哪些可保留
不是所有数字都要套常量。聚焦真正影响维护性的高风险项:
- 必须提取:HTTP 状态码(
401→UNAUTHORIZED)、业务状态码(1/2/3)、协议约定值("application/json")、税率、分页大小、超时毫秒数 - 可暂不提:循环边界(
for (let i = 0; i )、简单比较阈值(<code>if (score > 90)),只要未复用、无歧义、不跨上下文 - 字符串魔法值同样适用:把
"success"替换为RESPONSE_CODE.SUCCESS,避免拼写错误和语义漂移
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











