3.1Duplicated Code(重复代码)
1,同一个类的两个函数含有相同表达式,采用Extract Method 提炼重复代码,然后让这两个地点都调用提炼出来的代码
2,两个互为兄弟的子类内含有相同表达式,要避免这种情况,只需对两个类使用Extract Method,然后Pull up Method,将它推入超类。如果只是类似并非完全相同,考虑使用模板方法设计模式
3,两个不相干的类出啊先Duplicated Code,考虑对其中一个Extract Method,将重复的代码提炼到一个独立类,然后在另外一个类使用这个新类
3.2Long Method(过长函数)
间接层— 解释能力,共享能力,选择能力—小型函数支持的
原则:每当感觉需要以注释来来说明什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途命名,即使一行代码也可以提取
技巧:寻找注释。条件表达式(可以使用 Decompose Conditinal 分解条件)或者循环也是提炼的信号
3.3Large Class(过大的类)
可以运用Extract Class(提炼类) 将几个变量一起提炼到新类内,提炼是应该选择类内彼此相关的变量,将他们放在一起
技巧: 先确定客户端如何使用它们,然后运用Extract Inteface为每一种使用方式提炼出一个接口,
3.4Long Parameter List(过长参数列)
技巧:制造对象
3.5Divergent Channge(发散式变化)
某一个类经常因为不同的原因在不同方向上变化
技巧: 针对某一外界变化的所有相应的修改,都只应该发生某一个单一类中,而这个新类内的所有内容都应该反应此变化,为此,你需要找出某一个特定原因而造成的所有变化,然后运用提炼类,将他们提炼到一个新类
3.6Shotgun Surgery(霰弹式修改)
每遇到某种变化,需要在许多不同的类做出许多小修改
技巧:使用Move Method 和Move Field 把所有修改的代码放在一个类中,如果没有合适的类,就创建一个,通常使用Inline Class (将类内联化:将这个类的所有特性搬到另外一个类,然后移出原类)把一系列行为放进同一个类
3.7Feature Envy(依恋情结)
对象技术全部要点:将数据和对数据的操作行为包装在一起
当一个函数往往用到几个类的功能?
原则:判断哪个类拥有最多被此函数使用的数据,然后把这个函数和那些数据摆在一起
策略模式,参观者模式可以轻松修改函数的行为,因为他们将少量需要被复写的行为隔离开来
3.8Data Clumps(数据泥团)
问题: 两个类中相同的字段,许多函数签名中相同参数
技巧:Extract Class 将他们提炼到一个独立对象中
3.9Primitice Obsession(基本类型偏执)
总结一句话: 一切皆对象
3.10Switch Statements(Switch 惊悚现身)
面向对象一个明显特征:少用Swtich(或case语句),原因:在于重复
技巧: 多态,与改类型码相关的函数和类(后面有详细介绍)
3.11Parallel Inheritance Hierarchies(平行继承体系)
是Shotgun Surgery的特殊情况,每当为某一个类增加一个子类,必须为另外一个类增加一个子类
策略:让一个继承体系的实例引用另一个继承体系实例,如果再运用 Move Method 和Move Field 就可以将引用段继承体系消失了
3.12Lazy Class(冗余类)
对于某些子类没有做足够的工作,试试(超类和子类合并),对于几乎没用的组件应该Inline Class
3.13 Speculative Generality(夸夸其谈未来性)
未来的事情要么做好,要么不做
3.14Message Chains(过度耦合的信息链)
现象:用户向一个对象请求另一个对象,然后再向后者请求另一个对象,然后在请求另外一个对象,-----消息链
技巧:先观察消息链最终得到的对象是用来干什么的,看看能否以Extract Method 把使用该对象的代码提炼到一个独立函数中,再运用Move Method 将这个函数推入消息链,
3.15Temporary Field(令人迷惑的暂时字段)
现象:某一个实例变量仅为某种特定的情况而设
技巧:Extract Class 把这些变量和相关函数提炼到一个独立的类中,提炼的新对象将是一个函数对象
3.16Middle Man(中间人)
对象的基本特征之一就是封装,封装往往伴随着委托
现象:某个类的接口有一半的函数都委托给其他类,这就是过度委托
技巧:Remove Middle Man 直接和真正负责的对象打交道
3.17Incomplete Library Class(不完美的库类)
如果你想修改库类的一两个函数,可以运用 Introduce Foreign Method(引入外加函数);如果想添加一大堆额外的行为,就运用Introduce Local Extension(引入本地扩展)
3.18 Comments (过多注释)
注释用代码说明一切,当年感觉需要注释的时候,请先尝试重构,试着让所有的注释变得多余
3.19Data Class(纯的数据类)
Data Class;拥有一些字段,以及用于访问这些字段的函数,除此之外一无长物
技巧:找出这些取值设值得地点,尝试用Move Method把那些调用行为搬移到Data Class ,如果无法搬移,就运用Extract Method产生一个可搬移的函数。