讓你的程式碼更優雅,消除程式碼段中煩人的if-else語句
阿新 • • 發佈:2021-04-24
對於一般業務多數時候我們會在程式裡寫上大量的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 ");
}
查詢語句的拼接程式碼立即由蓬頭垢面,衣衫襤褸,邋里邋遢的乞丐模樣變得神清氣爽,玉樹臨風的帥小夥。
上面優化的過程主要是思想上的轉變,由原來過程化的思維轉向面向物件。