基本类型偏执Primitive Obsession
大多数编程环境有两种类型的数据。记录类型允许你把数据结构化成有意义的集合。基本类型是你建设用的砖块。记录类型总是会产生一定量的额外开销。这可能是数据库中的表,或者被很尴尬的创建当你希望他们只为一或两件东西存在。
关于对象一个很有意义的东西是,他们模糊甚至打破了基本类型和大型类之间的界线。你可以很轻松的写小的无法和语言中内建类型相区别的类。Java对数字有基本类型,但字符和日期这些在其他环境也是基本类型的,在Java里是类。
新接触对象的人通常不太情愿用小的对象对付小的任务,例如混合数字和币制的金钱类,一个小写到一个大些的变化范围,还有特别的字符串比如电话号码和ZIP代码。你可以通过对独立的数据值使用“用对象替换数据值”,从洞穴中搬出来来到中间加热的对象世界。如果数据值是一个类型代码且不影响行为,使用“用类替换类型代码”。如果你有条件语句依赖这些类型代码,使用“用子类替换类型代码”或者“用状态/策略替换类型代码”
如果你有一组应该放在一起的字段,用提取类处理。如果你在参数列表里看到这些基本类型,尝试使用“引入参数对象”。如果你发现自己在数组中挑选数据,使用“用对象替代数组”
Switch语句Switch Statement
面向对象代码最明显的特征之一就是它比较缺少switch语句。switch语句的问题在于重复代码。你经常会程序中的不同地方找到同样的switch语句。如果你增加一条分句,你必须把所有switch语句出现的地方都找到然后修改。面向对象的多态的概念在这个问题上给你提供了更优雅的处理方式。
大多数情况你看到switch语句你都应该考虑多态。问题是多态应该在哪里出现。通常switch语句根据特征码切换。你希望一个方法或者类主持特征码的值。所以用提取方法来提取switch语句然后移动方法把他们放到需要多态的类里面。在那个时刻你需要决定是使用“用子类替代特征码”或者“用状态/策略替代特征码”。当你建立好继承结构,你可以用多态替代条件语句。
如果你只有几个字句,影响单一方法,并且你不期望他们改变,那么多态就矫枉过正了。在这种情况下用明确的方法代替参数是一个好的选择。如果一个条件从句是null的话,可以尝试引入“Null对象”。
平行继承体系Parallel Inheritance Hierarchies
平行继承体系是一种比较特别的散弹式修改。在这种情况下,每当你为一个类创建子类也需要为另一个类创建子类。你可以因为在一个体系里面类的前缀名和另一个完全相同鉴别出代码的坏味道。
消除这类重复的大概策略是确定一个体系中的实例参考另一个体系中的实例。如果你用Move Method和Move Field,那个体系在参考类里就会消失。
惰性类Lazy Class
每个你创建的类都会花费金钱去维护和理解。一个做的不足以抵消它的花费的类应该被消除掉。通常这可能是一个类原本对的起它的身价,但重构让其缩水了。或者可能是一个类根据原本计划的变化添加的类,但后来计划没有被执行。两种情况,你都把这些类体面的处理掉。如果有子类做的不够多的,尝试使用Collapse Hierarchy。几乎没用的组件应该使用Inline Class
代码的坏味道之四 ——译自《重构》