自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

優(yōu)化if-else代碼的八種方案

開發(fā) 后端 開發(fā)工具
代碼中如果if-else比較多,閱讀起來比較困難,維護起來也比較困難,很容易出bug,接下來,本文將介紹優(yōu)化if-else代碼的八種方案。

 [[433207]]

前言

代碼中如果if-else比較多,閱讀起來比較困難,維護起來也比較困難,很容易出bug,接下來,本文將介紹優(yōu)化if-else代碼的八種方案。

 

優(yōu)化方案一:提前return,去除不必要的else

如果if-else代碼塊包含return語句,可以考慮通過提前return,把多余else干掉,使代碼更加優(yōu)雅。

優(yōu)化前: 

  1. if (condition) {  
  2.     //doSomething  
  3. } else {  
  4.     return;  

優(yōu)化后: 

  1. if(!condition){  
  2.     return;  
  3.  
  4. //doSomething  

優(yōu)化方案二:使用條件三目運算符

使用條件三目運算符可以簡化某些if-else,使代碼更加簡潔,更具有可讀性。

優(yōu)化前: 

  1. int price;  
  2. if (condition) {  
  3.     price = 80 
  4. } else {  
  5.     price = 100 

優(yōu)化后: 

  1. int price = condition ? 80 : 100;  

優(yōu)化方案三:使用枚舉

在某些時候,使用枚舉也可以優(yōu)化if-else邏輯分支,按個人理解,它也可以看作一種表驅(qū)動方法。

優(yōu)化前: 

  1. String OrderStatusDes;  
  2. if (orderStatus == 0) {  
  3.     OrderStatusDes = "訂單未支付" 
  4. } elseif ( OrderStatus == 1 ) {  
  5.     OrderStatusDes = "訂單已支付" 
  6. } elseif ( OrderStatus == 2 ) {  
  7.     OrderStatusDes = "已發(fā)貨" 
  8.  
  9. ... 

優(yōu)化后:

先定義一個枚舉 

  1. public enum OrderStatusEnum {  
  2.       UN_PAID(0, "訂單未支付"),  
  3.       PAIDED(1, "訂單已支付"),  
  4.       SENDED(2, "已發(fā)貨"), 
  5.       ;  
  6.       private int index;  
  7.       private String desc;  
  8.       public int getIndex() {  
  9.           return index;  
  10.       }  
  11.       public String getDesc() {  
  12.           return desc;  
  13.       }  
  14.       OrderStatusEnum(int index, String desc) {  
  15.           this.index = index;  
  16.           this.desc = desc;  
  17.       }  
  18.       OrderStatusEnum of(int orderStatus) {  
  19.           for (OrderStatusEnum temp : OrderStatusEnum.values()) {  
  20.               if (temp.getIndex() == orderStatus) {  
  21.                   return temp;  
  22.               }  
  23.           }  
  24.           return null;  
  25.       }  
  26.   } 

有了枚舉之后,以上if-else邏輯分支,可以優(yōu)化為一行代碼 

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

優(yōu)化方案四:合并條件表達式

如果有一系列條件返回一樣的結(jié)果,可以將它們合并為一個條件表達式,讓邏輯更加清晰。

優(yōu)化前 

  1. double getVipDiscount () {  
  2.   if (age < 18) {  
  3.       return 0.8;  
  4.   } 
  5.   if ("深圳".equals(city)) {  
  6.       return 0.8;  
  7.   }  
  8.   if (isStudent) {  
  9.       return 0.8;  
  10.   }  
  11.   //do somethig  

優(yōu)化后 

  1. double getVipDiscount(){  
  2.     if (age< 18 || "深圳".equals(city)||isStudent){  
  3.         return 0.8;  
  4.     }  
  5.     //doSomthing  
  6.  

優(yōu)化方案五:使用 Optional

有時候if-else比較多,是因為非空判斷導致的,這時候你可以使用java8的Optional進行優(yōu)化。

優(yōu)化前: 

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

優(yōu)化后: 

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

優(yōu)化方案六:表驅(qū)動法

表驅(qū)動法,又稱之為表驅(qū)動、表驅(qū)動方法。表驅(qū)動方法是一種使你可以在表中查找信息,而不必用很多的邏輯語句(if或case)來把它們找出來的方法。以下的demo,把map抽象成表,在map中查找信息,而省去不必要的邏輯語句。

優(yōu)化前: 

  1. if (param.equals(value1)) {  
  2.     doAction1(someParams);  
  3. } else if (param.equals(value2)) {  
  4.     doAction2(someParams);  
  5. } else if (param.equals(value3)) {  
  6.     doAction3(someParams);  
  7.  
  8. // ... 

優(yōu)化后: 

  1. Map<?, Function<?> action> actionMappings = new HashMap<>();  
  2. // 這里泛型 ? 是為方便演示,實際可替換為你需要的類型  
  3. // 初始化  
  4. actionMappings.put(value1, (someParams) -> {  
  5.     doAction1(someParams)  
  6. });  
  7. actionMappings.put(value2, (someParams) -> {  
  8.     doAction2(someParams)  
  9. });  
  10. actionMappings.put(value3, (someParams) -> {  
  11.     doAction3(someParams)  
  12. });  
  13. // 省略多余邏輯語句  
  14. actionMappings.get(param).apply(someParams); 

優(yōu)化方案七:優(yōu)化邏輯結(jié)構(gòu),讓正常流程走主干

優(yōu)化前: 

  1. public double getAdjustedCapital () {  
  2.     if (_capital <= 0.0) {  
  3.         return 0.0;  
  4.     }  
  5.     if (_intRate > 0 && _duration > 0) {  
  6.         return (_income / _duration) * ADJ_FACTOR;  
  7.     }  
  8.     return 0.0;  

優(yōu)化后: 

  1. public double getAdjustedCapital () {  
  2.     if (_capital <= 0.0) {  
  3.         return 0.0;  
  4.     }  
  5.     if (_intRate <= 0 || _duration <= 0) {  
  6.         return 0.0; 
  7.     }  
  8.     return (_income / _duration) * ADJ_FACTOR;  

將條件反轉(zhuǎn)使異常情況先退出,讓正常流程維持在主干流程,可以讓代碼結(jié)構(gòu)更加清晰。 

優(yōu)化方案八:策略模式+工廠方法消除if else

假設(shè)需求為,根據(jù)不同勛章類型,處理相對應的勛章服務,優(yōu)化前有以下代碼: 

  1. String medalType = "guest" 
  2. if ("guest".equals(medalType)) {  
  3.     System.out.println("嘉賓勛章");  
  4. } else if ("vip".equals(medalType)) {  
  5.     System.out.println("會員勛章");  
  6. } else if ("guard".equals(medalType)) {  
  7.     System.out.println("展示守護勛章");  
  8.  
  9. ... 

首先,我們把每個條件邏輯代碼塊,抽象成一個公共的接口,可以得到以下代碼: 

  1. //勛章接口  
  2. public interface IMedalService {  
  3.     void showMedal ();  
  4.     String getMedalType ();  

我們根據(jù)每個邏輯條件,定義相對應的策略實現(xiàn)類,可得以下代碼: 

  1. //守護勛章策略實現(xiàn)類  
  2. public class  GuardMedalServiceImpl implements IMedalService {  
  3.     @Override  
  4.     public void showMedal() {  
  5.         System.out.println("展示守護勛章");  
  6.     }  
  7.     @Override  
  8.     public String getMedalType() {  
  9.         return "guard";  
  10.     }  
  11.  
  12. //嘉賓勛章策略實現(xiàn)類  
  13. public class GuestMedalServiceImpl implements IMedalService {  
  14.     @Override  
  15.     public void showMedal() {  
  16.         System.out.println("嘉賓勛章");  
  17.     }  
  18.     @Override  
  19.     public String getMedalType() {  
  20.         return "guest";  
  21.     }  
  22.  
  23. //VIP勛章策略實現(xiàn)類  
  24. public class VipMedalServiceImpl implements IMedalService {  
  25.     @Override  
  26.     public void showMedal() {  
  27.         System.out.println("會員勛章");  
  28.     }  
  29.     @Override  
  30.     public String getMedalType() {  
  31.         return "vip";  
  32.     }  

接下來,我們再定義策略工廠類,用來管理這些勛章實現(xiàn)策略類,如下: 

  1. //勛章服務工產(chǎn)類  
  2. public class MedalServicesFactory {  
  3.     private static final Map<String, IMedalService> map = new HashMap<>();  
  4.     static {  
  5.         map.put("guard", new GuardMedalServiceImpl());  
  6.         map.put("vip", new VipMedalServiceImpl());  
  7.         map.put("guest", new GuestMedalServiceImpl());  
  8.     }  
  9.     public static IMedalService getMedalService(String medalType) {  
  10.         return map.get(medalType);  
  11.     }  
  12.  
  13. ... 

使用了策略+工廠模式之后,代碼變得簡潔多了,如下: 

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String medalType = "guest" 
  4.         IMedalService medalService = MedalServicesFactory.getMedalService(medalType);  
  5.         medalService.showMedal();  
  6.     }  
  7.  

 

責任編輯:龐桂玉 來源: Hollis
相關(guān)推薦

2013-03-06 10:28:57

ifJava

2020-05-13 14:15:25

if-else代碼前端

2020-04-20 15:40:03

if-elseJava優(yōu)化

2020-03-11 08:00:12

if-else優(yōu)化運算符

2024-04-26 08:58:54

if-else代碼JavaSpring

2024-03-25 10:00:00

C++編程else

2023-06-02 07:30:24

If-else結(jié)構(gòu)流程控制

2025-04-24 08:40:00

JavaScript代碼return語句

2024-06-18 18:36:03

2021-04-13 06:39:13

代碼重構(gòu)code

2021-03-10 07:20:43

if-else靜態(tài)代碼

2024-04-07 10:13:57

C++代碼if-else

2022-11-04 11:18:16

代碼優(yōu)化可讀性

2024-11-04 09:41:47

2020-10-22 09:20:22

SQLNoSQL 數(shù)據(jù)庫

2022-07-11 08:16:55

策略模式if-else

2020-04-09 08:29:50

編程語言事件驅(qū)動

2020-07-17 13:01:44

If-Else代碼編程

2020-12-15 09:31:58

CTOif-else代碼

2022-06-14 10:49:33

代碼優(yōu)化Java
點贊
收藏

51CTO技術(shù)棧公眾號