<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代碼的八種方案

          共 1753字,需瀏覽 4分鐘

           ·

          2020-03-09 23:23

          前言

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

          2909e27d676c99a93242be1141729346.webp

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

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

          優(yōu)化前:

          1. if(condition){

          2. //doSomething

          3. }else{

          4. return;

          5. }

          優(yōu)化后:

          1. if(!condition){

          2. return;

          3. }

          4. //doSomething

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

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

          優(yōu)化前:

          1. int price ;

          2. if(condition){

          3. price =80;

          4. }else{

          5. price =100;

          6. }

          優(yōu)化后:

          1. int price = condition?80:100;

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

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

          優(yōu)化前:

          1. StringOrderStatusDes;

          2. if(orderStatus==0){

          3. OrderStatusDes="訂單未支付";

          4. }elseif(OrderStatus==1){

          5. OrderStatusDes="訂單已支付";

          6. }elseif(OrderStatus==2){

          7. OrderStatusDes="已發(fā)貨";

          8. }

          9. ...

          優(yōu)化后:

          先定義一個(gè)枚舉

          1. publicenumOrderStatusEnum{

          2. UN_PAID(0,"訂單未支付"),PAIDED(1,"訂單已支付"),SENDED(2,"已發(fā)貨"),;


          3. privateint index;

          4. privateString desc;


          5. publicint getIndex(){

          6. return index;

          7. }


          8. publicString getDesc(){

          9. return desc;

          10. }


          11. OrderStatusEnum(int index,String desc){

          12. this.index = index;

          13. this.desc =desc;

          14. }


          15. OrderStatusEnum of(int orderStatus){

          16. for(OrderStatusEnum temp :OrderStatusEnum.values()){

          17. if(temp.getIndex()== orderStatus){

          18. return temp;

          19. }

          20. }

          21. returnnull;

          22. }

          23. }

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

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

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

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

          優(yōu)化前

          1. double getVipDiscount(){

          2. if(age<18){

          3. return0.8;

          4. }

          5. if("深圳".equals(city)){

          6. return0.8;

          7. }

          8. if(isStudent){

          9. return0.8;

          10. }

          11. //do somethig

          12. }

          優(yōu)化后

          1. double getVipDiscount(){

          2. if(age<18||"深圳".equals(city)||isStudent){

          3. return0.8;

          4. }

          5. //doSomthing

          6. }

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

          有時(shí)候if-else比較多,是因?yàn)榉强张袛鄬?dǎo)致的,這時(shí)候你可以使用java8的Optional進(jìn)行優(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");

          6. }

          優(yōu)化后:

          1. Optional<String> strOptional =Optional.of("jay@huaxiao");

          2. strOptional.ifPresentOrElse(System.out::println,()->System.out.println("Null"));

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

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

          優(yōu)化前:

          1. if(param.equals(value1)){

          2. doAction1(someParams);

          3. }elseif(param.equals(value2)){

          4. doAction2(someParams);

          5. }elseif(param.equals(value3)){

          6. doAction3(someParams);

          7. }

          8. // ...

          優(yōu)化后:

          1. MapFunction action> actionMappings =newHashMap<>();// 這里泛型 ? 是為方便演示,實(shí)際可替換為你需要的類(lèi)型


          2. // 初始化

          3. actionMappings.put(value1,(someParams)->{ doAction1(someParams)});

          4. actionMappings.put(value2,(someParams)->{ doAction2(someParams)});

          5. actionMappings.put(value3,(someParams)->{ doAction3(someParams)});


          6. // 省略多余邏輯語(yǔ)句

          7. actionMappings.get(param).apply(someParams);

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

          優(yōu)化前:

          1. publicdouble getAdjustedCapital(){

          2. if(_capital <=0.0){

          3. return0.0;

          4. }

          5. if(_intRate >0&& _duration >0){

          6. return(_income / _duration)*ADJ_FACTOR;

          7. }

          8. return0.0;

          9. }

          優(yōu)化后:

          1. publicdouble getAdjustedCapital(){

          2. if(_capital <=0.0){

          3. return0.0;

          4. }

          5. if(_intRate <=0|| _duration <=0){

          6. return0.0;

          7. }


          8. return(_income / _duration)*ADJ_FACTOR;

          9. }

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

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

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

          1. String medalType ="guest";

          2. if("guest".equals(medalType)){

          3. System.out.println("嘉賓勛章");

          4. }elseif("vip".equals(medalType)){

          5. System.out.println("會(huì)員勛章");

          6. }elseif("guard".equals(medalType)){

          7. System.out.println("展示守護(hù)勛章");

          8. }

          9. ...

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

          1. //勛章接口

          2. publicinterfaceIMedalService{

          3. void showMedal();

          4. String getMedalType();

          5. }

          我們根據(jù)每個(gè)邏輯條件,定義相對(duì)應(yīng)的策略實(shí)現(xiàn)類(lèi),可得以下代碼:

          1. //守護(hù)勛章策略實(shí)現(xiàn)類(lèi)

          2. publicclassGuardMedalServiceImplimplementsIMedalService{

          3. @Override

          4. publicvoid showMedal(){

          5. System.out.println("展示守護(hù)勛章");

          6. }

          7. @Override

          8. publicString getMedalType(){

          9. return"guard";

          10. }

          11. }

          12. //嘉賓勛章策略實(shí)現(xiàn)類(lèi)

          13. publicclassGuestMedalServiceImplimplementsIMedalService{

          14. @Override

          15. publicvoid showMedal(){

          16. System.out.println("嘉賓勛章");

          17. }

          18. @Override

          19. publicString getMedalType(){

          20. return"guest";

          21. }

          22. }

          23. //VIP勛章策略實(shí)現(xiàn)類(lèi)

          24. publicclassVipMedalServiceImplimplementsIMedalService{

          25. @Override

          26. publicvoid showMedal(){

          27. System.out.println("會(huì)員勛章");

          28. }

          29. @Override

          30. publicString getMedalType(){

          31. return"vip";

          32. }

          33. }

          接下來(lái),我們?cè)俣x策略工廠類(lèi),用來(lái)管理這些勛章實(shí)現(xiàn)策略類(lèi),如下:

          1. //勛章服務(wù)工產(chǎn)類(lèi)

          2. publicclassMedalServicesFactory{


          3. privatestaticfinalMap<String,IMedalService> map =newHashMap<>();

          4. static{

          5. map.put("guard",newGuardMedalServiceImpl());

          6. map.put("vip",newVipMedalServiceImpl());

          7. map.put("guest",newGuestMedalServiceImpl());

          8. }

          9. publicstaticIMedalService getMedalService(String medalType){

          10. return map.get(medalType);

          11. }

          12. }

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

          1. publicclassTest{

          2. publicstaticvoid main(String[] args){

          3. String medalType ="guest";

          4. IMedalService medalService =MedalServicesFactory.getMedalService(medalType);

          5. medalService.showMedal();

          6. }

          7. }




          推薦閱讀:


          8eae1df6947cde9e86c2c6fe6ee98376.webp喜歡我可以給我設(shè)為星標(biāo)哦8eae1df6947cde9e86c2c6fe6ee98376.webp

          e691ed7f2d39814166438450111074fc.webp

          好文章,我?在看?

          7604c378559edbc57174a630ec44444c.webp
          瀏覽 22
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  日日综合网 | 亚洲午夜在线 | 青娱乐娱乐屏一区 | 操大香蕉在线观看 | 黄片无码视频 |