1- 问题
在开发中经常会遇到不明确的数值比如:
if(flage == '5'){
.......
}
上述语句在运行的时候不会出现任何报错信息, 但在阅读代码的时候没办法判断 '5' 代表的意义
2- 魔法值
2-1 什么是魔法值
魔法值,也叫做魔法数值、魔法数字,通常是指在代码编写时莫名出现的数字, 无法直接判断数值代表的含义,必须通过联系代码上下文分析才可以明白, 严重降低了代码的可读性。 除数字之外,代码中作为key值的常量字符串也被认为是魔法值, 尽管其表示含义比数值较为清晰,但是仍然会产生不规范问题。
2-2 魔法值的出现
在对数据的处理过程中,为了充分利用机器的存储性能, 数据库存储时往往使用更加简单的数值来代表复杂的名词含义 如使用1、2、3、4等数值来代表状态信息,0、1来代表false和true等。
2-3 魔法值危害
除了代码阅读不直观外,魔法值还可能造成以下问题的发生:
- 数值使用不规范,多处使用不统一,修改时工作量大且容易遗漏
- 数值使用错误,程序不产生异常,但业务逻辑数据出现问题
- 常量字符串作为key时拼写错误,key值无对应value,导致数据异常或缓存无法命中
3 解决办法
3-1 定义常量
仅在当前类中使用或在方法内部使用的值, 可以通过定义静态常量的方式来避免魔法值的出现。 如下使用定义静态常量的方式替换掉代码中的魔法值:
public static final String Flag = "1";
public static final String NAME = "name";
if(!Flag......){
}
3-2 枚举类
枚举类是另一种更规范的消除魔法值的方法,使用时需要定义一个枚举类,并为类定义属性和构造方法等。枚举类能够约束静态常量的定义规范,提供统一格式的静态常量值,在统一异常等内容红广泛使用。 如下:
public enum CommonCodeEnum{
// '状态信息(1-未审核,2-已审核,3-审核通过, 4-审核作废)'
STATUS_INFO_1(1, "未审核"),
STATUS_INFO_2(2, "已审核"),
STATUS_INFO_3(3, "审核通过"),
STATUS_INFO_4(4, "审核作废");
private int code;
private String caption;
ComnCodeEnum(int code, String caption) {
this.code = code;
this.caption = caption;
}
public int code() {
return code;
}
public String caption(){
return caption;
}
}
4 为什么要消除魔法值
-
对于大型项目中通常会有多个开发者同时进行,每位开发者都有自己的代码风格,当所有代码风格杂糅在一起后,大大增加了代码的阅读性,为了统一这个问题,就需要进行代码的规范化,提高代码的可读性,也预防后期维护成本。
-
对于个人的独立小项目,只要保证代码的逻辑没错,一般来说可以,不做代码规范,但总体来说后期维护的话,进行代码规范化的项目维护起来更加容易