魔法数字应该变成常量
魔法数字应该变成常量

魔术号是一个具有无法解释的含义的文字价值,它在代码中多次出现。此类值将显示任何意图,并且应该替换为常数:常量的名称将使代码更可读,更容易更新到来。

寻找魔术数字

让’S看看一些代码,并提取魔术号以了解情况。这是一个实数列表,在最近发布的开源应用中的大约120 kloc中找到。

 

 

 

价值 发生次数
0.0 1
1.0E-08. 1
0.05 1
0.33 1
1.0 10
1.7 4
2.0 1
2.3 1
3.2 1
4.0 1
4.199999 1
4.299999 1
5.0 1
5.2 2
7.3 1
8.0 1
365.25 3
3600.0 1

快速扫描显示:

  • 0.33看起来像1/3,有一些近似。它可能会被划分所取代3。
  • 365.25看起来像一年时间,在日子里表达。还有呼唤怀疑是整数365和366在应用程序中使用了几次。
  • 几个整数表示为真实(0,1,2,4,5,8,3600)
  • 漂浮有一个十进制看起来像版本号,但也可能是其他东西。我们可以识别一些PHP版本(5.0,5.2),否则。

 

将文字转变为常量

只能安全地忽略一次数量的数字。它们可能是用于测试目的或边缘案例,并且很重要。创造一个值得常数的情况需要至少两次发生。

另一方面,多次使用的数字可以显示代码的各个部分之间的关​​系。当使用代码的远程部分时相同的值,任何更新都突然很难进行。所有这些值必须搜索和检查。让我们看看1.7的发生可能发生什么。

1.7代码中出现4次。这个值没有明显的意义:最好的选择可能是它是一个版本号。 Grep在使用“1.7”的代码中产生19个位置:真的需要使用静态审计工具来获取值。以下是实际情况:

backend/external/misc/class.captcha.php#70: $fontsize = $this->height/1.7;
backend/external/misc/class.captcha.php#124: $fontsize = $this->height/1.7;
backend/external/misc/class.captcha.php#186: $fontsize = $this->height/1.7;
backend/external/pear.php.net/HTML/Common.php#97: 
function apiVersion()
{
   return 1.7;
} // end func apiVersion

其中三个出现计算字体大小。最后一个是梨类作为一个版本返回。这个数字有两个冲突的使用情况,将它们变成一个常数将是有利可图的。

建议书

  • 现货文字,尤其是那些用于计算的(例如上面的Fontsize计算)和使用数次的计算。它们是丹普拉化的主要目标(如果存在一词)
  • 魔术数字可能是真实的(罕见),整数(众多),字符串(非常众多)。处理它们以获得更快的代码可读性。
  • 常量可以是类常量(在类内使用)或接口常量(在几个与界面相关类中使用)或全局常量(其余部分)。请记住,const关键字使得常量更有效,但不如定义灵活。
  • 相同的文字可以定义为不同的常数:这’可能,经常。
  • 所有常量和没有文字“是一个坏主意。特别是,只有0,1和文字,只能留下一次。

现在,有常量写作也很好:

mkdir('path/to/new/dir', MODE_ALL_READ | MODE_ALL_EXEC)

代替

mkdir('path/to/new/dir', 0770).

One thought on “PHP中的魔术数字

  1. pingback: PHP里的神奇码 - exakat

评论被关闭。