魔术数字 (程序设计)

✍ dations ◷ 2024-12-22 14:06:57 #计算机编程,反模式

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

相关

  • 喀布尔喀布尔(普什图语:کابل‎,波斯语:کابل‎), 是阿富汗的首都,喀布尔省首府和阿富汗的最大城市。它是一座有3000多年历史的名城,1773年以后成为阿富汗首都。“喀布尔”在信德语
  • 卧房卧房,又称卧室、睡房及寝室,是指供人在其内睡眠、休息或进行性行为的房间。卧房不一定有床,不过通常有可供人躺卧之处。有些房子的主卧房有附属浴室,名为套房。工人房是提供予工
  • 真武汤真武汤,出自《伤寒杂病论》,原名玄武汤。
  • L-木酮糖还原酶L-木酮糖还原酶(英语:L-xylulose reductase,EC 1.1.1.10)是一种以NAD+或NADP+为受体、作用于供体CH-OH基团上的氧化还原酶。这种酶能催化以下酶促反应:良性L-木酮糖还原酶缺乏可
  • 弗拉基米尔·瓦西里耶维奇·谢尔比茨基弗拉基米尔·瓦西里耶维奇·谢尔比茨基(俄语:Влади́мир Васи́льевич Щерби́цкий,1918年2月17日-1990年2月16日)乌克兰人,苏联党和国家领导人,乌克兰
  • 斯托里斯托里县(Storey County, Nevada),美国内华达州西部的一个县。面积683平方公里,根据美国2000年人口普查,共有人口3,399人。县治维吉尼亚城 (Virginia City)。成立于1861年11月25日,
  • 奥格登奥格登(Ogden)可以指:
  • 棚车棚车,又称篷车,俗称闷罐车,是一种封闭的火车车厢,一般用来运送货物。虽然在设计和制造上,棚车比平车要复杂,但是由于不须担心人员或货物被甩出列车的缘故,棚车是最为多用途的铁路货
  • 青海格尔木太阳能光伏电站格尔木太阳能光伏电站位于中国青海格尔木市,始建于2009年8月20日,并于2011年10月29日正式启用 。电站每年的输出预计为317亿瓦时。在格尔木沙漠群中,共有发电量达570兆瓦的光伏
  • 王远义王远义(?-),台湾历史学家,主要从事中国、欧洲近现代思想史及资本主义发展史研究,目前着重于中国现代性的探讨。其兄为育达科技大学的副教授王远嘉。美国杜克大学历史研究所硕士,美国