开发规约-魔法值问题

655 阅读3分钟

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 为什么要消除魔法值

  • 对于大型项目中通常会有多个开发者同时进行,每位开发者都有自己的代码风格,当所有代码风格杂糅在一起后,大大增加了代码的阅读性,为了统一这个问题,就需要进行代码的规范化,提高代码的可读性,也预防后期维护成本。

  • 对于个人的独立小项目,只要保证代码的逻辑没错,一般来说可以,不做代码规范,但总体来说后期维护的话,进行代码规范化的项目维护起来更加容易