魔术数字 (程序设计)

✍ dations ◷ 2025-12-05 11:13:12 #计算机编程,反模式

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

相关

  • 高岭土高岭土(英语:Kaolinite),又称观音土、白鳝泥、膨土岩、斑脱石、甘土、皂土、陶土、白泥,是一种含铝的硅酸盐矿物,呈白色软泥状,颗粒细腻,状似面粉。其化学成分相当稳定,被誉为“万能
  • 卡尔·尼尔森卡尔·奥古斯特·尼尔森(丹麦语:Carl August Nielsen,1865年7月9日-1931年10月3日),丹麦作曲家和指挥家。卡尔·尼尔森出生于欧登塞南部小村庄Sortelung的一个贫穷画家和油漆匠之
  • 绕道入侵抚清之战 · 萨尔浒之战 · 开铁之战 · 辽沈之战 · 镇江之战 · 林畔之战 · 广宁之战 · 辽南之战 · 亮马佃大捷 · 牛毛大捷 · 乌鸡关大捷 · 横
  • 伊斯兰教末世论伊斯兰教的末世论和伊斯兰教六大信仰有关。伊斯兰教和其他的亚伯拉罕诸教一样,都教导死后肉体复活、神创世的计划以及人类灵魂不灭等教义;义人将获得乐园(天堂)的欢乐,而恶人将在
  • 晕炫风暴《晕炫风暴》(英语:Blackout)为美国歌手布兰妮·斯皮尔斯于2007年10月26日发行的第五张录音室专辑。专辑由Jive唱片和Zomba音乐集团于2007年10月26日发行。布兰妮于2006年开始
  • 郑再发 (教授)郑再发(Tsai-fa Cheng),美国威斯康辛大学名誉教授(2006-)。
  • 钟表匠类比钟表匠类比或钟表匠论述是为了阐述“神是存在的”的一种目的论表述。借由这个类比,此论点陈述设计的存在意味着一位设计者的存在。此论点已成为自然神学和设计论中的重要角色
  • 鲍鱼菇鲍鱼菇(学名:),常见的食用菇,属于伞菌目下的侧耳科。鲍鱼菇,又名泡囊侧耳,与蚝菇(平菇)、杏鲍菇同属侧耳属同物异名: Y.H. Han, K.M. Chen & S. Cheng 1974 (synonym)、 (Ellis & E
  • 卡迈勒·哈桑·阿里卡迈勒·哈桑·阿里,(阿拉伯语:كمال حسن علي‎,1921年9月18日-1993年3月27日),开罗人,埃及政治人物。1984年7月17日至1985年9月4日担任埃及总理。
  • 乌斯季扬斯基区坐标:61°05′N 43°09′E / 61.083°N 43.150°E / 61.083; 43.150乌斯季扬斯基区(俄语:Устьянский район),是俄罗斯的一个区,位于该国西北部,由阿尔汉格尔斯克州