魔术数字 (程序设计)

✍ dations ◷ 2025-07-02 10:20:10 #计算机编程,反模式

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

相关

  • 刨花板胶合板也叫夹板、多层材(英语:Laminated Veneer Lumber,缩写LVL,更通用的英文用语是Plywood)是第一种发明的科技木材。由比较薄的木单板制作。由相邻两层木纹相互垂直的木片(单板)
  • 曝气曝气是指在液体等物质中加入空气的过程。曝气可应用于污水处理,藉在水中加入空气,提高溶解氧的含量,让水中的微生物生长及分解污染物。水产养殖亦有应用曝气器材提高水中含氧量
  • 芝加哥1号堆芝加哥1号堆(英语:Chicago Pile-1)是人类历史上第一个核子反应堆,由恩里科·费米、利奥·西拉德等人在美国芝加哥大学建立,于1942年12月2日产生可控的铀裂变链式反应,最初输出功率
  • 八月照相馆《八月照相馆》(韩语:8월의 크리스마스,英语:Christmas in August)是1998年于韩国发行的一部以爱情为题材的电影,由许秦豪执导,韩石圭及沈银河主演。青年刘正源(韩石圭 饰)身患绝症,但
  • 鹿港居民反杜邦设厂事件鹿港居民反杜邦设厂事件(鹿港反杜邦运动),是一起发生在1986年台湾彰化县鹿港镇的重大外商投资争议事件,并进而催生中华民国政府设立环境保护署。张世光担任经济部部长期间(1978-1
  • 罢课罢课是学生集体拒绝上课,是学生运动之一,但“走堂”未必是罢课。教师集体拒绝教课则称为罢教。
  • 水牛比尔“水牛比尔”科迪 帕哈斯卡(Pahaska,长发)威廉·弗雷德里克·“水牛比尔”·科迪(William Frederick "Buffalo Bill" Cody,1846年2月26日-1917年1月10日),是一名南北战争军人、陆军
  • 赫尔曼·哈肯赫尔曼·哈肯(德语:Hermann Haken,{1927年7月12日-)是一位德国物理学家,斯图加特大学理论物理学名誉教授。哈肯是协同学的奠基人。 1927年出生于莱比锡,他是数学家沃尔夫冈·哈肯的
  • 安妮特·奥尔森安妮特·奥尔森(瑞典语:Anette Ingegerd Olsson,艺名Anette Olzon,1971年6月21日-)是一名瑞典歌手,以作为芬兰交响金属乐团夜愿的第二任主唱而知名。她还是瑞典专辑导向摇滚乐团艾
  • 化学物质列表因为化学物质的数量太多,所以此条目原本的列表内容已分割为以下几个条目。请参见:中文:英文:这些商业的连结,也可以提供有用的资料: