优化ifelse ifelse优化

以面向对象的思维来优化ifelse代码,使得代码既优雅又不增加逻辑判断,还能利于未来业务的扩展,是一举多得的好事。
对于一般业务多数时候我们会在程序里写上大量的ifelse分支
例如:
代码段1,查询语句的拼接

if (req.getAge() != null) {
	    if(req.getType().equals(Integer.valueOf(1))) {
		sql.append(" AND age > :ageNum");
	    }
	    if(req.getType().equals(Integer.valueOf(2))) {
		sql.append(" AND age >= :ageNum");
	    }
	    if(req.getType().equals(Integer.valueOf(3))) {
		sql.append(" AND age < :ageNum");
	    }
	    if(req.getType().equals(Integer.valueOf(4))) {
		sql.append(" AND age <= :ageNum");
	    }
	    if(req.getType().equals(Integer.valueOf(5))) {
		sql.append(" AND age = :ageNum");
	    }
	}

上面的代码段产生的业务场景是这样的
在这里插入图片描述
在多数查询业务下会有如上的条件选择
业务场景下那段代码实在是非常丑陋,并且有双层if ,对于修改来说也是很不友好。
既然java是面向对象语言,那我们就从面向对象思维来优化。将
Integer类型的type和符号“<”,"<="等看成一组枚举对象
如:

private enum TypeSymbolEnum{
	LT(1,"<"),
	LE(2,"<="),
	GT(3,">"),
	GE(4,">="),
	EQ(5,"=")
	;
	private String symbol;
	private Integer type;
	private TypeSymbolEnum(Integer type,String symbol) {
	    this.type = type;
	    this.symbol = symbol;
	}
	public String toString(){
	    return this.symbol;
	}
	public Integer getType() {
	    return this.type;
	}
 }

将这个枚举类放到请求参数类里

@Data
@EqualsAndHashCode(callSuper=false)
public class QueryParameterReq  {
    
    //年龄可以选择>、>=、<、<=、=
    private Integer age=0;
    private Integer ageType;
   
    private static Map<Integer,TypeSymbolEnum> typeSymbolEnumMap = new HashMap<>();
    static {
	typeSymbolEnumMap.put(TypeSymbolEnum.LT.getType(), TypeSymbolEnum.LT);
	typeSymbolEnumMap.put(TypeSymbolEnum.LE.getType(), TypeSymbolEnum.LE);
	typeSymbolEnumMap.put(TypeSymbolEnum.GT.getType(), TypeSymbolEnum.GT);
	typeSymbolEnumMap.put(TypeSymbolEnum.GE.getType(), TypeSymbolEnum.GE);
	typeSymbolEnumMap.put(TypeSymbolEnum.EQ.getType(), TypeSymbolEnum.EQ);
    }
    
 private enum TypeSymbolEnum{
	LT(1,"<"),
	LE(2,"<="),
	GT(3,">"),
	GE(4,">="),
	EQ(5,"=")
	;
	private String symbol;
	private Integer type;
	private TypeSymbolEnum(Integer type,String symbol) {
	    this.type = type;
	    this.symbol = symbol;
	}
	public String toString(){
	    return this.symbol;
	}
	public Integer getType() {
	    return this.type;
	}
    }
    public String getTypeSymbol() {
	return this.typeSymbolEnumMap.get(this.getAgeType()) == null?TypeSymbolEnum.GE.toString():this.typeSymbolEnumMap.get(this.getAgeType()).toString();
    }

代码段1就可以改为如下代码段
代码段2

if (req.getAge() != null) {
	    sql.append(" AND age ").append(req.getTypeSymbol()).append(" :ageNum ");
	}

查询语句的拼接代码立即由蓬头垢面,衣衫褴褛,邋里邋遢的乞丐模样变得神清气爽,玉树临风的帅小伙。
上面优化的过程主要是思想上的转变,由原来过程化的思维转向面向对象。
总结:遇到大量ifelse代码块时,使用map优化。


版权声明:本文为weixin_44200656原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。