魔术数字 (程序设计)

✍ dations ◷ 2025-11-15 19:23:33 #计算机编程,反模式

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

相关

  • 义素义素(英语:Seme)指语义学中可识别的最小意义单位。义位指语义学中能够独立运用的最小意义单位,义位由若干个义素组成。义素与义位的关系类似于音素和音位的关系。类似的“最小概
  • 肛瘘肛瘘是指直肠或肛管与肛周皮肤之间形成的瘘管。也称为肛门直肠瘘,但一般都称为肛瘘,古时又称为肛漏,先也有俗称“老鼠偷粪”。瘘管的内口多位于齿状线附近,而外口位于肛周皮肤。
  • U.S. Census Bureau美国普查局(英语:United States Census Bureau,按《美国法典第13卷 § 11》官方称呼为Bureau of the Census)是美国商务部经济和统计管理局下属的一个机关。它的任务由美国宪
  • 拉(Ra,也拼作Rah、Rē)是古埃及太阳神。从第五王朝(公元前2494年至公元前2345年)开始,成为古埃及神话中最重要的神,被看作是白天的太阳。一千多年以来,拉一直是埃及的最高神,直到阿肯
  • 经济部加工出口区管理处经济部加工出口区管理处(简称加工处)是中华民国加工出口区的最高主管机关,隶属经济部。
  • AllMovieAllmovie(原名All Movie Guide)是一个包含关于电影明星、电影与电视剧信息的商业数据库。它由电影数据库维护者Michael Erlewine与拥有数学哲学博士学位的Vladimir Bogdanov共
  • 故事形态学《故事形态学》(俄语:Морфология сказки,英译标题:Morphology of the Folktale)是结构主义学者与民俗学家弗拉基米尔·雅可夫列维奇·普罗普的一部著作,第一版发
  • 丰利站丰利站(韩语:풍리역)是朝鲜民主主义人民共和国咸镜北道稳城郡丰利里的一个铁路车站,属于咸北线。咸北线
  • 玉春糖玉春糖(옥춘당)或玉春(옥춘),北朝鲜称为彩色弹珠糖果(색구슬사탕),是朝鲜传统糖果。(最左边的一堆) 还历宴会餐桌上的玉春糖
  • 四手井纲正四手井纲正(日语:四手井 綱正/しでい つなまさ 、1895年1月27日 - 1945年8月18日)为日本陆军军人。最终阶级陆军中将。京都府山科(现属京都市)旧家(乡士)出身。教员・四手井彦四郎