魔术数字 (程序设计)

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

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

相关

  • α肾上腺素受体肾上腺素能受体(英语:Adrenergic receptors,或称为肾上腺素受体)是一类接受儿茶酚胺类物质刺激的代谢型G蛋白偶联受体,所接受的儿茶酚胺类主要是去甲肾上腺素以及肾上腺素。尽管
  • 比荷卢经济联盟欧洲(深灰)  —比荷卢联盟(前称比荷卢经济联盟,也经常称呼为荷比卢)是由3个相邻的君主立宪西欧国家:荷兰、比利时和卢森堡组成的联盟,为低地国。原名Benelux是一混成词,由三国的名
  • 陆 林陆林(1966年9月-),安徽安庆人,精神病学与临床心理学家,中国科学院院士,现任北京大学第六医院院长。1989年,毕业于华北煤炭医学院(现华北理工大学)。1999年,在华西医科大学(现四川大学)获
  • 生命时报《生命时报》(英语:Life Times)是中华人民共和国的一份报纸,由人民日报社主管、环球时报社主办。报纸原名《环球时报·生命周刊》,2003年8月5日创刊,2006年1月17日改为现名。报纸
  • 大魔术师《大魔术师》(英文:The Great Magician)是一部于2012年1月上映的的贺岁喜剧电影,根据中国作家张海帆于2009年发表的同名小说改编而成。由尔冬升执导,梁朝伟、刘青云及周迅联袂主
  • 埃迪卡拉生物群埃迪卡拉生物群(英语:Ediacaran biota)又称艾迪卡拉生物群,包括一群神秘的管状或叶状生物,生活在前寒武纪时代(5亿8000万年前-5亿4200万年前)。1946年在澳大利亚南部埃迪卡拉(英语:Edi
  • 金融资本主义金融资本主义(英语:finance capitalism / financial capitalism)是生产过程从属于金融体系(英语:financial system)内货币利润积累过程的关系。因此,金融资本主义是资本主义的一种
  • 长鼻凤凰螺长鼻凤凰螺(学名:)为凤凰螺科长鼻螺属下的一个种。
  • 河南美术出版社河南美术出版社是位于中国河南省郑州市的出版社,是河南唯一一家美术专业出版社,1984年11月20日由河南人民出版社美术编辑室、中州书画社美术编辑处合并组建,现已出版美术、书法
  • 气爆气爆,又称瓦斯爆炸,指可燃气体的意外爆炸,会引发火灾及其他灾害,也可能会造成严重的生命财产损失。气爆有可能是因为气体外泄(英语:Gas leak),使得可燃气体和空气混合,再加上有静电、