魔术数字 (程序设计)

✍ dations ◷ 2025-11-30 15:09:29 #计算机编程,反模式

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

相关

  • 拉雪兹神父公墓拉雪兹神父公墓(法语:Cimetière du Père-Lachaise,官方名称:cimetière de l'Est,意指“东公墓”)是法国巴黎市区内最大的墓地,位于巴黎第20区,面积超过43万平方米。它是巴黎第一
  • 准谷物准谷物,也称为假谷物,是和谷物一样可以作为粮食的阔叶植物(非禾本科)。其种子可以磨成粉或是像谷物一样食用。常见的准谷物有苋属植物(尾穗苋、红苋菜、千穗谷)、藜麦及荞麦.
  • CatchPlay威望国际(英语:Catchplay)是一家于2007年开始营运的电影片商,在台湾和大中华区的主要业务包括院线发行、家庭娱乐、线上电影、网络电视等。成立初期以复制Netflix营运模式为目标
  • 田连元田连元(1941年12月16日-),原名田长庚,祖籍河北省盐山县,生于吉林省长春市,中国评书表演艺术家。出身说书世家。1959年末入本溪市曲艺团,文革时到桓仁县插队,1972年调回本溪市歌舞团。
  • 印度古典式舞蹈印度古典式舞蹈其实是很多种类舞蹈方式的总称。这些舞蹈在某些时代在以印度为中心的南亚地区流行。其中,最有名的是印度泰米尔纳德邦的婆罗多舞和印度北部的卡塔克。然而在现
  • 广雅滩坐标:8°08′00″N 110°27′00″E / 8.13333°N 110.45000°E / 8.13333; 110.45000广雅滩(英语:Prince of Wales Bank;越南语:Bãi Tư Chính/.mw-parser-output .han-nom{font
  • 墨西哥土拨鼠墨西哥土拨鼠(),又名墨西哥草原松鼠或墨西哥草原犬鼠,是原住于墨西哥的一种啮齿目。它们是日间活动的。由于它们被看为害虫,估其数量下降至濒危水平。墨西哥土拨鼠栖息在海拔1600
  • 真枝角鹿真枝角鹿(),又名真枝角兽、巨角鹿,是已灭绝的鹿,其化石在欧洲、中东及中亚都有发现。最早的真枝角鹿生存于上新世早期的中国。到了更新世早期,真枝角鹿在欧洲及中国最为丰富。欧洲
  • 曾远荣曾远荣(1903年-1994年2月2日),数学家,中国泛函分析研究的先驱者之一。四川南溪人。曾远荣曾就读于南溪县立小学、成都省立中学。1919年入北京清华学校(1928年更名为清华大学)学习,直
  • 软X射线暂现源软X射线暂现源(英语:Soft X-ray transient,缩写:SXT)是某种类型的致密天体和某种类型的正常低质量天体(即质量仅为太阳质量分数的天体)。这些天体显示出低能量级别,或软X射线辐射,但