【重构.改善既有代码的设计】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、空对象的妙用,还能用于多态。

posted @ 2019-02-15 17:14  傲衣华少  阅读(299)  评论(0编辑  收藏  举报