当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

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

发表于: 2015-01-29   作者:tomcat_oracle   来源:转载   浏览:
摘要:   在一个新项目中,我最先做的事情之一,就是建立使用诸如Checkstyle和Findbugs之类工具的准则。目的是制定一些代码规范,以及避免通过静态代码分析就能够检测到的bug。   迟早会有人给出案例说这样太离谱了。其中的一个案例是Checkstyle的魔数检查。它会对任何没有定义常量就使用的数字字面量给出警告,除了-1、0、1和2。   很多开发者在这个检查方面都有问题,这可以从结果
  在一个新项目中,我最先做的事情之一,就是建立使用诸如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、(这是我在大多数讨论中没有列出的论据)我只是不想去思考它,也不想让别人思考它。我见过数十个,很可能上百个例子,一个恰当命名的常量会极大地帮助理解一段代码。我很少看到它损害可读性的例子,并且没有一个会严重损害可读性。
  注意:仅仅因为它是一个常量,并不意味着它必须被公开,包括类级别的字段。如果它只用在一个单独的方法中,使用局部变量就够了。

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
ELF魔数 我们可以从前面readelf的输出看到,最前面的“Magic”的16个字节刚好对应“Elf32_Ehdr”的e
环境:SQLServer 2008 R2 问题:在修改表的结构(设置外键等),出现”不允许保存更改”。 解决: 1
解这个数独的java代码。。。。 package third; import java.util.ArrayList; import java.util.Iter
这个题目的思想是,书上说,由于题目中说了是其它的数字有两个,而这两个数字 只有一个,于是知:异
前几天LP玩数独,玩到大师级各种被虐,我看了看说,分分钟帮你做出来, 结果当然没有做出来。 于是
想做一个乌鸦飞的效果,却发现一群乌鸦碰在一起老是会出现头上脚下的情况,感觉很是不好 于是想到了
感谢读者 wzyboy 的爆料。 wzyboy同学之前就在历史作业里发现了跟Google有关的题目,这次他们的语文
昨天发现打开VS2008的工具箱(ToolBox)特别慢,开始没在意,后来发现里面的项重复很多次,列表很长
原文: [翻译]:SQL死锁-为什么会出现死锁 下面这篇对理解死锁非常重要,首先死锁是如何产生的我们要清
下面这篇对理解死锁非常重要,首先死锁是如何产生的我们要清楚。 We already know why blocking occ
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号