重构改善既有代码的设计《三》代码的坏味道

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产生一个可搬移的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大道至简@EveryDay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值