魔术数字 (程序设计)

✍ dations ◷ 2025-11-18 20:56:20 #计算机编程,反模式

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

相关

  • 林务局行政院农业委员会林务局(简称林务局)是中华民国林业事务的最高主管机关,为行政院农业委员会附属机关,主管全国森林、保安林的经营管理及自然生态保育等相关业务之推动及其政策、
  • 鞭打鞭打是虐待的手段之一,也是一种刑罚,现在马来西亚、新加坡、伊朗和沙特阿拉伯仍有鞭刑。有些施虐者或受虐者在进行虐恋活动时也采取鞭打方式,使用一般为不会造成伤害的马尾鞭,使
  • 环丙酮环丙酮(化学式:C3H4O)是环丙烷的氧代衍生物。其熔点为-90°C,很不稳定,可通过乙烯酮与重氮甲烷在-145°C时反应制备。 由于母体化合物不甚稳定,合成中使用环丙酮的缩酮 代替环丙酮
  • 荠菜荠菜(学名:Capsella bursa-pastoris),又名护生草、地菜、地米菜、菱闸菜等,十字花科荠菜属植物。起源于东欧和小亚细亚,目前在世界各地都很常见。其种加词来自拉丁语,意思是“小盒
  • 川南行政区 (1950–1952)川南行政区是中华人民共和国建国后成立的省级行政区,于1950年至1952年存在。1949年12月,西南战役结束,解放军攻占四川全省。由于四川省地域较大,人口近八千万,为便利行政管理,分划
  • 白云观白云观,位于北京市西城区西便门外的白云观街9号,是道教全真道三大祖庭之一,也是全真道龙门派的祖庭,自元朝起,为全真道“第一丛林”。中国道教协会、中国道教学院、中国道教文化
  • 误动作等级误动作等级(STL)是对于架设在安全系统(安全相关系统或安全关键系统)中的安全机能,对误动作次数的要求。STL 1表示安全机能会出现的误动作次数最多,误动作等级最高,表示会出现的误动
  • NetlabelNetlabel或称网络唱片厂牌,是指以在互联网上传播和散布以MP3及Ogg格式为载体的艺术家音乐性质的小型唱片厂牌。与传统唱片公司不同的是,Netlabel的音乐一般都以完全免费的性质
  • 枯鲁杜鹃枯鲁杜鹃(学名:)为杜鹃花科杜鹃属下的一个种,为中国特有种。枯鲁杜鹃最早由美国植物学家约瑟夫·洛克1929年9月在中国四川省西南部的枯鲁山区采集到标本,当时未命名。1953年,该标
  • 卡里·霍塔凯宁卡里·霍塔凯宁(芬兰语:Kari Hotakainen;1957年2月9日-)芬兰作家。1957年2月9日,卡里·霍塔凯宁出生于芬兰波里。1976年,霍塔凯宁毕业于劳塔兰皮高中。他在大学获得了文学士学位。