1. 程式人生 > 其它 >讓你的程式碼更優雅,消除程式碼段中煩人的if-else語句

讓你的程式碼更優雅,消除程式碼段中煩人的if-else語句

對於一般業務多數時候我們會在程式裡寫上大量的if-else分支
例如:
程式碼段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 ");
	}

查詢語句的拼接程式碼立即由蓬頭垢面,衣衫襤褸,邋里邋遢的乞丐模樣變得神清氣爽,玉樹臨風的帥小夥。
上面優化的過程主要是思想上的轉變,由原來過程化的思維轉向面向物件。