吐槽一下项目中的代码坏味道:滥用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 这个反射的工具类 ...
随机推荐
- 第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器
原文:第十七章--配置SQLServer(1)--为SQLServer配置更多的处理器 前言: SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置.微软建 ...
- Direct3D 使用质地
关于使用质地 1 创建纹理 2 纹理寻址模式 3 纹理过滤 1 创建纹理 <1> D3DXCreateTexture功能 创建一个空的纹理. HRESULT D3DXCreateText ...
- AM335x(TQ335x)学习笔记——u-boot-2014.10移植
根据最近移植u-boot-2014.10至TQ335x,基于这样的假设am335x evm移植.不是很多地方需要改变. 因为TI的am335x evm开发了使用eeprom船上保存配置信息.它使用不同 ...
- 【原】谈谈promise
最近在看<你不知道的javascript中卷>,发觉作者花了基本一半的篇幅去讲异步和promise,觉得有必要总结一下. 其实本文的目的是想手写一个Promise的,无奈总结着总结着发觉篇 ...
- Team Foundation Server 2015使用教程--团队项目删除
- ASP.NET MVC:01理解MVC模式
ASP.NET MVC是ASP.NET Web应用程序框架,以MVC模式为基础. MVC:Model View Controller 模型-视图-控制器Model(模型):负责对数据库的存取View( ...
- css3 的box-sizing属性理解
* { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } 有时候在某些项目中 ...
- cocos2dx 子弹飞作为一个例子来解释解酒效果类CCMotionStreak
感谢点评与关注,欢迎转载与分享. 勤奋努力,持之以恒! 在游戏开发中,有时会须要在某个游戏对象上的运动轨迹上实现渐隐效果.比方子弹的运动轨迹,假设不借助引擎的帮助.这样的效果则须要通过大量的图片来实现 ...
- ural 1932 The Secret of Identifier (容斥原理)
标题效果: 计算到n字符串. 精确到只是有一个不同的字符,两个不同的字符.三个不同的字符,四对不同的字符. IDEAS: 枚举状态. dp[i] [j] ...当前串取出 i 状态下的全部字符转化成十 ...
- Python 提取Twitter转发推文的元素(比方username)
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-24 @author: guaguastd @name: e ...