魔术数字 (程序设计)

✍ dations ◷ 2025-04-28 12:13:56 #计算机编程,反模式

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

相关

  • 无脊椎动物无脊椎动物(Invertebrate)是背侧没有脊柱的动物,包括棘皮动物、软体动物、刺胞动物、节肢动物、海绵动物、线形动物以及脊索动物门的头索动物及尾索动物等。其种类数占动物总种
  • 卡洛·乌尔巴尼卡洛·乌尔巴尼(意大利语:Carlo Urbani,1956年10月19日-2003年3月29日),又译乌尔班尼或厄巴尼,意大利医生,是首位留意到SARS是一种全新传染病的医生。乌尔巴尼是无国界医生意大利分
  • 质体外途径质外体(英语:apoplast)是指植物细胞原生质体外围由细胞壁、细胞间隙和导管组成的系统,它是养分运输的重要途径,并有贮存养分和激活养分的功能。质体外途径(apoplast pathway)是相对
  • 许宗力许宗力(1956年2月10日-)为现任中华民国司法院院长。著名公法学者。许宗力之父是执业律师许竹谟,曾参选嘉义县县长但未当选。因耳濡目染的缘故,许宗力从小便立志学法的志向。中学
  • 惊天大阴谋《总统班底》(英语:All the President's Men)是一部1976年的美国政治惊悚片(英语:Political thriller),由艾伦·帕库拉执导,达斯汀·霍夫曼及罗伯特·雷德福等主演。故事改编自鲍勃
  • 派尤特人派尤特人(英文:Paiute)为北美洲印第安人中的一族,操努米克语(英语:Numic languages) 。分为南北两支部落,昔居于美国西南部,其中南派尤特人原居住在美国犹他州、亚利桑那州、内华达州
  • 李贺李贺(790年-816年),字长吉,河南福昌(今河南宜阳)人,是著名的唐朝诗人,被称为“诗鬼”。正史所载李贺资料甚少,《新唐书》有李贺小传,其生平见于李商隐的《李贺小传》与杜牧应沈子明之请
  • 次硫酸次硫酸(H2SO2)是一种极不稳定的无机酸,目前只制得了次硫酸盐。金属锌与硫酰氯在乙醚中反应可制得次硫酸锌:乙酸钴与连二亚硫酸钠溶液作用,再加入过量的氨,然后通二氧化碳至饱和,可
  • 谢毅 (化学家)谢毅(1967年7月23日-),中国化学家,主要研究方向为无机固体化学。生于蚌埠,原籍安庆。1988年毕业于厦门大学化学系,1996年获中国科技大学应用化学博士学位。2013年当选为中国科学院
  • 彰泰 (清朝)彰泰(1636年-1690年),,满洲爱新觉罗氏。 努尔哈赤第七子饶余敏郡王阿巴泰次子固山温良贝子博和讬之子,生母为舒穆禄氏。崇德元年(1636年)六月二十日生,顺治八年(1651年)被封为镇国公,再