魔术数字 (程序设计)

✍ dations ◷ 2025-10-14 04:56:59 #计算机编程,反模式

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

相关

  • 候鸟鸟类迁徙是鸟类随着季节变化进行的,方向确定的,有规律的和长距离的迁居活动。在动物界中,类似的活动非常常见,对昆虫则称为“迁飞”,对鱼类则称为“洄游”,对哺乳动物则称为“迁移
  • 石溪石溪大学(英语:Stony Brook University,缩写:SBU),又名纽约州立大学石溪分校(State University of New York at Stony Brook,缩写:SUNY SB),是一所成立于1957年的纽约州州立大学,坐落于
  • 长脚蟹总科长脚蟹总科(学名:Goneplacoidea)是短尾下目下的一个超科,包含11个现存科, 和两个已知只有化石的科。维基共享资源中与长脚蟹总科相关的分类
  • 普陀山普陀山是中国浙江省舟山群岛中的一个岛屿,也是中国四大佛教名山之一,是观音菩萨的道场。原名梅岑山,后改以印度补怛落迦山(Potalaka)之名相称。普陀山位于杭州湾出口以东约100海
  • 气 (中国)传统宗教仪式:神明秘密社会:气是中国哲学、道教和中医学中常见的概念。中国历史春秋战国时代的思想家,将气的概念抽象化,成为天地一切事物组成的基本元素,有着像气体般的流动特性
  • 转车盘转车盘,又称转车台,是供车辆转换方向的机械装置。蒸汽机车及柴油机车等铁路车辆,由于驾驶台仅设在一边,为了方便不同方向行驶,车辆需进入转车盘转换方向。因此转车盘通常设于调车
  • 马丁·彼得罗夫马丁·彼得罗夫(保加利亚语:Мартин Петьов Петров,1979年1月15日-),保加利亚足球运动员,2010年夏季以自由身加盟英超俱乐部博尔顿,及后于2013年1月转投西甲西班牙
  • 弓雅枝弓雅枝(3月19日-),日本女性前配音员、舞台演员。出身于滋贺县大津市。身高154cm。B型血。本名相同。以前经历大阪TV talent bureau(简称TTB)、J Production(日语:Jプロダクション)、
  • 鸡子大饼鸡子大饼,又称葱油鸡子大饼,是中国江苏无锡的传统地方小吃,其创制历史可追溯自民国初年。无锡鸡子大饼始于1915年,首创者为一葱油饼小贩范盘福,因其制作葱油饼的手艺极好,旁人便多
  • 菲律宾罗汉松菲律宾罗汉松(学名:)是罗汉松科罗汉松属的植物。分布于台湾、菲律宾等地区,目前尚未由人工引种栽培。