首页/开发/代码质量与评审速查/坏味道:神秘命名(Mysterious Name)
重构手法62 条

坏味道:神秘命名(Mysterious Name)

命名没表达意图时先换名:函数、变量、类、模块的名字应说明它做什么或是什么;命名卡壳常意味着职责划分有问题,改名的过程往往揭示设计。

神秘命名是什么

神秘命名(Mysterious Name)指名字看不出用途:函数、变量、类、模块的名字没有说明它做什么或是什么,读代码必须先跳到实现才能理解。命名卡壳往往意味着职责划分有问题——想不出准确的名字,通常是因为这段代码同时干了好几件事,应该先拆分再命名。

基本信息

识别信号看不出用途,必须读实现才能明白
重构手法Rename Variable / Rename Function / Rename Class
延伸判断命名困难往往指向职责混杂
工具支持IDE 安全重命名,跨文件引用一次改全

典型使用场景

  • 变量名用单字母或缩写:d、ttl、calcAmt 只能靠猜
  • 函数名含糊:handle、process、doWork 说不出具体行为
  • 名字与实现不符:叫 validate 的函数顺手写了库
  • 类名过大:Manager、Helper、Util 通常意味着职责没拆开
  • 布尔值用双重否定:notDisabled 容易在条件里读反

改名前后对照

改名前后对照
// 之前:名字说不出含义
int d;                                // 是过期天数还是距离?
void check(Order o) { ... }           // 检查什么,返回什么?

// 之后:名字即文档
int daysUntilExpiration;
void rejectIfOrderExpired(Order order) { ... }

// 布尔值用肯定语义
boolean isActive;   // 而不是 notInactive

命名检查点

对象要求常见反例
变量体现单位与含义d、tmp、data
布尔值肯定语义,避免双重否定notDisabled
函数动词开头,说明行为与副作用handle、process
类与模块名词,边界清晰Manager、Helper、Util
改名是最安全的重构手段之一:IDE 能一次改全所有引用,评审也容易核对。
命名是一次性投入、长期收益的改动:只要不改行为,随时可以做,而且做得越早成本越低。
跨语言项目里同一个概念要保持同一套词汇:中英混杂的命名会让搜索和替换都变得不可靠。
卡在命名上时,先用一句话描述这个函数做什么;如果一句话说不完,问题在职责而不在名字。

易错点

  • 缩写词堆叠(calcTtlAmt):评审者只能靠猜,误改风险明显上升
  • 名字与实现不符时只改名不改行为:误导依旧存在,应当一并修正
  • 给类起 Manager 之类的万能名:职责边界更模糊,改动影响面失控
  • 布尔量使用双重否定:条件语句读反,逻辑缺陷很难在评审中被看出来
  • 同一概念在代码里出现多个名字:搜索与替换都容易漏,维护成本持续上升
  • 全项目一次性改名不做分批:一次改几千处,评审无法核对,容易混进行为改动

数据来源与参考

  • 《重构》第 2 版 · 第 3 章(Bad Smells · Mysterious Name)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌