用符号常数代替幻数
问题
您的代码使用了一个具有特定含义的数字。
解决方案
将此数字替换为具有人类可读的名称,解释该数字含义的常量。
之前
双势能(双质量,双高度){返回质量*高度* 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.14159
或0 xcafebabe开头
).
知道就好
并非所有数字都是神奇的。
如果一个数字的用途很明显,就没有必要替换它。一个经典的例子是:
For (i = 0;I < сount;i++){…}
选择
有时,一个神奇的数字可以用方法调用代替。例如,如果您有一个神奇的数字表示集合中的元素数量,则不需要使用它来检查集合的最后一个元素。相反,使用标准方法获取集合长度。
魔术数字有时用作类型代码。假设您有两种类型的用户,您在类中使用一个数字字段来指定哪一种是哪一种:管理员
1
普通用户2
.在这种情况下,你应该使用一种重构方法来避免类型代码:
如何重构
声明一个常量并为其赋值。
找到所有提到这个神奇数字的人。
对于您找到的每个数字,请仔细检查这个特定情况下的神奇数字是否对应于常量的目的。如果是,用常数替换数字。这是一个重要的步骤,因为相同的数字可能意味着完全不同的东西(并根据情况替换为不同的常数)。