魔术数字 (程序设计)

✍ dations ◷ 2025-02-23 22:42:21 #计算机编程,反模式

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

相关

  • 显微术《显微图谱》(Micrographia,又译为《显微制图》、《显微术》、《显微镜图集》、《显微图象》、《显微图志》、《微观图集》)是罗伯特·胡克的一部著作。这本书于1665年9月出版,
  • span style=color: #0645ad商神杖/span商神杖(古希腊语:Κηρύκειον;希腊语:Kerykeion),为了与阿斯克勒庇俄斯之杖区别,亦称双蛇杖。其由一根刻有一双翅膀的金手杖和两条缠绕手杖的蛇组成,被视为商业和国际贸易的
  • 战略战略/策略,是指为实现某种目标(如政治、军事、经济或国家利益方面的目标)而制定的高层次、全方位的长期行动计划。
  • 巛部巛部,为汉字索引里为部首之一,康熙字典214个部首中的第四十七个(三划的则为第十八个)。就繁体和简体中文中,巛部归于三划部首。巛部通常是从上、下方及中间均可为部字,且无其他部
  • 始基始基(古希腊语:ἀρχή),又译作本原,是古希腊哲学中的重要概念,指世界万物的来源与存在的根据。最早探讨这一概念的是古希腊米利都学派的泰勒斯,其学生阿那克西曼德则首次提出了始
  • 1989年苏联人口普查1989年苏联人口普查在该年的1月12至19日实施,是苏联所做的最后一次人口普查。根据这次普查的结果,苏联的现在人口 (实际人口)为286,730,819人。高于同时期的美国 (1990年4月1
  • 玛利亚观音玛利亚观音为16世纪末至20世纪初日本天主教徒特有,直到1873年(明治6年)日本废除禁止信仰天主教的政令之后,这种文化逐渐消失。1587年7月24日(天正15年6月19日),丰臣秀吉发布伴天连
  • 巴拉圭南美航空巴拉圭南美航空(LATAM Paraguay,或称Transportes Aéreos del Mercosur S.A.,曾名为)是巴拉圭的国家航空公司,总部位于其首都亚松森。其枢纽机场是西尔维奥·佩蒂罗西国际机场,隶
  • 周延儒顾祖训撰、黄应澄绘,《明状元图考》之周延儒像周延儒(1593年-1644年),字玉绳,号挹斋,直隶宜兴县宜城镇人,明末政治人物、状元,东阁大学士。因贻误军机,被赐死。周延儒少时聪颖,被誉为神
  • 非洲核果木科非洲核果木科也叫印度假黄杨、无盘核果木,为羽柱果科,包括4属约210种,都是常绿乔木,主要分布在非洲和马来西亚的热带地区。本科植物的叶分两列,革质,嫩叶有萝卜或胡椒的味道;花小,丛