-
条件表达式通常有两种表现形式,第一种:所有分支都是属于正常行为;第二种:条件表达式提供的答案只有一种是正常行为。其他都是不常见的情况。如果两条分支都是正常行为,就应该使用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(); }
-
在条件表达式的每个分支上有着相同的一段执行代码,这段代码跟分支的逻辑无关的时候,将这段重复代码搬移到条件表达式之外。
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();
-
如果分支条件过于复杂,那么可以将分支条件提炼出来作为一个独立函数,并提供一个语义化更好的名称用于分支判断中。使用它的优势是使得在分支中的代码可读性更好,以至于我不需要知道具体的分支判断条件,就可以理解代码的意图。
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; }
-
合并条件表达式。如果有一系列的条件判断,都得到相同的结果;或者嵌套的条件判断。那么将这些条件合并为一个条件表达式,可能的话将这个合并的表达式提炼为一个独立的函数。
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; }
-
将条件逻辑反转。有时候使用条件反转的方式,可以很大程度上简化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; }