魔术数字 (程序设计)

✍ dations ◷ 2025-11-29 14:54:29 #计算机编程,反模式

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

相关

  • 开元盛世开元之治,亦称为开元盛世和开天盛世,是唐朝在唐玄宗统治时期所出现的盛世。唐玄宗治国头三十年,以开元作为年号,那时玄宗励精图治,并且任用贤能,发展经济,提倡文教,使得天下大治,所以
  • 母系制度母系制度是以母系亲属为世系继承的亲属制度。采取母系制度的社会通常有母系继承制、从妻居、重视舅甥关系、从母居以及舅舅担任家长的情况。在母系社会中,原生家庭的子嗣被严
  • 干走电影《干走电影》(Steal This Film)是一个于2006年开始的系列电影计划,电影内容是关于反抗知识产权运动的纪录片,并且以BitTorrent点对点技术协定散布电影,而非一般电影在戏院放映。
  • 美国爱国法《美国爱国者法》(USA PATRIOT Act)是2001年10月26日由美国总统乔治·沃克·布什签署颁布的国会法,正式的名称为“Uniting and Strengthening America by Providing Appropriat
  • 汉程客运汉程汽车客运股份有限公司(英语:Han-Cheng Bus Traffic Co., Ltd.),简称汉程客运,为2013年成立之高雄市公车业者,主要接续原高雄市公共汽车管理处释出之部分路线,为台湾爱巴士交通
  • 六大弊政清初六大弊政,指清朝初年被汉人反对的六项政策。公元1644年,明朝灭亡后,清兵入关,清政权成为中原的新统治者。统治初期,摄政王多尔衮先后颁布占房圈地令、剃发令、投充法、逃人法
  • CpG位点CpG位点(英语:CpG sites,或称为CG位点)是指DNA的某个区域,其上的碱基序列以胞嘧啶接着鸟嘌呤出现。“CpG”是“—C—磷酸—G—”的缩写 ,指磷酸二酯键连接了胞嘧啶和鸟嘌呤,其中C位
  • 陈新 (桥梁工程专家)陈新(1932年1月12日-2011年6月26日),男,江苏无锡人,中国桥梁工程专家、中国工程院院士,第九届全国人大代表。
  • 原子实原子实(core或atomic kernel),物理学界又称之为“原子芯”,是一个应用越来越广泛的概念。在书写电子排布式时,通常把内层电子已达到稀有气体结构的部分写成稀有气体的元素符号外
  • 艾魏尔湖坐标:48°05′41″N 9°41′47″E / 48.094642°N 9.696284°E / 48.094642; 9.696284艾魏尔湖(德语:Ayweiher),是德国的湖泊,位于该国西南部,由巴登-符腾堡州负责管辖,处于里斯河畔