<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1669字,需瀏覽 4分鐘

           ·

          2021-11-30 02:28


          • 前言
            • 優(yōu)化方案一:提前return,去除不必要的else
            • 優(yōu)化方案二:使用條件三目運算符
            • 優(yōu)化方案三:使用枚舉
            • 優(yōu)化方案四:合并條件表達式
            • 優(yōu)化方案五:使用 Optional
            • 優(yōu)化方案六:表驅動法
            • 優(yōu)化方案七:優(yōu)化邏輯結構,讓正常流程走主干
            • 優(yōu)化方案八:策略模式+工廠方法消除if else
          • 參考與感謝



          前言

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

          方案。

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

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

          優(yōu)化前:

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

          優(yōu)化后:

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

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

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

          優(yōu)化前:

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

          優(yōu)化后:

          int?price?=?condition?80:100;

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

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

          優(yōu)化前:

          String?OrderStatusDes;
          if(orderStatus==0){
          ????OrderStatusDes?="訂單未支付";
          }else?if(OrderStatus==1){
          ????OrderStatusDes?="訂單已支付";
          }else?if(OrderStatus==2){
          ???OrderStatusDes?="已發(fā)貨";?
          }
          ...

          優(yōu)化后:

          先定義一個枚舉:


          public?enum?OrderStatusEnum?{
          ????UN_PAID(0,"訂單未支付"),PAIDED(1,"訂單已支付"),SENDED(2,"已發(fā)貨"),;
          ????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邏輯分支,可以優(yōu)化為一行代碼:

          StringOrderStatusDes=?OrderStatusEnum.0f(orderStatus).getDesc();

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

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

          優(yōu)化前:

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

          優(yōu)化后:

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

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

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

          優(yōu)化前:

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

          優(yōu)化后:

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

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

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

          優(yōu)化前:

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

          優(yōu)化后:

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

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

          優(yōu)化前:

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

          優(yōu)化后:

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

          將條件反轉使異常情況先退出,讓正常流程維持在主干流程,可以讓代碼結構更加清晰。

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

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

          ????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();
          ????String?getMedalType();
          }

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

          //守護勛章策略實現(xiàn)類
          public?class?GuardMedalServiceImpl?implements?IMedalService?{
          ????@Override
          ????public?void?showMedal()?{
          ????????System.out.println("展示守護勛章");
          ????}
          ????@Override
          ????public?String?getMedalType()?{
          ????????return?"guard";
          ????}
          }
          //嘉賓勛章策略實現(xiàn)類
          public?class?GuestMedalServiceImpl?implements?IMedalService?{
          ????@Override
          ????public?void?showMedal()?{
          ????????System.out.println("嘉賓勛章");
          ????}
          ????@Override
          ????public?String?getMedalType()?{
          ????????return?"guest";
          ????}
          }
          //VIP勛章策略實現(xiàn)類
          public?class?VipMedalServiceImpl?implements?IMedalService?{
          ????@Override
          ????public?void?showMedal()?{
          ????????System.out.println("會員勛章");
          ????}
          ????@Override
          ????public?String?getMedalType()?{
          ????????return?"vip";
          ????}
          }

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

          //勛章服務工產類
          public?class?MedalServicesFactory?{
          ????private?static?final?Map?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();
          ????}
          }

          程序汪資料鏈接

          程序汪接的7個私活都在這里,經驗整理

          Java項目分享 最新整理全集,找項目不累啦 06版

          堪稱神級的Spring Boot手冊,從基礎入門到實戰(zhàn)進階

          臥槽!字節(jié)跳動《算法中文手冊》火了,完整版 PDF 開放下載!

          臥槽!阿里大佬總結的《圖解Java》火了,完整版PDF開放下載!

          字節(jié)跳動總結的設計模式 PDF 火了,完整版開放下載!


          歡迎添加程序汪個人微信 itwang009? 進粉絲群或圍觀朋友圈

          瀏覽 74
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品无人国产偷自产在线 | 欧美区亚洲区 | 玖玖热这里只有精品 | 亚洲成人无码AV | 黑人借宿与人妻羽月希 |