Para eliminar el if-else por completo, ¡necesita estas 8 soluciones!

Si hay muchos if-else en el código, es difícil de leer y mantener, y es fácil causar errores A continuación, este artículo presentará ocho soluciones para optimizar el código if-else.




Plan de optimización 1: regrese con anticipación para eliminar todo lo innecesario

 

Si el bloque de código if-else contiene una declaración de retorno, puede considerar regresar con anticipación para deshacerse del else adicional y hacer que el código sea más elegante.

 

Antes de la optimización:

if(condition){
    //doSomething
}else{
    return ;
}

 

Optimizado:

if(!condition){
    return ;
}
//doSomething

 

Plan de optimización 2: utilizar un operador ternario condicional

 

El uso de operadores ternarios condicionales puede simplificar algunos if-else, haciendo que el código sea más conciso y legible.

 

Antes de la optimización:

int  price ;
if(condition){
    price = 80;
}else{
    price = 100;
}

 

Optimizado:

int price = condition?80:100;

 

Esquema de optimización 3: usar enumeración

 

En algunos casos, el uso de la enumeración también puede optimizar la rama lógica if-else. Según la comprensión personal, también se puede considerar como un método basado en tablas.

 

Antes de la optimización:

String OrderStatusDes;
if(orderStatus==0){
    OrderStatusDes ="订单未支付";
}else if(OrderStatus==1){
    OrderStatusDes ="订单已支付";
}else if(OrderStatus==2){
   OrderStatusDes ="已发货"; 
}
...

 

Después de la optimización: (primero defina una enumeración)

public enum OrderStatusEnum {
    UN_PAID(0,"订单未支付"),PAIDED(1,"订单已支付"),SENDED(2,"已发货"),;

    private int index;
    private String desc;

    public int getIndex() {
        return index;
    }

    public String getDesc() {
        return desc;
    }

    OrderStatusEnum(int index, String desc){
        this.index = index;
        this.desc =desc;
    }

    OrderStatusEnum of(int orderStatus) {
        for (OrderStatusEnum temp : OrderStatusEnum.values()) {
            if (temp.getIndex() == orderStatus) {
                return temp;
            }
        }
        return null;
    }
}

 

Con la enumeración, la rama lógica if-else anterior se puede optimizar en una línea de código:

String OrderStatusDes = OrderStatusEnum.0f(orderStatus).getDesc();

 

Esquema de optimización 4: combinación de expresiones condicionales

 

Si hay una serie de condiciones que devuelven el mismo resultado, se pueden combinar en una expresión condicional para aclarar la lógica.

 

Antes de la optimización:

 double getVipDiscount() {
        if(age<18){
            return 0.8;
        }
        if("深圳".equals(city)){
            return 0.8;
        }
        if(isStudent){
            return 0.8;
        }
        //do somethig
    }

 

Optimizado:

 double getVipDiscount(){
        if(age<18|| "深圳".equals(city)||isStudent){
            return 0.8;
        }
        //doSomthing
    }

 

Plan de optimización 5: uso opcional

 

A veces hay más if-else debido a un juicio no vacío. En este momento, puede usar el Opcional de java8 para la optimización.

 

Antes de la optimización:

String str = "jay@huaxiao";
if (str != null) {
    System.out.println(str);
} else {
    System.out.println("Null");
}

 

Optimizado:

Optional<String> strOptional = Optional.of("jay@huaxiao");
strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));

 

Plan de optimización 6: método basado en tablas

 

El método basado en tablas también se denomina método basado en tablas y método basado en tablas. El método basado en tablas es un método que le permite encontrar información en la tabla sin tener que usar muchas declaraciones lógicas (si o caso) para encontrarlas.

 

La siguiente demostración resume el mapa en una tabla, busca información en el mapa y guarda declaraciones lógicas innecesarias.

 

Antes de la optimización:

if (param.equals(value1)) {
    doAction1(someParams);
} else if (param.equals(value2)) {
    doAction2(someParams);
} else if (param.equals(value3)) {
    doAction3(someParams);
}
// ...

 

Optimizado:

Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型

// 初始化
actionMappings.put(value1, (someParams) -> { doAction1(someParams)});
actionMappings.put(value2, (someParams) -> { doAction2(someParams)});
actionMappings.put(value3, (someParams) -> { doAction3(someParams)});

// 省略多余逻辑语句
actionMappings.get(param).apply(someParams);

 

Plan de optimización 7: Optimice la estructura lógica y deje que el proceso normal tome la columna vertebral

 

Antes de la optimización:

public double getAdjustedCapital(){
    if(_capital <= 0.0 ){
        return 0.0;
    }
    if(_intRate > 0 && _duration >0){
        return (_income / _duration) *ADJ_FACTOR;
    }
    return 0.0;
}

 

Optimizado:

public double getAdjustedCapital(){
    if(_capital <= 0.0 ){
        return 0.0;
    }
    if(_intRate <= 0 || _duration <= 0){
        return 0.0;
    }

    return (_income / _duration) *ADJ_FACTOR;
}

 

Revertir la condición hace que la situación anormal salga primero, manteniendo el flujo normal en el flujo principal y aclarando la estructura del código.

 

Plan de optimización 8: modo de estrategia + método de fábrica para eliminar si más

 

Suponiendo que el requisito es procesar el servicio de medallas correspondiente de acuerdo con los diferentes tipos de medallas, el siguiente código está disponible antes de la optimización:

    String medalType = "guest";
    if ("guest".equals(medalType)) {
        System.out.println("嘉宾勋章");
     } else if ("vip".equals(medalType)) {
        System.out.println("会员勋章");
    } else if ("guard".equals(medalType)) {
        System.out.println("展示守护勋章");
    }
    ...

 

Primero, abstraemos cada bloque de código lógico condicional en una interfaz pública y podemos obtener el siguiente código:

//勋章接口
public interface IMedalService {
    void showMedal();
}

 

Definimos la clase de implementación de la estrategia correspondiente de acuerdo con cada condición lógica y obtenemos el siguiente código:

//守护勋章策略实现类
public class GuardMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("展示守护勋章");
    }
}
//嘉宾勋章策略实现类
public class GuestMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("嘉宾勋章");
    }
}
//VIP勋章策略实现类
public class VipMedalServiceImpl implements IMedalService {
    @Override
    public void showMedal() {
        System.out.println("会员勋章");
    }
}

 

A continuación, definimos la clase de fábrica de estrategias para gestionar estas medallas para implementar la clase de estrategia, de la siguiente manera:

//勋章服务工产类
public class MedalServicesFactory {

    private static final Map<String, IMedalService> map = new HashMap<>();
    static {
        map.put("guard", new GuardMedalServiceImpl());
        map.put("vip", new VipMedalServiceImpl());
        map.put("guest", new GuestMedalServiceImpl());
    }
    public static IMedalService getMedalService(String medalType) {
        return map.get(medalType);
    }
}

 

Después de usar la estrategia + patrón de fábrica, el código se vuelve mucho más simple, de la siguiente manera:

public class Test {
    public static void main(String[] args) {
        String medalType = "guest";
        IMedalService medalService = MedalServicesFactory.getMedalService(medalType);
        medalService.showMedal();
    }
}

Supongo que te gusta

Origin blog.csdn.net/baidu_39322753/article/details/104780459
Recomendado
Clasificación