魔术数字 (程序设计)

✍ dations ◷ 2025-11-08 18:49:13 #计算机编程,反模式

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

相关

  • 翁贝托长廊翁贝托一世拱廊街(Galleria Umberto I)是意大利南部城市那不勒斯的购物廊,位于圣卡尔洛剧院的对面,面向城市主街道托莱多路。它建于1887–1891年,得名于翁贝托一世,有类似米兰埃马
  • 云莓云莓(学名:Rubus chamaemorus)是一种在广泛在北半球亚寒带地方生长的悬钩子属多年生灌木,分布于加拿大、斯堪的纳维亚地区,波罗的海沿岸,芬兰,爱尔兰,苏格兰、俄罗斯等地,多生长在林
  • 恩智浦恩智浦半导体(英语:NXP Semiconductors),前身为飞利浦半导体,由荷兰企业飞利浦在1953年创立。2006年8月31日,该公司首席执行官万豪敦在柏林向客户和员工宣布公司的新名称。恩智浦
  • 平近点角平近点角(Mean Anomaly)在轨道力学中是轨道上的物体在辅助圆上相对于中心点的运行角度,在测量上不同于其他的近点角,平近点角与时间的关系是线性的。因为与时间是线性的关系,因此
  • 厚头龙亚目平头龙科 Homocephalidae董枝明,1978厚头龙亚目(Pachycephalosauria)又称肿头龙亚目,希腊文意思为“厚头蜥蜴”,是鸟臀目恐龙的一个演化支。大多数已知的厚头龙类生存在晚白垩纪
  • 亚干人雅加人,又名雅马纳人,火地印第安人,是分布于智利南部的美洲原住民,也是世界上最南方的民族。他们的传统领地由大火地岛以南至合恩角。它们已经存在了超过10000年。他们传统上是
  • 莱加内斯莱加内斯(西班牙语:Leganés;西班牙语发音:.mw-parser-output .IPA{font-family:"Charis SIL","Doulos SIL","Linux Libertine","Segoe UI","Lucida Sans Unicode","Code2000","
  • 赵长青赵长青(1953年7月-),中华人民共和国书法家,中国书法家协会原分党组书记、副主席、秘书长,第十二届全国政协委员。
  • Visa公司Visa公司(英语:Visa Inc.,标识为VISA;NYSE:V)是总部位于美国加利福尼亚州福斯特市的跨国金融服务公司。Visa国际组织通过Visa品牌的信用卡(Credit Card)和借记卡(Debit Card)促进全球
  • 剑桥大学默里·爱德华兹学院剑桥大学默里·爱德华兹学院(英语:Murray Edwards College, Cambridge) 是剑桥大学的一所女子学院。此学院成立时并没有捐款人,因此并未像其他学院般用捐款人名字命名,原名新学堂