魔术数字 (程序设计)

✍ dations ◷ 2025-09-14 03:22:18 #计算机编程,反模式

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

相关

  • 石蜡石蜡是固态高级烷烃混合物的俗名,分子式为CnH2n+2,其中n=20~40。石蜡可由天然或人造石油的含蜡馏分用冷榨或溶剂脱蜡、发汗等方法制得。石蜡通常是白色、有轻微气味的蜡状固体
  • 计算机病毒电脑病毒(computer virus),或称电子计算机病毒。是一种在人为或非人为的情况下产生的、在用户不知情或未批准下,能自我复制或运行的电脑程序;电脑病毒往往会影响受感染电脑的正常
  • 圣丹尼门圣丹尼门(Porte Saint-Denis)是一座法国凯旋门,位于巴黎第十区圣但尼郊区街附近。圣丹尼门原址是查理五世城墙城门之一,它曾是巴黎的防御工事。圣丹尼门是由建筑师弗朗索瓦·布
  • 三推成字法《三推成字法》为清朝嘉庆五年(1800年)晋江人黄谦所著一部以泉州音南安腔为主的闽南语音韵学书籍《汇音妙悟》一书里所提出的最早闽南语拼字法。此法以韵母"五十字母(元音)"为
  • 鞭蝎目鞭蝎(学名:Thelyphonida),蛛形纲之无脊椎动物,有鞭目的统称。此外鞭蝎也被命名为uropygid亦指“尻尾”,是来自古希腊语的οὐροπύγιον (ouropugion)。鞭蝎为卵胎生繁殖,雌鞭
  • 行政长官办公室行政长官办公室(葡萄牙语:Gabinete do Chefe do Executivo),是在技术及其他方面,辅助行政长官履行职责的机构,由主任、私人助理、顾问、私人秘书、翻译人员和技术及行政辅助人员组
  • 苏联部长会议苏联主题苏联部长会议(俄语:Совет Министров СССР)是1946至1990年苏联国家权力的最高行政机关,即苏联政府的一部分。其前身是1917年十月革命胜利后建立的苏联
  • 圣克拉拉省拉斯比利亚斯(Las Villas)省是古巴历史曾经存在的一个省份,省会为圣克拉拉市(非“圣克拉拉省”)(Santa Clara)。1978年时被一分为三,为现在的西恩富戈斯省、圣斯皮里图斯省和比亚克
  • 万应远万应远(Robert Thomas Bryan,1855年10月14日-1936年)美国北卡罗来纳州杜普林县人,美南浸信会派往中国的传教士,在中国传教超过50年时间。1855年10月14日,万应远出生于美国北卡罗来
  • 中途岛战役 (游戏)《中途岛战役》(英语:The Battle For Midway)是一款由Personal Software Services开发与发行的回合制策略游戏。这款游戏是关于在第二次世界大战太平洋战场的中途岛战役,围绕美