if-else优化措施

时间:2022-03-22 19:53:36
  1. 条件表达式通常有两种表现形式,第一种:所有分支都是属于正常行为;第二种:条件表达式提供的答案只有一种是正常行为。其他都是不常见的情况。如果两条分支都是正常行为,就应该使用if~else的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。

    function getPayAmount(){
      var result;
      if(isDead) result = deadAmount();
      else{
        if(isSeparated) result = separatedAmount();
    	else{
    	  if(isRetired) result = retiredAmount();
    	  else result = normalPayAmount();
    	}
      }
      return result;
    }

    可以转化为:

    function getPayAmount(){
      if(isDead) return deadAmount();
      if(isSeparated) return separatedAmount();
      if(isRedired) return retiredAmount();
      return normalAmount();
    }
  2. 在条件表达式的每个分支上有着相同的一段执行代码,这段代码跟分支的逻辑无关的时候,将这段重复代码搬移到条件表达式之外。

    if(isSpecialDeal()){
      total = price * 0.95;
      send();
    }else{
      total = price * 0.98;
      send();
    }

    可以转化为:

    if(isSpecialDeal()){
      total = price * 0.95;
    }else{
      total = price * 0.98;
    }
    send();
  3. 如果分支条件过于复杂,那么可以将分支条件提炼出来作为一个独立函数,并提供一个语义化更好的名称用于分支判断中。使用它的优势是使得在分支中的代码可读性更好,以至于我不需要知道具体的分支判断条件,就可以理解代码的意图。

    if(date.before(SUMMER_START) || date.after(SUMMER_END)){
      charge = quantity * _winterRate * _winterServiceCharge;
    }else{
      charge = quantity * _summerRate;
    }

    可以转化为:

    if(notSummer(date)){
      charge = winterCharge(quantity);
    }else{
      charge = summerCharge(quantity);
    }
    
    function notSummer(date){
      return date.before(SUMMER_START) || date.after(SUMMER_END);
    }
    function summerCharge(quantity){
      return quantity * _summerRate;
    }
    function winterCharge(quantity){
      return quantity * _winterRate * _winterServiceCharge;
    }
  4. 合并条件表达式。如果有一系列的条件判断,都得到相同的结果;或者嵌套的条件判断。那么将这些条件合并为一个条件表达式,可能的话将这个合并的表达式提炼为一个独立的函数。

    function disabilityAmount(){
      if(_seniority < 2) return 0;
      if(_monthsDisabled) return 0;
      if(_isPartTime) return 0;
      return 1;
    }

    可以转化为:

    function disabilityAmount(){
      if(_seniority < 2 || _monthsDisabled || _isPartTime) return 0;
      return 1;
    }

    还可以转化为:

    function disabilityAmount(){
      if(isNotEligibleForDisability()) return 0;
      return 1;
    }
    
    function isNotEligibleForDisability(){
      return _seniority < 2 || _monthsDisabled || _isPartTime;
    }
  5. 将条件逻辑反转。有时候使用条件反转的方式,可以很大程度上简化if判断逻辑,特别是在嵌套if判断的时候。

    function getAdjustedCapital(){
      var result = 0;
      if(_capital > 0){
        if(_intRate > 0 && _duration > 0){
          result = (_income / _duration) * ADJ_FACTOR;
    	}
      }
      return result;
    }

    可以转化为:

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

    再简化为:

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