魔术数字 (程序设计)

✍ dations ◷ 2025-06-09 19:03:44 #计算机编程,反模式

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

相关

  • 日本内阁总理大臣政治主题内阁总理大臣(日语:内閣総理大臣〔內閣總理大臣〕/ないかくそうりだいじん Naikaku sōri daijin */?)是日本最高行政首长,主要职责为领导内阁的运作,主持内阁会议(日语:
  • 水烟水烟(英语:hookah;印度斯坦语: हुक़्क़ा (天城文), حقّہ (波斯体), IPA: ;胡卡)是一种烟草和抽烟用装置。人们用水烟抽鸦片、大麻属、烟叶、等。有学者认为胡卡起源
  • HGST昱科环球存储股份有限公司(HGST),是西部数据的子公司,成立于2003年1月,总部设于美国加州圣荷西。2002年12月,日立制作所收购IBM硬盘部门,与日立自己的硬盘部门集成为存储科技公司(St
  • 让·路易·埃米尔·布迪耶让·路易·埃米尔·布迪耶(法语:Jean Louis Émile Boudier,1828年-1920年)是法国蒙特莫朗西的一名药师。布迪耶首先描述了许多盘菌纲和其他种真菌,他常以Émile为自己的名字。布
  • 正十二面体正十二面体是由12个正五边形所组成的正多面体,它共有20个顶点、30条棱、160条对角线,被施莱夫利符号{5,3}所表示,与正二十面体互成对偶。它是一种只具有正四面体对称性(英语:tetr
  • 李弘 (唐朝)李弘(652年-675年),中国唐朝唐高宗李治第五子,唐中宗、唐睿宗之兄长。母亲是武则天,妻子乃裴居道之女裴氏。永徽六年(655年)时,被封为代王;显庆元年(656年),原本的太子李忠被废,改立李弘为
  • 织田作之助织田作之助(日语:織田 作之助/おだ さくのすけ ,1913年(大正2年)10月26日 - 1947年(昭和22年)1月10日)是一位日本大阪市的小说家,常称为“织田作”(おださく)。他以描写大阪的平民生活
  • 内志与哈萨酋长国内志与哈萨酋长国,又称内志第三王国,是1902年-1921年间,存在于内志和哈萨绿洲地区的一个酋长国,也是历史上第三个由沙特家族统治的国家,埃米尔是建立现代沙特阿拉伯的伊本·沙特。
  • 莎菲耶·艾希洛莎菲耶·艾希洛(阿拉伯语:صافية الحلو‎,1990年12月16日-)是一名苏丹裔美籍诗人,以文字和口语诗作而知名。艾希洛在纽约大学的迦勒汀个人学习学院取得学士学位,并在新学
  • 祁州路街道祁州路街道,是中华人民共和国河北省保定市安国市下辖的一个街道办事处。2017年,河北省民政厅批复同意撤销祁州镇,设立祁州路街道办事处,街道办事处驻祁州路53号。祁州路街道下辖