Восемь решений для оптимизации кода if-else

Java

предисловие

Если в коде много if-else, его сложнее читать и поддерживать, и легко вызвать ошибки.Далее в этой статье будут представлены восемь решений для оптимизации кода if-else.

GitHub.com/Я бы хотел 123/Java…

Схема оптимизации 1: вернуть заранее, убрать ненужное еще

Если блок кода if-else содержит оператор return, вы можете рассмотреть возможность возврата заранее, чтобы исключить избыточное else и сделать код более элегантным.

До оптимизации:

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

Оптимизировано:

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

План оптимизации 2: использование условного тернарного оператора

Использование условного тернарного оператора может упростить некоторые операторы if-else, сделав код более кратким и читабельным.

До оптимизации:

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

Оптимизировано:

int price = condition?80:100;

Третий план оптимизации: использовать перечисление

В какой-то момент использование перечисления может также оптимизировать логическую ветвь if-else.табличный подход.

До оптимизации:

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

Оптимизировано:

Сначала определите перечисление

:
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;
    }
}


С помощью перечисления приведенная выше логическая ветвь if-else может быть оптимизирована в одну строку кода.

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

Схема оптимизации 4: объединение условных выражений

Если у вас есть ряд условий, которые возвращают один и тот же результат, вы можете объединить их в одно условное выражение, чтобы сделать логику более понятной.

До оптимизации

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

Оптимизировано

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

План оптимизации пятый: используйте необязательно

Иногда если-иначе больше, это вызвано ненулевым суждением.В настоящее время вы можете использовать необязательный параметр java8 для оптимизации.

До оптимизации:

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

Оптимизировано:

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

Шестой план оптимизации: табличный метод

табличный подход, также известные как управляемые таблицей методы, управляемые таблицей. Табличный подход — это метод, который позволяет вам искать информацию в таблице, не используя много логики (если или Case), чтобы найти ее. Следующая демонстрация абстрагирует карту в таблицу и ищет информацию в карте без лишних логических операторов.

До оптимизации:

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

Оптимизировано:

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);

Седьмой план оптимизации: оптимизировать логическую структуру и позволить обычному процессу взять на себя основу

До оптимизации:

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

Оптимизировано:

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

Измените условие так, чтобы ненормальная ситуация вышла первой, и сохраните нормальный процесс в основном процессе, что может сделать структуру кода более понятной.

Восьмой план оптимизации: режим стратегии + фабричный метод устранения, если еще

Предполагая, что требуется обработать соответствующий сервис медалей в соответствии с различными типами медалей, перед оптимизацией имеется следующий код:

    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("展示守护勋章");
    }
    ...

Во-первых, мы абстрагируем каждый блок кода условной логики в публичный интерфейс, мы можем получить следующий код:

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

По каждому логическому условию мы определяем соответствующий класс реализации стратегии, и можно получить следующий код:

//守护勋章策略实现类
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("会员勋章");
    }
}

Затем мы определяем класс фабрики стратегий для управления этими медалями и реализуем класс стратегии следующим образом:

//勋章服务工产类
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);
    }
}

После использования шаблона стратегия + фабрика код становится намного проще, а именно:

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

Ссылка и спасибо

Личный публичный аккаунт

  • Если вы считаете, что это хорошо написано, пожалуйста, поставьте лайк + подпишитесь, спасибо~
  • В то же время, я очень жду, что мои друзья обратят внимание на мой официальный аккаунт, и позже я постепенно представлю более качественные галантерейные товары~ хи хи
  • адрес гитхаба:GitHub.com/Я бы хотел 123/Java…