美文网首页
第9章 简化条件表达式

第9章 简化条件表达式

作者: 后来丶_a24d | 来源:发表于2020-03-16 16:51 被阅读0次

    目录

    • DecomposeConditional(分解条件表达式)
    • ConsolidateConditionalExpression(合并条件表达式)
    • ConsolidateDuplicateConditionalFragments(合并重复的条件片段)
    • RemoveControlFlag(移除控制标记)
    • ReplaceNestedConditionalwithGuardClauses(以卫语句取代嵌套条件表达式)
    • ReplaceConditionalwithPolymorphism(以多态取代条件表达式)
    • IntroduceNullObject(引入Null对象)
    • IntroduceAssertion(引入断言)

    简化条件表达式

    分解条件表达式

    • 你有一个复杂的条件语句。从if、then、else三个段落中分别提炼出独立函数
    • 对于条件逻辑,将每个分支条件分解为新函数还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。

    合并条件表达式

    • 你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件表达式,并将这个条件表达式提炼为一个独立函数
    • 有时你会发现这样一串条件检查:检查条件各不相同,最终行为却一致。如果发现这种情况,就应该使用“逻辑或”和“逻辑与”将它们合并为一个条件表达式。
    • 之所以要合并条件表达式,有2个重要原因
    1. 合并后的条件代码会告诉你“实际上只有一次条件检查,只不过有多个并列条件需要检查而已”
    2. 这项重构往往可以为你使用Extract Method(提炼方法)做好准备

    合并重复的条件片段

    • 在条件表达式的每个分支上有着相同的一段代码。将这段重复代码移到条件表达式之外。

    移除控制标记

    • 在一系列布尔表达式中,某个变量带有“控制标记’的作用。
      以break或return语句取代控制标记。
    // 重构前
    QString foundPerson(QStringList people){
        QString found = QString();
        for (int i = 0; i < people.size(); ++i) {
            if (people[i].compare("Don") == 0) {
                found = "Don";
            }
    
            if (people[i].compare("John") == 0){
               found = "John";
            }
        }
        return found;
    }
    
    // 用return直接代替if里面的标记
    
    • 去掉控制标记所产生的效果往往让你大吃一惊:条件语句真正的用途会清晰得多。

    以卫语句取代嵌套条件表达式

    • 如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”。
    • 给某个分支以特别的重视。它告诉阅读者:这种情况很罕见,如果它真的发生了,请做一些必要的整理工作,然后退出。

    以多态取代条件表达式(比较少用)

    • 你手上一个条件表达式,它根据对象类型的不同而选择不同的行为。将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数

    引入Null对象

    • 你需要再三检查某对象是否为null。将null值替换为null对象
    • 重构那本书的例子可以参考重构:引入NULL对象
    • 其实可以考虑Optional对象使用

    引入断言

    • 断言可以作为交流与调试的辅助。在交流的角度上,断言可以帮助程序阅读者了解代码所做的假设;在调试的角度上,断言可以在距离bug最近的地方抓住它们。

    参考文章

    相关文章

      网友评论

          本文标题:第9章 简化条件表达式

          本文链接:https://www.haomeiwen.com/subject/kgrnehtx.html