zoukankan      html  css  js  c++  java
  • 【重构.改善既有代码的设计】9、简化条件表达式

    简化条件表达式

    Decompose Conditional(分解条件式)

    你有一个复杂的条件(if-then-else)语句。 从if、then、else 三个段落中分别提炼出独立函数。

    分解为多个独立函数,根据每个小块代码的用 途,为分解而得的新函数命名,并将原函数中对应的代码替换成「对新建函数的调用」,从而更清楚地表达自己的意图。

    对于条件逻辑,[将每个分支条件分解,形成新函数」还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。

    Consolidate Conditional Expression(合并条件式)

    你有一系列条件测试,都得到相同结果。

    将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。

    比如:入参检测。

    Consolidate Duplicate Conditional Fragments(合并重复的条件片段)

    在条件式的每个分支上有着相同的一段代码。

    将这段重复代码搬移到条件式之外。

    Remove Control Flag(移除控制标记)

    在一系列布尔表达式(boolean expressions)中,某个变量带有「控制标记」(control flag)的作用。

    以break 语句或return 的语句取代控制标记。

    当然,如果这些语句并不能取到该有的效果,还是要控制标记。

    Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件式)

    什么叫卫语句? if(false)return; 什么叫不是卫语句? if(ture){xxxxx};

    目的:逻辑清晰。

    Replace Conditional with Polymorphism(以多态取代条件式)

    取代switch大法。

    Introduce Null Object(引入Null 对象)

    将null value (无效值)替换为null object(无效物)。

    就是尽量不用null,而用一个内容为null的可以访问的Object。

    特别有用的地方:list,如果是null,则要判断,如果是空list,则不需要判断,但遍历仍然不会做事情。

    但对一个普通类,如何获取一个Null对象?创建一个Null前缀的子类,这个类的方法要注意适配下。当然,这就变的复杂了起来,所以要衡量是否需要这么做。

    Introduce Assertion(引入断言)

    注意断言不要滥用,

    它只应该用于一定必须为真的地方,而不是应该为真的地方。

    原作者的总结

    条件逻辑(conditional logic)有可能十分复杂,因此本章提供一些重构手法,专门用来简化它们。

    其中一项核心重构就是 Decompose Conditional ,可将一个复杂的条件逻辑分成若干小块。这项重构很重要,因为它使得「转辙逻辑」(switching logic )和「操作细节」(details)分离。

    本章的其余重构手法可用以处理另一些重要问题:

    如果你发现代码中的多处测试有相同结果,应该实施Consolidate Conditional Expression;如果条件代码中有任何重复,可以运用Consolidate Duplicate Conditional Fragments 将重复成分去掉。

    如果程序开发者坚持「单一出口(one exit point )」原则,那么为让条件式也遵循这 一原则,他往往会在其中加入控制标记(control flags )。我并不特别在意「一个函数一个出口」原则,所以我使用 Replace Nested Conditional with Guard Clauses 标示出那些特殊情况,并使用Remove Control Flag 去除那些讨厌的控制标记。

    较之于过程化(procedural )程序而言,面向对象(object oriented)程序的条件式通常比较少,这是因为很多条件行为都被多态机制(polymorphism)处理掉了。多态之所以更好,是因为调用者无需了解条件行为的细节,因此条件的扩展更为容易。所以面向对象程序中很少出现switch 语句;一旦出现,就应该考虑运用Replace Conditional with Polymorphism 将它替换为多态。

    多态还有一种十分有用但鲜为人知的用途:通过 Introduce Null Object 去除对于null value 的检验。

    我的总结

    1、可以用多态替代条件。
    2、复杂条件要拆分
    3、重复的要合并
    4、空对象的妙用,还能用于多态。

  • 相关阅读:
    iOS 单例(Singleton)总结 和第三库引用单例
    iOS OpenURL用法简介
    CGContextRef学习笔记
    iOS 绘图(虚线、椭圆)
    iPhone4s 7.0.3-4 TableView 数据越界 解决方案
    Android Media应用开发
    RTMP & HLS
    Debug tool 学习笔记
    video codec 学习笔记
    matplotlib和numpy 学习笔记
  • 原文地址:https://www.cnblogs.com/aoyihuashao/p/10384715.html
Copyright © 2011-2022 走看看