程序有两面价值:“今天可以为你做什么”和“明天可以为你做什么”。大多数时候,我们只关注自己今天想要程序做什么。不论是修复错误或是添加特性,我们都是为了让程序能力更强,让它在今天更有价值。
但是系统当下的行为,只是整个故事的一部分,如果没有认清这一点,你无法长期从事编程工作。如果你为求完成今天的任务而不择手段,导致不可能在明天完成明天的任务,那么最终还是会失败。但是,你知道自己今天需要什么,却不一定知道自己明天需要什么。也许你可以猜到明天的需求,也许吧,但肯定还是有些事情出乎你的意料。








在对象设计的过程中,“决定将责任放在哪儿”是非常重要的事情之一。
在这种类型的重构中,通常只需要使用Move Method和Move Field简单移动地下的行为就可以解决。
如果一个类因为承担过多责任而臃肿不堪,可以使用Extract Class将一部分责任分离出去。
如果一个类变得不太负责任,可以使用Inline Class将其融入到另外一个类。
如果一个类使用了另外一个类,运用Hide Delegate将这种关系隐藏起来。有时候隐藏委托类会导致拥有者的接口经常发生变化,可以使用Remove Middle Man处理。






















条件逻辑有可能十分复杂,因此本章提供一些重构手法,专门用来简化它们。其中一项核心重构就是Decompose Conditional,可将一个复杂的条件逻辑分成若干小块。这项重构很重要,因为它使得“分支逻辑”和“操作细节”分离。
本章的其余重构手法可用以处理另一些重要问题;如果你发现代码中有多处测试有相同的结果,应该实施Consolidate Conditional Expression;如果条件代码中有任何重复,可以运用Consolidate Duplicate Conditional Fragment将重复成分去掉。
较之于过程化程序而言,面向对象程序的条件表达式通常比较少,这是因为很多条件行为都被多态机制处理掉了。多态之所以更好,是因为调用者无需了解条件行为的细节,因此条件的拓展更容易。所以面向对象程序中很少出现switch语句。一旦出现,就应该考虑运用Replace Conditional with Polymorphism将它替换为多态。多态还有一种十分有用但鲜为人知的用途,通过Introduce Null Object去除对于Null值的检验。



在一些布尔表达式中,某个变量带有控制标记的作用。以break或者return语句取代控制标记。


