吐槽一下项目中的代码坏味道:滥用java常量
我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类。
public interface IConstant
{
int ZERO = 0; String EMPTY_STRING = "";
}
使用该常量的代码,大致具有例如以下形式:
List<String> list = new ArrayList<String>(IConstant.ZERO);
if(IConstant.ZERO == list.size())
{ } int[] array = {1,2,3}
array[IConstant.ZERO];
if(IConstant.EMPTY_STRING.equals(name))
{ }
为什么要把0和""定义成一个常量呢?这是没有正确理解究竟什么是魔鬼数字和硬编码。使用常量,出于例如以下几个原因:
1、为了可读性,一个好的名字显然比一串写死的数字更easy理解。
2、避免冗余,让代码更easy改动,实现一处该,处处该的效果。
3、避免程序猿手写常量,不小心写错。比方多写了个0或者是少写了个0等。
4、常量必须是被多个地方使用,并且在不同的地方代表同样的含义。
假设定义的常量没有达到这4个要求中的随意一个,那么能够说这个常量的使用是没有意义的,会导致还有一中代码坏味道:没有必要的复杂性。
上面我们举的样例中:0代表的是列表的长度,也代表数组的第一个元素。不满足第1个要求,由于对于程序猿来说,这仅仅是最主要的语法,额外定义变量不能提高可读性;不满足第2个要求,由于这些东西是不会变的,不存在改动的可能;不满足第3个要求,有IDE的编译提示,并且常量0并不复杂,不存在写错的可能;不满足第4个要求,由于0一会儿代表长度,一会儿代表数组索引,根本没有办法给0取一个有意义的名称。
第4点须要特别注意:一个常量名称仅仅能代表一个业务含义!让列表长度和数组索引“复用”常量值0,这样的做法很不好。尽管降低了常量的个数,貌似实现了"复用",实际上是添加了代码之间的耦合。举个极端的样例,假如java的语法发生重大改变,数组的第一个元素从1開始而不是0,那我们能将常量ZERO改动成1吗?显然不能,假设改动了,是可以保证数组的正确使用,可是会导致列表长度的推断错误。这样的场景下,我们定义的常量ZERO全然没有意义。
吐槽一下项目中的代码坏味道:滥用java常量的更多相关文章
- 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...
- Sonar项目主要指标以及代码坏味道详解
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...
- Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够分析我们的项目文件. 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 R ...
- [git]安装git-pylint-commit-hook提高python项目中的代码质量
什么是'git-pylint-commit-hook' 我在工作中,团队为了保证代码和提高代码的质量,要求每个项目都要求安装git-pylint-commit-hook,它是个钩子,会在你提交代码到本 ...
- 最新广商小助手 项目进展 OpenGL ES 3D在我项目中引用 代码太多只好选重要部分出来
package com.example.home; import java.io.IOException; import java.io.InputStream; import javax.micro ...
- 针对MSHFlexGrid的一系列通用方法-项目中实践代码分享
1.给MSHFlexGrid填充数据通用方法 '自定义报表填充程序 fgrid Public Function ShowformfData(Resultset As ADODB.Recordset, ...
- 使用eslint将项目中的代码修改统一的缩进
背景 继承了组里师兄师姐写的项目的前端代码,但是是两个人写的,有两格缩进的,有四格缩进的,有字符串外用单引号的,有用双引号的. 于是搜索了一下,可以用eslint强制转化. eslint在github ...
- 在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化
Jackson允许配置多态类型处理,当JSON面对的转换对象是一个接口.抽象类或者一个基类的时候,可以通过一定配置实现JSON的转换.在实际项目中,Controller层接收入参以及在Dao层将对象以 ...
- 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性
在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...
随机推荐
- java提高篇(十三)-----字符串
可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...
- therefore/so/hence/then/accordingly/Thus
这几个词的区别大致可从以下几方面去看:1.therefore adv.因此, 所以=for that reason=consequently常用于连接两个并列分句,其前加“and”或分号“:”.He ...
- poj3414--Pots(bfs,记录路径)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10149 Accepted: 4275 Special J ...
- 使用JS意识到自己主动提交表单
今天将需要chat集成到客户的网站上去,注册用户链接登录这个网站后点击实现网站直接登录chat向上.我不停chat原来的登录界面,采纳JS当页面跳转技术,随着时间的推移自己主动填写表格.自己主动提交表 ...
- 定制Attribute
目录 Attribute是什么 自定义Attribute 一.Attribute是什么 将一些附加信息与制定目标相关联的方式.编译器在元数据中生成这些额外的信息.也叫做特性. 比如之前文章中提到的:枚 ...
- HDU 3081 Marriage Match II(二分法+最大流量)
HDU 3081 Marriage Match II pid=3081" target="_blank" style="">题目链接 题意:n个 ...
- C++几个小函数
之前看书,遇到几个编程题,要实现一些库自带的函数.于是动手写了写,并且做了一些测试.今晚在测试的时候,还发现了一些其他内存分配的问题,顺路一起记下.这里只写了字符串转整型,字符串赋值函数. #incl ...
- SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败
原文:SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败 先感谢一下我的同事们最先发现此问题,鸣谢:向飞.志刚.海云 最近在生产环境发现一个诡异的问题: 环境:WIN ...
- document.all使用
document.all 一个. document.all它是在页面中的所有元素的集合.例如: document.all(0)一个元素 二. document.all能够推断浏览器是否是IE ...
- Eclipse Maven构建Spring MVC项目
工作中项目开发使用Maven管理项目的构建.打包.编译,框架採用的是Spring MVC框架,而且实现了多模块.多项目的管理.自己也简单的參与了架构的设计.对于刚開始学习的人来说,使用Maven构建项 ...