圣诞大减价开始了!

用符号常数代替幻数

问题

您的代码使用了一个具有特定含义的数字。

解决方案

将此数字替换为具有人类可读的名称,解释该数字含义的常量。

之前
双势能(双质量,双高度){返回质量*高度* 9.81;}
静态最终双引力常数= 9.81;双势能(双质量,双高度){返回质量*高度* gravational_constant;}
之前
双势能(双质量,双高度){返回质量*高度* 9.81;}
const double GRAVITATIONAL_CONSTANT = 9.81;双势能(双质量,双高度){返回质量*高度* gravational_constant;}
之前
函数势能($mass, $height){返回$mass * $height * 9.81;}
定义(“GRAVITATIONAL_CONSTANT”,9.81);function potentialEnergy($mass, $height){返回$mass * $height *引力常量;}
之前
def势能(质量,高度):返回质量*高度* 9.81
重力al_constant = 9.81 def势能(质量,高度):返回质量*高度*重力al_constant
之前
势能(质量:数,高度:数):数{返回质量*高度* 9.81;}
static const GRAVITATIONAL_CONSTANT = 9.81;势能(质量:数,高度:数):数{返回质量*高度* gravational_constant;}

为什么重构

幻数是在源代码中遇到的但没有明显意义的数值。这种“反模式”使得理解程序和重构代码变得更加困难。

然而,当您需要更改这个神奇的数字时,会出现更多的困难。查找和替换对这种情况不起作用:相同的数字可能在不同的地方用于不同的目的,这意味着您必须验证使用该数字的每一行代码。

好处

  • 符号常量可以作为其值含义的实时文档。

  • 改变一个常数的值比在整个代码库中搜索这个数字要容易得多,而且没有意外更改其他地方用于不同目的的相同数字的风险。

  • 减少在代码中重复使用数字或字符串。当值很复杂且很长(例如3.141590 xcafebabe开头).

知道就好

并非所有数字都是神奇的。

如果一个数字的用途很明显,就没有必要替换它。一个经典的例子是:

For (i = 0;I < сount;i++){…}

选择

  1. 有时,一个神奇的数字可以用方法调用代替。例如,如果您有一个神奇的数字表示集合中的元素数量,则不需要使用它来检查集合的最后一个元素。相反,使用标准方法获取集合长度。

  2. 魔术数字有时用作类型代码。假设您有两种类型的用户,您在类中使用一个数字字段来指定哪一种是哪一种:管理员1普通用户2

    在这种情况下,你应该使用一种重构方法来避免类型代码:

如何重构

  1. 声明一个常量并为其赋值。

  2. 找到所有提到这个神奇数字的人。

  3. 对于您找到的每个数字,请仔细检查这个特定情况下的神奇数字是否对应于常量的目的。如果是,用常数替换数字。这是一个重要的步骤,因为相同的数字可能意味着完全不同的东西(并根据情况替换为不同的常数)。

Baidu
map