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

  在一个新项目中,我最先做的事情之一,就是建立使用诸如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、(这是我在大多数讨论中没有列出的论据)我只是不想去思考它,也不想让别人思考它。我见过数十个,很可能上百个例子,一个恰当命名的常量会极大地帮助理解一段代码。我很少看到它损害可读性的例子,并且没有一个会严重损害可读性。
  注意:仅仅因为它是一个常量,并不意味着它必须被公开,包括类级别的字段。如果它只用在一个单独的方法中,使用局部变量就够了。

你可能感兴趣的:(java)