重构笔记

提炼函数(Extract Method)

我们需要的是一些简短而命名良好的函数。首先每个函数的粒度小的话,那该函数被复用的机会就越大;其次,这会提高代码可读性,使高层函数读起来像注释;再次,如果函数都是细粒度,则覆写起来会容易些。

1、首先使用以查询代替临时变量(Replace Temp with Query)对原函数进行改造,对于一个方法的临时变量:

  • 有参数传入时避免对参数进行直接赋值(Java是按值传递),而是创建一个临时变量得到参数的值。
  • 若临时变量存在多次赋值,将该临时变量分解为多个临时变量,此时临时变量都可以声明为final。
  • 将对该临时变量赋值的语句的等号右侧部分提炼到一个独立的函数中。
  • 对该临时变量的所有引用点都替换为对应的函数名。

2、开始提炼函数

  • 创造一个新函数,根据这个函数的意图对他命名(以“做什么”来命名),并将提炼出的代码从原函数复制到该新函数中。
  • 检查是否有“仅作用于被提炼代码段”的临时变量,如果有,在目标函数中将其声明为临时变量;检查是否有既作用于原函数,又作用于被提炼代码段的临时变量,如果有,将其作为目标函数的返回值Return给原函数。
  • 将被提炼代码中需要读取的局部变量,当作参数传递给目标函数。
  • 编译,测试。

提炼超类(Extract SuperClass)

重复代码是系统中最糟糕的东西之一,而提炼超类就是为两个类建立一个超类,并将相同特性迁移至超类,这就是继承。

1、在提炼超类进行继承之前,我们有必要通过组合进行提炼类的操作。组合就是对整体类到局部类的一个分解过程,而整体类能够灵活的对局部类进行封装,改变局部类的接口。如下例:

import java.util.Set;

public class  IntSet{
    private Set<Integer> set;

    public IntSet(Set<Integer> set){
        this.set=set;
    }

    public boolean add(int a) {
        return set.add(a);
    }

    public boolean remove(int a) {
        return set.remove(a);
    }
}

在这段代码中Inset和Set之间就是组合的关系,Intset是整体类,Set是局部类,而我们在InSet类中取消了Set类的许多方法,起到了改变局部类接口的作用。

2、开始提炼超类

  • 创建一个空白得抽象超类。
  • 从高层函数开始,将某个待提升函数的代码段赋值到超类中的新函数中并进行命名。
  • 若待提示函数使用了子类的一个字段,使用Pull up Field将字段也提升至超类中。
  • 若待提升的函数中出现了子函数:若子函数的实现完全相同,则把子函数也全部提升至超类;若不完全相同,可在超类中将该子函数声明为抽象函数。
  • 逐一编译,测试每一个子类。
时间: 2024-08-06 11:15:37

重构笔记的相关文章

重构笔记——隐藏“委托关系”

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43769929         在上一篇文章中介绍了"将类内联化".本文将介绍"隐藏委托关系"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:客户通过一个委托关系来调用另一个对象. 解决:在服务类上建立客户所需的所有函数,用以隐藏委托关系. 动机 我们都知道,"封装&q

重构笔记——将类内联化

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43159817         在上一篇文章中介绍了"提炼类".本文将介绍"将类内联化"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类并没有做太多的事情. 解决:将这个类的所有特性搬移到另一个类中,然后移除原类. 动机 "将类内联化"正好与"

重构笔记——提炼类

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43059759         在上一篇文章中介绍了"搬移字段".本文将介绍"提炼类"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类做了应该由两个类做的事. 解决:建立一个新类,将相关的字段和函数从旧类搬移到新类. 动机 我们或多或少听过这样的教诲:一个类应该是一个清楚的

重构笔记——搬移字段

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42780243         在上一篇文章中介绍了"搬移函数".本文将介绍"搬移字段"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:程序中某个字段被其所驻类之外的另一个类更多地用到. 解决:在目标类新建一个字段,修改原字段的所有用户,令它们改用新字段. 动机 在类之间移动状态

重构笔记——分解临时变量

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42463871         在上一篇文章中介绍了"重构笔记--引入解释性变量".本文将介绍"分解临时变量"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果. 解决:针对每次赋值,创造一个独立.对应的

重构笔记——移除对参数的赋值

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42497857         在上一篇文章中介绍了"分解临时变值".本文将介绍"移除对参数的赋值"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:代码对一个参数进行赋值. 解决:以一个临时变量取代该参数的位置. //重构前 int dicount(int inputVal, i

重构笔记——构筑测试体系

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42167015 作为一名程序员,不知你是否在开发过程中也很少甚至不写测试程序,可能大多数人觉得这很正常,其实从个人角度来看也很正常,因为毕竟有测试人员专门进行测试的嘛!但是,如果能够认真观察程序员把最多时间耗在哪里,你就会发现,编写代码其实只占非常小的一部分.有些时间用来决定下一步干什么,另一些时间花在设计上,最多的时间则是用来调试.我敢肯定每一位读者都还记

重构笔记——搬移函数

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42679983         我们都知道,类往往因为承担过多的责任而变得臃肿不堪.这种情况下,一般会使用"提炼类"这种手法将一部分责任分离出去.如果一个类变得"不负责任",一般会使用"内联类"这种手法将它融入另一个类.如果一个类使用了另一个类,一般会运用"隐藏委托关系"手法将这种关系隐藏

重构笔记——内联函数

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42261333         在上一篇文章中介绍了"提炼函数".本文将介绍"内联函数"这种重构手法.         下面让我们一起来学习该重构手法把. 开门见山         发现:一个函数的本体与名称同样清楚易懂. 解决:在函数调用点插入函数本体,然后移除该函数. //重构前 public int getRati

重构笔记——内联临时变量

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42167015         在上一篇文章中介绍了" 内联函数".本文将介绍"内联临时变量"这种重构手法.         下面让我们一起来学习该重构手法把.(PS:虽然某些重构手法看起很简单,但是和其它重构手法结合起来使用,会产生异曲同工的效果) 开门见山         发现:你有一个临时变量,只被一个简单表达式赋