在源代码编写中,有这么一种情况:编码者在写源代码的时候,使用了一个数字,比如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。