美文网首页
重构-改善既有代码设计,一些要点

重构-改善既有代码设计,一些要点

作者: minute_5 | 来源:发表于2019-07-21 22:29 被阅读0次

前言

  • 将重构于编程,如鱼之于水,编码的每一次呼吸都伴随着重构,不能说某一特定时间来进行代码重构,而应随时都在进行。
  • 重构对于编程的地位也等同于测试对于重构的地位。

绝大多数情况下

  1. 方法应该放在使用的数据的所属对象内,比如
  2. 代码的编写方式,设计=>开发=>测试=>重构=>测试=>重构=>测试
开闭原则 => 向他靠近而不是完全吻合。

代码中的坏味道 - 何时去重构?当代码中出现坏味道时,有哪些坏味道?

  1. 使用多态替换switch(子类,策略,状态)
  2. 平行继承体系(继承某个类,另一个类也需要增加子类)
  3. 某些特殊情况下的变量(一般当人去理解代码时,通常会认为对象在所有时候都会需要他的所有变量,在变量未被使用的情况下猜测其设置目的,是极度不友好的。将这个特殊情况与其相关的代码移步到新对象中)
  4. 过长的消息链(a.getB.getC.getD....)
  5. 过多的代理人(某类接口一半方法都委托给其他类,1、直接去除中间人,直接和负责对象打交道。2、如果中间人还有其他职责,赋予他们能实际干活的工作)
  6. 过于亲密(两个类花费太多时间去探寻彼此的private成分。1、如果两个类实在分不开,那就提取紧密部分为新类,然后使用这个类。2、或者开启一个新类代理)
  7. 过余注释(并不是不能注释,而是要让代码变成不在需要注释)

如何重构

重新组织你的方法

  1. 每个临时变量都应该是独立的,不应该拥有过多职责 => 赋值final
  2. 移除对参数的赋值
int discount(int a,int b){if(a>2) a-=2;...}
=>
int discount(int a,int b){
    int var1 = a;
    if(a>2) var1-=2;...}
  1. 如果有一个大型方法,里面有很多业务操作和变量,当我们需要将他分解成各个小模块时,会有参数传递的问题。这个时候,可以重新建一个类,然后将原来方法所在的对象和方法用到的参数作为字段用构造方法传给这个新类,然后再在新类中创建一个新方法作为原来方法的替代,然后再去分解这个新方法(好处是不必再为传递参数而烦恼,因为这些参数全是新类的字段)

迁移

  1. 在当前类中如果有一个方法或者字段与另外一个类有更多的交流时,将这个方法搬运到另一个类中。如果当前类的所有字段都应该属于另一个类,那就将他合并到另一个类中(内联类)。
  2. 某个类做了过多的简单委托过程,将它去掉,直接调用。

重新组织数据

  1. 值对象通常指的是自身不可变的(它们是由其所含的数据值来定义的),而引用对象是代表了现实中的某个具体实物(打个比方就是可以使用==来判断)。虽然在开发时,我们大多是从值对象开始,但只要是引入了一些可修改的数据时,就应该变为引用对象。

简化条件表达式

  1. 用多态来取代条件表达式(比如多态代替Switch),并不是说将switch完全去除掉,比如我们接收一个type类型参数,需要去判断它为什么类型,然后再去执行相应操作(而这些操作就可以通过多态来解决掉)。

处理概括关系

  1. 将某些子类方法中以相同顺序执行类似操作,但各个操作细节不同,那就把这些操作移到超类中(其实就是模板方法)
  2. 当子类只是使用了超类中的一部分方法或者是根本不需要继承而来的数据,那就把继承去掉,使用委托来调用。当然如果情况相反,请将委托改为继承。

大型重构

  1. 如果一个继承体系中,承担了两项不同责任(怎么简要的去判断 => 在某一特定层级上,子类名称上有词都是相同的),那么就需要,建立另外一个继承体系,然后通过委托关系让其中一个调用另一个。

IDEA上的自动化重构工具

  1. ctrl+alt+shit+t 就能列出所有重构的方法
参考:《重构-改善既有代码的设计》 Martin Fowler

相关文章

网友评论

      本文标题:重构-改善既有代码设计,一些要点

      本文链接:https://www.haomeiwen.com/subject/qdavlctx.html