吐槽一下项目中的代码坏味道:滥用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 这个反射的工具类 ...
 
随机推荐
- 对SA权限的再突破 (对付xplog70.dll被删)转载
			
原文:对SA权限的再突破 (对付xplog70.dll被删)转载 对SA权限的再突破 (对付xplog70.dll被删)转载 转载自:http://www.bitscn.com/plus/view.p ...
 - c++输入密码以星号代替
			
#include <iostream> #include <string>//注意这里的头文件! #include<conio.h> using namespace ...
 - TCP与UDP的侵略性
			
HTTP必须执行在TCP上吗?SSL必须执行在TCP上吗?...实际上HTTP并没有规定一定要执行在TCP上,甚至FTP也不一定要执行在TCP上!HTTP或者FTP仅仅是说底层信道要保证数据的按序传输 ...
 - redis内存管理代码的目光
			
zmalloc.h /* zmalloc - total amount of allocated memory aware version of malloc() * * Copyright (c) ...
 - 怎么样ubuntu 64 11.04 在执行32位程序
			
上网一查非常多的信息,头发上的今天ubuntu 64 11.04 在执行32位程序安装ia32-libs包,可执行例如,下面的命令.但提示无法安装 apt-get install ia32-libs ...
 - Codeforces Round #257 (Div. 1)449A - Jzzhu and Chocolate(贪婪、数学)
			
主题链接:http://codeforces.com/problemset/problem/449/A ------------------------------------------------ ...
 - struts1吊牌<logic:iterate>
			
<logic:iterate>主要用于处理网页上的输出集合,集合是其中一般下列之一: 1. java对象的数组 2. ArrayList.Vector.HashMap等 具体使用方法请參考 ...
 - ContentProvider总结(Android)
			
ContentProvider 1.适用场景 1) ContentProvider为存储和读取数据提供了统一的接口 2) 使用ContentProvider,应用程序能够实现数据共享 3) andro ...
 - Linux内核分析(二)----内核模块简介|简单内核模块实现
			
原文:Linux内核分析(二)----内核模块简介|简单内核模块实现 Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某 ...
 - CSDN博客ByeBye
			
情绪csdn定制博客博客是不够的,没有足够的光.对于我这种极简的人,不合适. 我们不打算更新的博客. 至http://blog.edagarli.com/ 版权声明:本文博主原创文章.博客,未经同意不 ...