魔术数字 (程序设计)

✍ dations ◷ 2025-12-11 15:58:41 #计算机编程,反模式

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

相关

  • Sr5s22,8,18,8,2蒸气压第一:549.5 kJ·mol−1 第二:1064.2 kJ·mol−1 第三:4138 kJ·mol主条目:锶的同位素锶(Strontium,旧译作鎴)是一种化学元素,它的化学符号是Sr,它的原子序数是38,
  • 第71名索引 国防预算 石油储量 军事(武装部队) 死刑 国债 生育率 最高点 官方语言 地理 政体 面积 代码 陆地面积 人口 人口密度 国内生产总值 国徽 国旗 国歌 国家格言 首都 城市
  • 置换反应置换反应又称单置换反应,是指一种元素或化合物的离子根与一种离子化合物发生的反应,狭义氧化还原反应是置换反应的一种,且必为广义的氧化还原反应。在反应中,关键在于还原性或氧
  • 德米特里·顿斯科伊德米特里·伊凡诺维奇(Дмитрий Иванович,1350年10月12日-1389年5月19日)更著名的称呼是德米特里·顿斯科伊(Дмитрий Донской,意即顿河的德米特里),莫
  • 高雄硫酸亚厂高雄硫酸铔,简称高硫、KASC,是台湾一家已结束经营的肥料及化工产品制造公司。
  • 世界体系Portal:政治世界体系理论是一套由萨米尔·阿明、Giovanni Arrighi、Andre Gunder Frank与伊曼纽尔·沃勒斯坦等人创建的一套后马克思主义国际关系理论及社会理论。世界体系
  • 瓦伊达斯·卡里尼奥斯卡斯瓦伊达斯·卡里尼奥斯卡斯(立陶宛语:Vaidas Kariniauskas,1993年11月16日-),立陶宛篮球运动员。他现在效力于立陶宛球队萨拉基利斯篮球俱乐部。他也代表立陶宛国家篮球队参赛。
  • 六叠氮合磷酸五氮六叠氮合磷酸五氮是一种高能材料,化学式为N5+P(N3)6-,它由美国科学家Christe等人于2004年制得。首先将五氯化磷与过量叠氮化钠在-20°C的乙腈中反应制得六叠氮合磷酸钠以及氯
  • 三仁汤三仁汤,一方出自清朝的《温病条辨》,是祛湿剂中清热祛湿的方剂,有宣畅气机,清热利湿的功效,可以主治湿重于热之湿温病。可见的症状有:头痛恶痛,身重疼痛,胸闷不饥,午后身热,面色淡黄,舌
  • 贝格科格尔山 (维内迪杰山脉)坐标:46°59′40″N 12°22′56″E / 46.994522°N 12.382192°E / 46.994522; 12.382192贝格科格尔山(德语:Berger Kogel),是奥地利的山峰,位于该国西部,由蒂罗尔州负责管辖,属于维