`

《重构》笔记五 简化条件表达式 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 以多态取代条件式

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

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

 

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

分享到:
评论

相关推荐

    PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式

    本文将探讨如何通过重构技术来简化这些表达式,以提高代码的可读性和可维护性。以下是几个关键的重构策略: 1. **Decompose Conditional**:当你发现一个庞大的if-else if-else结构时,可以考虑将其分解为多个独立...

    重构:改善既有代码的设计.[美]Martin Fowler.epub【文字版手机格式】

    9.1 Decompose Conditional(分解条件表达式) 9.2 Consolidate Conditional [removed]合并条件表达式) 9.3 Consolidate Duplicate Conditional Fragments(合并重复的条件片段) 9.4 Remove Control Flag(移除控制...

    重构-改善既有代码的设计

    9.1 Decompose Conditional(分解条件表达式) 238 9.2 Consolidate Conditional Expression(合并条件表达式) 240 9.3 Consolidate Duplicate Conditional Fragments(合并重复的条件片段) 243 9.4 Remove...

    重构改善既有代码的设计

    - 分解条件表达式(Decompose Conditional):将复杂的if或switch条件语句拆分成更小的步骤。 - 合并条件表达式(Consolidate Conditional Expression):如果有多个if语句执行同样的代码,可以将它们合并。 4. *...

    java重构pdf书籍

    - **分解条件式(Decompose Conditional)**:将复杂的条件判断拆分成多个独立的函数,提高代码的可测试性和可理解性。 - **封装集合(Encapsulate Collection)**:将数据集合的管理细节隐藏起来,提供更安全、更便捷的...

    java 重构改善既有代码的设计.pdf

    - 分解条件表达式(Decompose Conditional):将复杂的条件逻辑拆分成更小的部分。 - 封装字段(Encapsulate Field):将字段的访问和修改封装在方法中,使字段对外部不可见。 重构之前,还需要注意以下几点: - ...

    重构-改善既有代码的设计(中文版)

     Decompose Conditional 分解条件语句   Consolidate Conditional Expression 合并条件语句   Consolidate Duplicate Conditional Fragments 合并重复的条件片段   Remove Control Flag 去除控制标志   ...

    重构-改善既有代码的设计+中文版

     Decompose Conditional 分解条件语句   Consolidate Conditional Expression 合并条件语句   Consolidate Duplicate Conditional Fragments 合并重复的条件片段   Remove Control Flag 去除控制标志   ...

    重构改善既有代码的设计.pdf

    书中会介绍多种常见的重构手法,包括但不限于提取方法(Extract Method)、内联方法(Inline Method)、提取类(Extract Class)、内联类(Inline Class)、引入断言(Introduce Assertion)、分解条件表达式...

    重构-改善既有代码的设计 中文版

    9.1 Decompose Conditional(分解条件式) 9.2 Co olidate Conditional Expression(合并条件式) 9.3 Co olidate Duplicate Conditional Fragments (合并重复的条件片段) 9.4 Remove Control Flag(移除控制标记...

    反模式 危机中软件、架构和项目的重构.pdf

    - 分解条件表达式(Decompose Conditional) - 重构条件逻辑(Refactor Conditional Logic) - 重命名(Rename) ### 架构重构 软件架构重构涉及对系统架构的调整,以解决现有的架构问题或更好地适应新的业务需求和...

    重构(1-6).pdf

    7. **分解条件式 (Decompose Conditional)** - **应用场景**:对于复杂的条件判断,通过分解可以使逻辑更加清晰。 - **实现方式**:将复杂的条件表达式拆分成多个较小的条件表达式或方法。 8. **封装群集 ...

    重构 改善既有代码的设计

     Decompose Conditional 分解条件语句   Consolidate Conditional Expression 合并条件语句   Consolidate Duplicate Conditional Fragments 合并重复的条件片段   Remove Control Flag 去除控制标志  ...

    重构——改善既有代码的设计

     Decompose Conditional 分解条件语句   Consolidate Conditional Expression 合并条件语句   Consolidate Duplicate Conditional Fragments 合并重复的条件片段   Remove Control Flag 去除控制标志   ...

    重构,改善既有代码的设计

     Decompose Conditional 分解条件语句   Consolidate Conditional Expression 合并条件语句   Consolidate Duplicate Conditional Fragments 合并重复的条件片段   Remove Control Flag 去除控制标志  ...

    重构改善既有代码的设计(PDF)

    6. 用多态代替条件表达式(Replace Conditional with Polymorphism):当需要使用条件表达式(如if-else或switch)来决定具体的行为时,可以考虑使用多态来代替。这样做可以使行为更加灵活,易于扩展和维护。 7. ...

Global site tag (gtag.js) - Google Analytics