幻数浅析(Magic Number)

         在源代码编写中,有这么一种情况:编码者在写源代码的时候,使用了一个数字,比如0x2123,0.021f等,他当时是明白这个数字的意思的,但是别的程序员看他的代码,可能很难理解,甚至,过了一段时间,代码的作者自己再看代码的时候也忘记了这个数字代表的含义。于是感叹,

虽然不知道这个数字是干什么用的,究竟代表什么,但是编译后的程序可以正常运行,真是"魔术般的数字"

幻数即源于此。

幻数的这个含义在编程中通常含贬义。因为在编程中使用幻数是不好的习惯,开发中应当尽量避免。

幻数的两大弊端:

一、代码可读性差,例如

如果没有说明,很难猜到那个2.13f的含义。

二、修改不方便,例如

暂且不说0xFFFFFFFF代表的含义,如果程序中很多地方使用了统一的一个常量,如果要修改值的时候很麻烦,也容易出错。可能有遗漏等等诸多问题。可以改为#define NUM = 0xFFFFFFFF

这样程序代码不仅便于阅读,而且要替换他的值,只需要替换一次就好了。

解决魔术数字的方法主要是将这些数字定义为常量,或者枚举类型,或者使用编译器宏定义(如C/C++的#define)

一个数,由写程序的人规定,所取的数值没有必然的条件限制,由写程序的人按自己意愿确定的数,也就是MAGIC NUMBER。

————————————————————————————————————————————-      

      magic number的翻译一般是幻数或者魔数magic是一个充满神秘色彩的单词,表达神秘,未知等复杂的寓意,而这也正是magic number在代码中的所作所为:当你看到它时,会感到莫名其妙

因此,判定一个数字是否是magic number的依据,是它的出现是否能提供足够的信息让你理解其所指代的行为和场景。


     看下面的代码行:

  s = 10.0 * t * t / 2.0;

  这里面包含了两个数字,在这种情况,这两个数字都是magic number,因为无法从这两个数字推断出任何额外的信息。

  这行代码其实是表达下面的含义:

  const double g = 10.0; //10.0作为重力加速度g = 9.8的近似值。
  s = g * t * t / 2.0;

  代码改成这样,我们消除了一个magic number,那么另一个呢?

  另一个已经不是magic number了,因为,众所周知,这行代码其实是理想自由落体掉落的距离/时间公式,公式中的/2.0无法用更  明确的单词来表达,所以,它不是magic number



版权声明:本文为yinshitaoyuan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。