为什么不允许代码里出现“魔数”

在一个新项目中,我最先做的事情之一,就是建立使用诸如Checkstyle和Findbugs之类工具的准则。目的是制定一些代码规范,以及避免通过静态代码分析就能够检测到的bug。

迟早会有人给出案例说这样太离谱了。其中的一个案例是Checkstyle的魔数检查。它会对任何没有定义常量就使用的数字字面量给出警告,除了-1、0、1和2。

很多开发者在这个检查方面都有问题,这可以从结果代码中看到。我看到过这样的代码:

private static final int FOUR = 4;

以及

private static final int FOUR = 5;

和我最喜欢的(我可不会这么做!)

firstname = rs.getString(1);
lastname = rs.getString(2);
city = rs.getString(2 + 1);
zip = rs.getString(2 + 2);
country = rs.getString(2 + 2 + 1);

但是还有另一个引发讨论的不同案例。它是关于显而易见的常量,如把小数转换成百分比的100,或者在字节数和Kb数之间转换的1024。一些人认为它们不是魔数(或者不是那么糟糕的魔数),因为它们的含义很明显并且不会改变。

关于这一点我不同意。而且,任何时候我都会把它们写成常量。下面是原因:

1、 它的含义不是显而易见的。value*100是什么意思?是把一个小数转换成百分数?还是把一个以米为单位的长度,转换成厘米?或者是一个数乘以g*g的 粗略近似数,其中g是地球上的重力加速度?又或者是我把某个数乘以一个数组的长度,而长度恰好是100?说不清楚。使用一个恰当名称的常量就能搞定。

2、是的,我承认大多数这样的常量不会改变。但是定义常量(方法、类)的目的不(仅仅)是为了后面的变化,而是为了更容易阅读、理解和推理。因此在未来值是否会改变的问题是完全不相干的。

3、(这是我在大多数讨论中没有列出的论据)我只是不想去思考它,也不想让别人思考它。我见过数十个,很可能上百个例子,一个恰当命名的常量会极大地帮助理解一段代码。我很少看到它损害可读性的例子,并且没有一个会严重损害可读性。

注意:仅仅因为它是一个常量,并不意味着它必须被公开,包括类级别的字段。如果它只用在一个单独的方法中,使用局部变量就够了。

原文链接: dzone 翻译: ImportNew.com - shenggordon
译文链接: http://www.importnew.com/14627.html
[ 转载请保留原文出处、译者和译文链接。]



可能感兴趣的文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部