魔术数字 (程序设计)

✍ dations ◷ 2025-12-03 16:03:43 #计算机编程,反模式

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

相关

  • 女隐修院院长女隐修院院长(英语:Abbess)天主教本笃会的隐修女团体、圣方济各第二会以及其他修会女隐修院的负责人。其年龄在40岁以上,隐修超过10年,由本主教管区主教举行仪式任命,并授予表示职
  • 球形在数学里,球是指球面内部的空间。球可以是封闭的(包含球面的边界点,称为闭球),也可以是开放的(不包含边界点,称为开球)。球的概念不只存在于三维欧氏空间里,亦存在于较低或较高维度,以
  • 黑斑黄褐斑(Melasma,chloasma faciei:854),又称肝斑、黑斑、黑皮病,是一种皮肤颜色变深为黄褐色的疾病,发生在孕妇身上时候被称为妊娠面斑(mask of pregnancy)。黄褐斑通常被认为是日晒
  • 弧光灯弧光灯(英语:Arc lamp,或英语:Arc light),又称为电弧灯,是一种人造灯具,它以电弧来产生光源,属于气体放电灯的一种。这种灯有两个电极,通常是以钨制成,在电极之间,以气体隔开。在灯泡中
  • 不净动物本条目是在伊斯兰教、犹太教和基督教里被定义为不净动物的清单。其他东方的宗教,如佛教、道教、儒教等,则没有不净动物的概念。这些动物包括以下种类:以下列出的动物没有在圣经
  • 病毒学病毒学是一门以病毒 -- 亚微观的,蛋白质外壳中包含的遗传物质的寄生颗粒 - 和病毒样代理(virus-like agents)为研究对象的学科。它关注病毒的以下方面:病毒的结构,分类和进化,感染
  • 有头类有头类(学名:Craniata),又称有头动物,是支序分类学上提议中的一条脊索动物的演化支。其内包括目前地位有争议的盲鳗纲、七鳃鳗纲和有颌下门,或者可说是盲鳗纲与狭义上脊椎动物的并
  • 马哈瓜马哈瓜是古巴的城市,属谢戈德阿维拉省,面积544平方公里,海拔高度110米,2004年人口26,617,人口密度为每平方公里48.9人。
  • Girls' Invasion《Girls' Invasion》 是韩国女子音乐组合Lovelyz的首张正规专辑,于2014年11月17日发行。该专辑共收入9首歌曲,主打歌曲为〈Candy Jelly Love〉。该专辑于2015年3月3日以《Hi~
  • 2018年马格尼托哥尔斯克大楼倒塌2018年马格尼托哥尔斯克大楼倒塌发生于2018年12月31日当地时间约早上6时02分,一栋位于俄罗斯车里雅宾斯克州马格尼托哥尔斯克的公寓部分坍塌。倒塌事件造成39人身亡,17人受伤,3