一 Decompose Conditional 分解条件式
你有一个复杂的的if then else 语句
动机:
程序之中,复杂的条件逻辑是导致复杂度上升的地点之一。一必须编写代码来检查不同的条件分支、根据不同的条件分支来做不同的事情,然后很快你就得到了一串很长的函数。大型函数的自身就会使代码的可读性下降,而条件逻辑则会使代码更难阅读。
做法:
1.将if 段落提炼出来,构成独立的函数
2.将then段落和else段落都提炼出来,各自构成一个独立的函数
3.如果发现嵌套的条件逻辑,我通常会先观察是否可以使用 Replace nested Condiation with AGuardClause。如果不行,才开始分解其中每个条件。
eg
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);
二 Consolidate ConditionalExpression 合并条件式
你有一系列条件测试,都得到相同的结果,将这些测试条件合并,并提炼为一个独立的函数。
动机:如果你发现有这种情况,你就应该使用 logic—AND 和 logical-OR 将他们合并玩儿一个条件式。
做法:eg
eg。
logical-OR
if(a < 2) return 0; if(b >12 ) return 0; if(c) return 0; //and so on ...
==>
if(a < 2 || b >12 || c) return 0;
=> 合并后可以实施,Extract method
logic-AND
if(a) { if(b >0) { return 1; } } return 0.5;
==>
if(a && b>0) return 1; else return 0.5;
三Consolidate Duplicate Condiation那里Fragments 合并重复的条件片段
在每个条件分支上有相同的代码,将这段代码移到条件表达式之外。
eg。
if(a ) { total = prive * 0.95; semd (total); } else { total = prive * 0.92; semd (total); }
=>
if(a ) { total = prive * 0.95; } else { total = prive * 0.92; } semd (total);
四 remove control Flag 移除控制标志
很简单,用return 或 break 来代替,循环中的逻辑控制
五Replace Nested Conditional with Guard Clause 以卫语句取代嵌套
函数中的条件逻辑让人很难,看清正常的执行路径
动机:条件通常有两种呈现形式:1,所有分支都是正常行为,因该用 if then else 。。。2,条件形式提供的答案只有一种是正常行为,其他都是不常见的情况,就因该单独检查并且返回,这种单独的检查被称为卫语句。
做法:
eg。
想一个薪资系统,其中以特殊的规则处理死亡员工、驻外员工的薪资。这些情况有些不正常但是的却偶尔出现。
private function getPayAmount():Number { var result:Number; if(isDead) result = deadAmount(); else { if(isSeparated) result = separatedAmount(); else { if(isRetired) result = retiredAmount(); else result = notmalAmount(); } } return result; }
=>很显然,这段代码,是在是不愿意多看
private function getPayAmount():Number { if(isDead) return deadAmount(); if(isSeparated) return separatedAmount(); if(isRetired) result = retiredAmount(); return notmalAmount(); }
六 ReplaceConditional WithPolymorphism 以多态取代条件式
你守上有个条件式,她根据对象型别不同而选择不同的行为。
动机:在面向对象的术语中,听上去最高贵的词,非 多态 莫属了。多态最根本的好处就是,如果你需要根据对象不同型别而采取不听的行为,多态使你不必写明显的条件式。
做法:。。。。【保留,这个在实际应用中并不多,如果是处理对象而不是函数的,一般也就是这样作的】