魔术数字 (程序设计)

✍ dations ◷ 2025-11-23 23:20:05 #计算机编程,反模式

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

相关

  • Moschino梦仙奴(Moschino 意大利语发音:),又译莫斯基诺,是意大利的奢侈品牌,1983年由弗兰科·莫斯基诺创立。该公司在1983年由弗兰科·莫斯基诺(1950-1994)创立。他去世后,助手罗赛拉·嘉蒂妮
  • 磁感应强度磁感应强度也被称为磁通量密度或磁通密度,是一个表示贯穿一个标准面积的磁通量的物理量,其符号是 B {\displaystyle B} ,国际单位
  • 济砀高速公路济南-祁门高速公路(简称济祁高速),是一条建设中的连接山东济南和安徽祁门的高速公路,全长约1133公里,途经山东、河南、安徽三省,十个省辖市17个县区。是安徽省规划的“四纵八横”高
  • 民族-国家与暴力《民族-国家与暴力》(英语:)是安东尼·吉登斯的名著。在本书中,吉登斯提供了一种对现代民族国家性质的社会学分析,以及其进行战争时的手段上的分析。本书英文版是由剑桥大学出版
  • 喇叭苗话喇叭苗话是湘语下属的一种方言。为在贵州西部晴隆普安两县交界一些乡镇的被新汉族移民称为喇叭苗的族群使用。据喇叭苗人族谱及口传记载,他们的祖上大多是明洪武十三年(1381年
  • JPEG联合图像专家小组(英语:Joint Photographic Experts Group,缩写:JPEG)是一种针对照片影像而广泛使用的有损压缩标准方法。此团队创立于1986年,1992年发布了JPEG的标准而在1994年获
  • 伽利略传《伽利略传》(德语:Leben des Galilei)是由德国剧作家贝托尔特·布莱希特创作的一出戏剧,主要讲述伽利略因其天文发现触怒教廷,在真理与威权之间摇摆的故事。
  • 创造力团体创造力团体是一个由经济学家和社会科学家理查德·弗罗里达所提出的假设社会经济团体。据其,创造力团体是一个在美国后工业城市之经济发展中的关键驱动力。
  • 沃尔弗拉姆·希曼沃尔弗拉姆·希曼(德语:Wolfram Siemann,1946年6月22日-)是一名德国历史学家,慕尼黑大学近代和现代史退休教授。研究重点是19世纪的革命、宪法史、媒体史。生于维滕,1965年到1971年
  • 韩国电影制作人协会奖韩国电影制作人协会奖(朝鲜语:한국영화제작가협회상)是由韩国电影制作人协会(朝鲜语:한국영화제작가협회)自2014年起举办的韩国电影颁奖典礼。年份:2014年 举行日期:12月23日 地点:首