`
tomcat_oracle
  • 浏览: 311504 次
社区版块
存档分类
最新评论

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

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

相关推荐

    无垠式代码生成器最新功能与文档增强版0.7.22

    1.增加了括号校验,不允许使用SGS语法中未定义的圆括号和方括号。 2.增强了域对象列表的校验和棱柱列表的校验。 3.实现了编译警告功能,若选择了IgnoreWarning选择框,编译警告即不影响代码生成。 ===============...

    DWR中文教程 PDF格式

    DWR是一个可以允许你去创建AJAX WEB 站点的JAVA 开源库。它可以让你在浏览器中的Javascript代 码调用Web服务器上的Java 代码,就像在Java代码就在浏览器中一样。 DWR工作原理是通过动态把Java类生成为Javascript。...

    dwr.jar包+教程.pdf.ppt

    DWR是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器中的Javascript代码调用Web服务器上的Java代码,就像在Java代码就在浏览器中一样。 DWR包含2个主要部分:  一个运行在服务器端的Java ...

    ZFORUMS V2.5 正式版(sql)

    完善头像上传,附件上传时允许管理员选择是上传到服务器上还是具专到数据库里。 3。论坛显示版块的子版块(本来功能就存在的。不过当时发现显示子版块不美观,所以就只在首页显示副版:) 现在已经提供。 V...

    Python魔法:函数的定义与巧妙运用

    函数是编程中的关键概念之一,它允许您将一系列操作打包成一个可重复使用的单元。在Python中,您可以使用def语句来定义函数,这些函数可以接受参数并返回结果。通过使用函数,您可以更好地组织代码,提高可读性,...

    顶点论坛(ZForums) v2.0

    修正的功能: 1:首页登陆时有时显示空白页 2:修正帖子列表显示的分页代码错误 3:修正后台管理“论坛组”不能上下位置移动 4:论坛帖子搜索。 5:修正个人短消息分页代码。 6:修正帖子...

    applem2_20120610苹果引擎配套工具,内有登陆器配置

    5、怪物数据库的WALK_SPD字段允许为-1:表示当前怪物不移动 6、增加可在物品数据库中设置装备初始发光效果,字段为Effect 发光效果(1-9) 如果想通过脚本取消原本的发光效果,只需将发光效果设成10即可 [2012-04-15...

    视易神通夜总会5.0安装包

    6.结账时,打折人可以手工输入名字(该名字可以不是已经建好的员工信息),且折扣数不做限制(对于具体的折扣数,该场子会通公文的形式给定具体人员的最低折扣数) {功能使用说明:当后台参数"是否允许手工输入员工...

    php-git-deploy:PHP脚本,用于将代码从git存储库部署到您的服务器。 使用Webhooks从Github或Bitbucket自动部署

    该脚本允许您将代码从git存储库部署到服务器,而无需任何其他第三方服务。 我们开发了此脚本来为网站部署代码。 确保您了解此脚本如何工作,以确定它是否适合您的项目。 GitHub和BitBucket都提供Webhooks ,可在...

    javafuture源码-TowerofTheChosen:2013-2014:我制作的基于文本的RPG的原始c++源代码。未完成,但我计划在

    java future源码选择的塔 我在2013-2014年左右制作的基于...《黑暗之王》出现在21楼和41楼之间,机会不多。 41楼有100%的可能性出现黑暗之王。 如果您过早遇到他,并且在21-40楼的农场经验要尽可能高,请重置游戏。

    贝岭的matlab的代码-nyc-sinatra:ActiveRecord关联实验室

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-012918:nyc-sinatra-web-012918

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-0616:nyc-sinatra-web-0616

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-040317:nyc-sinatra-web-040317

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-0217:nyc-sinatra-web-0217

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-091817:nyc-sinatra-web-091817

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-121117:nyc-sinatra-web-121117

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-112017:nyc-sinatra-web-112017

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

    贝岭的matlab的代码-nyc-sinatra-web-042417:nyc-sinatra-web-042417

    贝岭的matlab的代码欢迎来到纽约西纳特拉! 介绍 我们将为纽约市建立一个历史站点,因此我们将需要创建以下数据库结构: 您将拥有三个模型(及其对应的表) Landmark 、 Title 、 Figure (想想历史人物)。 一个...

Global site tag (gtag.js) - Google Analytics