魔术数字 (程序设计)

✍ dations ◷ 2025-12-05 17:55: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)这两种字符串。

相关

  • 花莲医院卫生福利部花莲医院,简称花莲医院,为一间直属中华民国卫生福利部的医院。位于花莲县花莲市。花莲医院的前身为创立于1909年的“台湾总督府花莲港医院”,直辖于台湾总督府,为花莲
  • 排卵期出血排卵期出血(英语:Ovulation bleeding),又称经间期出血,是一类有规律的经间期出血症状。在正常的月经周期中,第12—14天是排卵日期。排卵期出血情况,是指在此期间雌性激素高峰急速下
  • 政治工作局中国人民解放军军徽中国共产党中央军事委员会办公厅政治工作局,位于北京市,是中央军委办公厅下属局,负责该办公厅的政治工作。2016年改革前,中央军委办公厅设有中央军委办公厅政
  • 南开大学医院南开大学医院,又称南开大学校医院,为服务南开大学师生及家属的社区医院,院长为南开大学商学院教授齐善鸿。
  • 西南航空西南航空(英语:Southwest Airlines,NYSE:LUV)是一家美国主要的航空公司,也是世界最大的廉价航空公司,总部位于得克萨斯州达拉斯。它由赫伯·凯莱赫创立于1967年,随后在1971年更名为
  • 黔西南布依族苗族自治州黔西南布依族苗族自治州(布依语:Qianfxiynanf Bux Qyaix Bux Yeeuz Ziqziqzouy,苗语:Qeef Xib Naif Dol Yat Dol Hmub Zid Zid Zeb),简称黔西南州,是中华人民共和国贵州省下辖的自
  • 林秋离林秋离 (Eric Lin,1960年8月21日-),台湾著名作词家、唱片制作人,曾任台湾海蝶音乐董事长。海蝶音乐在新加坡发掘了嗓音特殊的阿杜与林俊杰,林俊杰多次提到林秋离是他的恩师。填词代
  • 草原马里语草原马里语,又称东马里语,是马里语的方言之一。使用者主要集中在俄罗斯的马里埃尔共和国。草原马里语和山地马里语是马里语的两大方言。草原马里语的使用人口大约有47万人。
  • 新闻系统新闻系统是一种由ASP、PHP等脚本语言编写的可以在网上即时交互发布新闻信息的网络交互系统,可以在线添加文章、图片、影音等多媒体信息,使得个人建立网站变得更加的简单。小型
  • 约瑟夫·侯斯保亚约瑟夫·侯斯保亚(捷克语:Josef Hušbauer;1990年3月16日-)是一位捷克足球运动员。在场上的位置是中场。他现在效力于意大利足球甲级联赛球队卡利亚里足球俱乐部。他也代表捷克国