重构笔记-代码坏味

重构一书的代码坏味道


1 Duplicated Code(重复代码)


在同一个类中的不同函数、子类之间或者毫不相干的类之间出现相同的程序结构,都应该设法将他们合二为一。

同一个类中的两个函数含有相同的表达式,提炼重复代码到一个函数中,再让这些地方调用这个函数。

子类之间出现重复代码,把重复代码提炼到父类中。

两个毫不相关的类出现重复,把重复代码提炼到其中一个类中或者一个新的类作为一个方法,让所有的类调用它。

2.Long Method(过长函数)

函数越长越不容易被理解,维护和修改越困难。

每当感觉需要以注释来说明点什么的时候,就把需要说明的东西写进一个独立函数里,并以其用途来命名函数。

3.Large Class(过大的类)

过大类指利用单一class做太多事情,其内就会出现太多的变量,并且重复代码也会出现。

通过提炼类,提炼子类或者超类把过多的相关的变量提炼到新的类中。

4.Long Parameter List(参数列表过长)

过长的参数列表同样难以理解,会造成前后不一致、不宜使用。

很多时候参数,都可以通过请求所属对象来获得,可以去掉。

如果有多个参数来自同一个对象,可以用这个对象当做参数。或者可以把新建一个参数对象,来容纳参数。

5.Divergent Change发散式变化

某个class经常因为不同的原因在不同方法上发生变化,也就是说:一个类拥有多个引起它发生变化的原因。原则上,每个对象只因一种变化而修改。

找出因为某个特定原因造成的所有变化,提炼到一个新的class中。

6.Shotgun Surgery散弹式修改

和5相反,遇到某种变化,都必须修改不同的class以响应之。代码散步四处,很难维护。

把需要修改的代码放进同一个类,或者可以创建一个新类。

7.Feature Envy依赖过于严重

对象技术的全部要点:封装数据和行为

如果一个class的函数对另一个class的依赖(表现为对对象数据和对象函数调用)比这个class还高,就是依赖过于严重。

应该把这个函数移动到一个合适类中,原则上是移到依赖最为严重的类中。

8.Data Clumps 数据泥团

两个classes中出现几个相同值域,或者函数中的相同参数,就是数据泥团

相同值域应该提炼到一个新的class中。

相同参数列可以以新对象代替。

9.Primitive Obsession基本类型偏执

基本类型被过度使用。在某些场合,应该使用较小的类来代替基本类型,比如货币、带范围的数值、电话号码或者邮编字符串等。


10 Switch Statements(Switch惊悚现身)

switch 语句会导致导致代码重复,应该考虑用多态替换它.

11.Parallel Inheritance Hierarchies(平行继承体系)

平行继承体系是霰弹式修改的一个特例。在这种情况下,当你为某个类增加一个子类时,你不得不为另一个类也相应增加一个子类

12.Lazy class(冗赘类)

一个类不值其身价,就是冗赘类.

重构使其消失,去除冗余瘦身也可以吧

13.Speculative Generality(夸夸其谈的未来性)

一个系统的装置,以"将来有一天需要这么做"的考虑而实现了各式各样的hooks和特殊情况来处理一些不必要的事情,就会导致此坏味.比如,过度抽象.

一个装置如果肯定会被用到,那么就值得做;如果用不到,就不值得.

14.Temporary Field(令人迷惑的暂时值域)

对象中某个变量instance仅为某种特定情势而设.这样的代码让人不易理解.

例如一个class有一个复杂算法,需要好几个变量,为了避免过长参数,而把这些变量设置成class值域.

这些变量应该用extract class重构消除.

15.Message Chains(过度耦合的消息链)

如果你看到用户向一个对象request另一个对象,然后再向后后者索求另一个对象,然后再所以另一个对象.......这就是Message Chains.

采取这种方式,意味客户将与查找过程的航行结构紧密耦合,一旦对象间的关系发生任何变化,客户端不得不做出相应修改.

16.Middle Man (中间转手人)

过度运用委托delegation。某个class接口有一半的函数都委托给其他class,这样就是过度运用,导致middle man。

可以使用Remove Middle Man和Replace Delegation with Inheritance重构

17.Inappropriate Intimacy (狎昵关系)

如果看到两个classes过于亲密,花费太多的时间去探究彼此直接的private成分.就是狎昵关系.

18.Alternative Classes with different interface(异曲同工的类)

两个类的函数做着同一件事,却有不同的签名式(signature).


19.Incomplete library Class(不完善的程序库类)

程序库类不完整带来的坏味道


20.Data Class(纯粹的数据类)

一个类除了拥有值域,以及访问这些值域的函数之外,身无长物。

21.Refused Bequest(被拒绝的遗赠)

subclass 应该继承superclass的函数和数据。当subclass不需要继承所有的函数或者数据,就出现了这种坏味道。


22.Comments(过多的注释)

注释过多,说明代码不易被理解。应该先重构前面提到的坏味道,然后代码就说明了功能。

(全部做到真滴有点难。。。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值