简化条件表达式
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、空对象的妙用,还能用于多态。