《重构》笔记五 简化条件表达式 Decompose Conditional

一 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 以多态取代条件式

你守上有个条件式,她根据对象型别不同而选择不同的行为。

动机:在面向对象的术语中,听上去最高贵的词,非 多态 莫属了。多态最根本的好处就是,如果你需要根据对象不同型别而采取不听的行为,多态使你不必写明显的条件式。

 

做法:。。。。【保留,这个在实际应用中并不多,如果是处理对象而不是函数的,一般也就是这样作的】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值