zoukankan      html  css  js  c++  java
  • 关于if-else代码的优化

    if-else分支代码在我们日常开发中基本上是最常用的逻辑,但是,经常在if-else代码过多的情况下,代码会变得特别臃肿,并且代码的可扩展性会变得不好,所以,优化if-else代码逻辑是很有必要的。以下介绍几种我在日常工作中比较常用的优化手段

    1.通过switch-case优化

    这是最简单的优化方式,基本上每一个程序员都能运用。下面举个例子:

     1 int value = this.getValue();
     2 if(value==1) {
     3      // TODO somethings
     4 } else if(value==2) {
     5      // TODO somethings
     6 } else if(value==3) {
     7      // TODO somethings
     8 } else {
     9      // TODO somethings
    10 }

    上面的代码,可以优化为:

     1 int value = this.getValue();
     2 switch (value) {
     3     case 1:
     4 // TODO somethings
     5 break;
     6     case 2:
     7 // TODO somethings
     8 break;
     9     case 3:
    10 // TODO somethings
    11 break;
    12     default:
    13 // TODO somethings
    14 }

    这种优化,除了代码性能上有极小的优化之外,基本是换汤不换药,代码依然是很臃肿,可扩展性一样不好,所以,不建议用这种优化方式

    2.使用条件三目运算符

    条件三目运算符基本上每一个程序员也都知道,但是,应用在日常开发上的人很少,这玩意儿经常会被人所忽略。

    比如下面代码:

    1 int value = 0;
    2 if(condition) {
    3     value=1;
    4 } else {
    5     value=2;
    6 }

    可以优化成:

    1 int value = condition ? 1 : 2;

    经过这样优化,代码立刻变得清晰明了

    3.异常/return/continue/break 语句前置

    例如代码:

    if(condition) {
        // TODO somethings
    } else {
        return;
    }
    
    if(condition) {
        // TODO somethings
    } else {
        throw new Exception();  
    }
    
    while(condition1) {
        if(condition2) {
            // TODO somethings
        } else {
            continue// or break
        }
    }

    可以分别优化成

     1 if(!condition) {
     2     return;
     3 } 
     4 // TODO somethings
     5 
     6 if(!condition) {
     7    throw new Exception();   
     8 }
     9 // TODO somethings
    10 
    11 while(condition1) {
    12     if(!condition2) {
    13         continue; // or break
    14     } 
    15     // TODO somethings
    16 }

    4.使用表驱动法优化if-else分支

    这是优化if-else的利器,也是我在日常工作中最经常使用的一种优化方法。使用了这种方法,真正做到了把if-else变成配置化。表驱动法优化也很简单,我们看下面一段代码:

     1 int key = this.getKey();
     2 int value = 0;
     3 if(key==1) {
     4     value = 1;
     5 } else if(key==2) {
     6     value = 2;
     7 } else if(key==3) {
     8     value = 3;
     9 } else {
    10     throw new Exception();
    11 }

    这段代码可以优化成:

     1 Map map = new HashMap();
     2 map.put(1,1); 
     3 map.put(2,2); 
     4 map.put(3,3); 
     5 
     6 int key = this.getKey(); 
     7 if(!map.containsKey(key)) { 
     8     throw new Exception(); 
     9 } 
    10 
    11 int value = map.get(key);
     


    这种优化方法,基本把if-else逻辑消灭了。当增加另一个值时,直接修改map,而不需要再增加分支
    需要注意的是,这种方法不仅仅适合单个值赋值,里面的value还可以是方法名,利用反射进行调用

    5.抽象出另一个方法,优化该方法的if-else逻辑
    例如:

     1 public void fun1() {
     2 
     3     if(condition1) {
     4         // TODO sometings1
     5         if(condition2) {
     6             // TODO something2
     7             if(condition3) {
     8                 // TODO something3
     9             }
    10         }
    11     }
    12 
    13     // TODO something4
    14 
    15 }

    这段代码,if的逻辑很深,让阅读代码的人很难进行下去。下面我们抽象出另一个方法,进行优化

     1 public void fun1() {
     2 
     3     this.fun2();
     4 
     5     // TODO something4
     6 
     7 }
     8 
     9 private void fun2() {
    10     if(!condition1) {
    11         return;
    12     }
    13     // TODO sometings1
    14 
    15     if(!condition2) {
    16         return;
    17     }
    18     // TODO something2
    19 
    20     if(!condition3) {
    21         return;
    22     }
    23     // TODO something3
    24 }
     


    6.用设计模式优化if-else逻辑
    例如用工厂模式、模板方法模式(就是多态)进行优化,这类方法网上有很多讲解,我就不班门弄斧了

    以上是我在工作中经常使用的优化if-else的方法,如果有错误或者还有其他的方法,还望大家不吝赐教

  • 相关阅读:
    Hyper-V中的VM如何使用Pass-through Disk
    LDF文件丢失, 如何仅用MDF文件恢复数据库呢?
    PowerShell中的一个switch的例子
    NetBiosDomainNamesEnabled与SharePoint User Profile Service Application
    在Windows Server 2008 R2上安装Exchange 2013过程中遇到的一些问题
    C语言位域精解(转)
    uniq命令 (转)
    sort命令
    curl命令(测试连接命令)
    C10K——千万级并发实现的秘密:内核不是解决方案,而是问题所在!(转)
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872156.html
Copyright © 2011-2022 走看看