魔术数字 (程序设计)

✍ dations ◷ 2025-11-19 22:05:25 #计算机编程,反模式

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

相关

  • 五碳糖戊糖(英语:Pentose),又称为五碳糖,是一种含有5个碳原子的单糖。在1号碳上有醛基的称为五碳醛糖(戊醛糖);2号碳上有酮基的称为五碳酮糖(戊酮糖)。戊醛糖有3个手性中心,因此可能有8种旋光
  • ΚKappa(大写Κ,小写κ,中文音译:卡帕),是第十个希腊字母。Kappa又可以指:
  • 心梗心肌梗死(Myocardial infarction简称MI、Acute myocardial infarction简称AMI),旧称心肌梗塞,是一种急性及严重的心脏状态。其成因是部分心肌的血液循环突然中断,心肌因无法得到
  • 国防部军医局国防部军医局是中华民国国防部附属机关,掌理中华民国国军医务及卫生勤务事项,负责国军军医政策、军医经管、军医行政、部队卫生勤务、医疗保健、卫材补给(保修)、军政医学研究发
  • 预官大专程度义务役预备军官士官考试,简称“预官预士考试”,是中华民国政府依照军官士官服役条例所实行的服役方式,主管机关为国防部,开放予合乎标准且尚未服义务役的男子,录取者受训
  • 软性新闻资讯娱乐又称为软新闻(英语:Infotainment或英语:Soft news)是一种新闻媒体广播节目,是带娱乐成分的时事新闻,或是以新闻方式广播的娱乐节目。资讯娱乐是资讯与娱乐的混成词;参与资
  • 亚洲小爪水獭(A. cinerea)Amblonyx cinereusAonyx cinereusAmblonyx cinerea亚洲小爪水獭(学名Aonyx cinerea、oriental small-clawed otter、 Asian small-clawed otter),又名小爪水獭,是一种小型水獭。
  • 约翰尼斯·狄克曼约翰尼斯·狄克曼(德语:Johannes Dieckmann,1893年1月19日-1969年2月22日),东德政治人物。1949–1969年间担任东德人民议会主席。约翰尼斯·狄克曼生于奥特斯贝格,1915年征召入伍,之
  • 乔瓦尼·塞瓦乔瓦尼·塞瓦(Giovanni Ceva,1647年12月7日-1734年6月15日),意大利几何学家。他发现了综合几何上的塞瓦定理。此外,他又重新发现梅涅劳斯定理。, 1716, 1717
  • 眼镜蛇瓶子草眼镜蛇瓶子草(学名:),又称为加州瓶子草(California Pitcher plant)、眼镜蛇百合(Cobra Lily)、眼镜蛇植物(Cobra Plant),为瓶子草科眼镜蛇瓶子草属食虫植物。眼镜蛇瓶子草属为单种属,仅