第9章 简化条件表达式
作者:
后来丶_a24d | 来源:发表于
2020-03-16 16:51 被阅读0次
目录
- DecomposeConditional(分解条件表达式)
- ConsolidateConditionalExpression(合并条件表达式)
- ConsolidateDuplicateConditionalFragments(合并重复的条件片段)
- RemoveControlFlag(移除控制标记)
- ReplaceNestedConditionalwithGuardClauses(以卫语句取代嵌套条件表达式)
- ReplaceConditionalwithPolymorphism(以多态取代条件表达式)
- IntroduceNullObject(引入Null对象)
- IntroduceAssertion(引入断言)
简化条件表达式
分解条件表达式
- 你有一个复杂的条件语句。从if、then、else三个段落中分别提炼出独立函数
- 对于条件逻辑,将每个分支条件分解为新函数还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因。
合并条件表达式
- 你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件表达式,并将这个条件表达式提炼为一个独立函数
- 有时你会发现这样一串条件检查:检查条件各不相同,最终行为却一致。如果发现这种情况,就应该使用“逻辑或”和“逻辑与”将它们合并为一个条件表达式。
- 之所以要合并条件表达式,有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
网友评论