magic number 魔数的定义

参考网站:

 

http://baike.baidu.com/link?url=P50krf9VaHKc7LZVaiRBMQw9aVJ1EgXVWkgkLm1aEsgxv8zlHPQkfMBrtvXBrPvFmkYDQjnLup0eBKHZt4N9yciCJ4alDf54xfyTdug3h1u

 

magic number 魔数的定义

 

定义一:编程中的常数变量名

譬如一个很简单的根据职位计算薪水的方法

public int getSalary(String title int grade) {

if ("Programmer".equals(title))

return grade * 500 + 700;

else if ("Tester".equals(title))

return grade * 500 + 800;

else if ("Analyst".equals(title))

return grade * 800 + 1000;

}

在这个方法里面,"Programmer""Tester""Analyst"是所谓的魔字符串(Magic String),而500 7008001000就是所谓的魔数(Magic Number)了。 咋一看,代码这样写也没有什么问题,但是,仔细思考一下就会发现,如果这种随手捻来的字符串和数字散布于程序当中,随处可见的话,是会有很多弊病的。我们先来分析三个魔字符串。虽然三个Magic String的意义很明显,并不影响到代码的可读性,但是这样却增加了出错的概率,并且忽略了具体的语义环境。我们很容易就会想到,像"Programmer"这个单词散布在多个方法中,一个大小写的笔误就会产生bug。同时,"Programmer"在计算薪水的方法中代表着职位,但是在统计公司订阅的杂志的方法中,也许就要代表一本杂志的名称了。然而这种语义环境是无法通过一个单纯的"Programmer"就能体现出来的。

Magic Number的问题就更大了,首先是影响了代码的可读性,谁会知道500800是薪水基数,700是补贴呢?而且更糟糕的是,如果薪水基数发生改变的时候,那么就得找人把这些500700800的数字找出来一个一个地update,那可是一件够郁闷的事情了。

如果我们拥有一个常量定义的interface,代码就会变漂亮起来了:

public int getSalary(String title int grade) {

if (Constants.TITLE_PROGRAMMER.equals(title))

return grade * Constants.BASE_SALARY_LOW + Constants.ALLOWANCE_LOW;

else if (Constants.TITLE_TESTER.equals(title))

return grade * Constants.BASE_SALARY_LOW + Constants.ALLOWANCE_MEDIUM;

else if (Constants.TITLE_ANALYST.equals(title))

return grade * Constants.BASE_SALARY_HIGH + Constants.ALLOWANCE_HIGH;

}

从以上的分析,在一个Project里面,避免使用魔数(Magic Number)和魔字符串(Magic String)是相当必要的。通过定义的常量access特定的字符串和数字也已经是软件开发的standard。那么是不是所有的数字和字符串都应该定义成常量呢?或许有朋友会认为所有的数字和字符串都应该定义成常量,但是我觉得,每个字符串确实是应该定义成常量的,但是对于数字而言,如果数字本身的语义没有得到延伸,那么就不应该定义成常量。譬如数组index就不应该定义成变量。

 

 

定义二

 

很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。因此这几个字节的内容也被称为魔数 (magic number),因为根据这几个字节的内容就可以确定文件类型

 

比如mnist前几个字节

http://www.2cto.com/kf/201607/527860.html

posted @ 2017-02-23 15:50  yizhichun  阅读(602)  评论(0编辑  收藏  举报