魔术数字 (程序设计)

✍ dations ◷ 2025-12-08 12:31:11 #计算机编程,反模式

程序设计中所谓的魔术数字(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)这两种字符串。

相关

  • 申克氏孢子丝菌申克氏孢子丝菌(学名:Sporothrix schenckii)是孢子丝菌属的一种真菌,分布于全球,常见于土壤与腐烂的植物组织中。本种真菌可感染人类,造成称为孢子丝菌症(玫瑰园丁症)的皮下感染,感染
  • 莱曼·斯皮策小莱曼·史庄·斯皮策(英语:Lyman Strong Spitzer, Jr.,1914年6月26日-1997年3月31日),美国理论物理学家、天文学家。他是太空望远镜概念的提出者,NASA以他的名字命名斯皮策太空望
  • 生育力生育能力(fertility)是指生物可以繁衍后代的能力,在统计上,生育率是指一对配偶生育后代的个数。生育能力和潜在生育能力(英语:Fecundity)(fecundity)不同,后者是指繁衍后代的潜力,受到
  • 总鳍鱼类肉鳍鱼总纲(学名:Sarcopterygii)是硬骨鱼类的一个演化支。此类鱼的特点是鱼鳍中有一个中轴骨,在前鳍的基部上有明显的肌肉组织与分开的两片腹鳍,和之后两栖动物和四足类动物的演
  • 齿龈颤音是辅音的一种类型, 在很多语言中使用,如俄语、藏语、西班牙语、亚美尼亚语和波兰语、意大利语、瑞典语、德语、阿拉伯语、挪威语、冰岛语、芬兰语、马来语、蒙古语、
  • 2003年2003年被中华人民共和国处决的死刑犯列表,旨在列出2003年被中华人民共和国处决的死刑犯。
  • 80/20法则帕累托法则(英语:Pareto principle,也被称为 80/20 法则、关键少数法则、八二法则)指出,约仅有20%的变因操纵着80%的局面。也就是说:所有变量中,最重要的仅有20%,虽然剩余的80%占了
  • 威廉·佩利 (哲学家)威廉·佩利(英语:William Paley 1743年7月-1805年5月25日)英国神职人员、基督教辨惑学者、哲学家、功利主义者。著作有《自然神学:从自然现象中收集的关于神性存在和其属性的证
  • 卡利南钻石库里南钻石(Cullinan Diamond)是已被发现的最大的天然钻石原石,重3,106克拉,相当于621.35公克,于1905年1月26日发现于南非的库里南矿场,并以矿场的董事长托马斯·库里南的姓命名。
  • 死神来了系列绝命终结站系列 是一个美国的恐怖专营权,由五部电影、两本漫画书和九部小说组成。它是基于杰佛瑞·雷迪克(英语:Jeffrey Reddick)编写,未经使用的待售剧本,原是为电视剧系列“X档