魔术数字 (程序设计)

✍ dations ◷ 2025-12-10 15:16:13 #计算机编程,反模式

程序设计中所谓的魔术数字(magic number)可能有以下含意:

魔术数字可以是指硬编码在代码里的具体数值(如“10”“123”等以数字直接写出的值)。虽然程序作者写的时候自己能了解数值的意义,但对其他程序员而言,甚至制作者本人经过一段时间后,会难以了解这个数值的用途,只能苦笑讽刺“这个数值的意义虽然不懂,不过至少程序能够运行,真是个魔术般的数字”而得名(起源参考平方根倒数速算法)。

因为下述理由,一般认为代码中不应该含有魔术数字。

例1:

price_tax = 1.05 * price

例1是对输入的价格(price)计算含税(price_tax)售价的程序。但税率并不是万年不变,当政府调整税率时,会有修改程序的必要。这里“1.05”就是一种魔术数字,“为什么是1.05”会让人无法马上了解。下面是去掉魔术数字的示例,程序容易了解也容易修正。

例1 (修正):

TAX = 0.05price_tax = (1.0 + TAX) * price

例2:

setColor("text", 0xffffff)

例2是设置以白色显示代码。然而十六进制的色码0xffffff很难直觉看懂是“白色”,故也算是一种魔术数字。下面是一种拿掉魔术数字的方式。

例2 (修正):

white = 0xffffffsetColor("text", white)

像这样,将魔术数字置换成常量或枚举类型是经常用来解决魔术数字问题的手段。由于常量可以赋予易懂的名称,可使帮助阅读者了解数值的意义。当然,在程序初始化部分定义的常量列表不称为魔术数字。

例3:

year = (new Date()).getYear() - 1911;

例3是用来获取今年之民国纪年的代码。然而将“1911”硬编码在代码里并不尽理想,例如程序不易在其他国家使用等。下面是一种拿掉魔术数字的方式。

function getMinguoYear() { return (new Date()).getYear() - 1911; }year = getMinguoYear();

这个示例则使用函数来包装整段计算民国纪年的逻辑,函数内则直接保留数值1911。这样做的好处是在程序中可借由getMinguoYear()这个函数名称更容易了解程序意图,并对未来若需支持其他国家时保留弹性。例如,需要使用日本历时,可只抽换函数部分而不动到程序所有参考年份运算的地方。

另外,在 一些编程语言中,1与0经常直接作为“真”、“假”的意义(布尔值)使用,有时候也不被认为是魔术数字。(但近年的语言多半建议使用与替代。)

魔术数字也会在文件中使用。在特定文件格式中加入固定数值和固定字符串,然后便可以通过检查文件是否包含这些数据来快速地识别文件格式。

例如:GIF文件开头会包含GIF89a47 49 46 38 39 61)或GIF87a47 49 46 38 37 61)这两种字符串。

相关

  • 马加比家族马加比家族(希伯来文:מכבים‎)是犹太教世袭祭司长的家族。于公元前167年,犹太祭司玛他提亚领导犹太人对抗塞琉古王朝。玛他提亚于公元前166年卒,犹大·马加比继承父志并夺回
  • 林 镕林镕(1903年3月27日-1981年5月28日),江苏丹阳人,中国植物学家,中国科学院植物研究所研究员。中国真菌学研究开拓者之一。发现了菊科重羽菊属及各类植物的新分类群百余种。为中国菊
  • 龟城市龟城市(朝鲜语:구성시/龜城市 Kusŏng si */?)是朝鲜民主主义人民共和国平安北道的一个市,位于该道中南部。面积666.8平方公里。朝鲜王朝时期设郡。1967年建市。下分二十四洞、
  • 埃及镑埃及镑(阿拉伯语:الجنيه المصرى‎)是埃及的流通货币。辅币单位是皮阿斯特及米利姆。1镑=100皮阿斯特=1000米利姆。下面列出了历史上一美圆可以兑换多少埃及镑(Egypt
  • 法拉第笼法拉第笼(英语:Faraday cage)是一个由金属或者良导体形成的笼子。由于金属的静电等势性,可以有效屏蔽外电场的电磁干扰。法拉第屏罩无论被加上多高的电压内部也不存在电场。而且
  • 沃尔夫冈·霍夫曼沃尔夫冈·霍夫曼(德语:Wolfgang Hofmann,1941年3月30日-2020年3月12日),德国柔道运动员。1964年代表德国联合队获得东京奥运会男子柔道中量级银牌。他是第一个在奥运会上获得奖牌
  • 贺德仁贺德仁,陈朝至唐朝的文学家、政治人物。越州山阴县人。陈朝散骑常侍贺朗之子。贺德仁于堂兄贺德基拜周弘正为师,以擅长文章知名。贺德仁兄弟八人,时人把他们比成汉朝的荀氏。会
  • 莱昂诺尔女王 (纳瓦拉)莱昂诺尔女王(法语:Éléonore;西班牙语:Leonor;1426年2月2日-1479年2月12日),是1455年至1479年期间的纳瓦拉王国的摄政与1479年的纳瓦拉女王。莱昂诺尔是亚拉冈国王胡安二世与纳瓦
  • 原位杂交技术原位杂交化学技术(英语:In situ hybridization,缩写:ISH),简称原位杂交,是核酸杂交技术的一种方式。其使用标记的互补DNA,RNA或修饰的核酸链(即探针)定位组织的一部分或部分中的特定DN
  • 地狱男爵:血后的崛起《地狱男爵:血后的崛起》(英语:,前称作)是一部2019年美国超级英雄电影,由尼尔·马歇尔执导。改编自黑马漫画旗下的漫画《地狱男爵》,由麦克·米格诺拉(英语:Mike Mignola)所创作,同时也