以面向对象的思维来优化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版权协议,转载请附上原文出处链接和本声明。