19.3 重构

重构是指对代码的重新构造,减少代码冗余,提高代码的抽象程度,更好的模块化,以达到更易于开发、维护的目的。重构有以下常用的几点:
1.变量重命名
某些变量开始使用的时候没有注意,当使用了一段时间后发现命名并不妥。例如一个学生id,命名为s,然后一直使用。变量的命名对于阅读代码是非常重要的,很多初学的开发者忽略了这一点。eclipse和idea都有重构这一功能,可以方便地把所有引用的地方都改过来。
2.函数重构
理由同上,现在函数的命名已经重要到可以决定功能:自动代码实现根据函数的名称实现功能。这个在一些框架已经实现。但除了命名外,函数还可以进行更多的重构。例如有这样一个场景,A函数使用整数作为参数A(int),现在出现一个需求:根据要求有两种计算,但是有相当一部分代码是相同的。
如果直接新定义一个函数B,然后把A函数相同那一部分搬进去,那么就犯了重复代码的错误(abcde是重复的):
public void A(int i){
    int x=Math.abs(i);
    abcde;
}
public void B(int i){
    abcde;
}
这是重构后的:
public void a(int i,boolean isInteger){
    if(isInteger){
        int x=Math.abs(i);
    }
    else{
    }
    abcde;
}
//新的A函数
public void A(int i){
    a(i,true);
}
//新的B函数
public void B(int i){
    a(i,false);
}
abcde是重复的代码,A和B都会执行。

除此之外,函数的重构还包括修改参数类型、个数,这种重构会直接导致原调用代码出语法错误,不得已的时候不要使用,尽量用添加函数的方式。
3.提取函数
函数功能复杂,不知不觉已经写了很长,但这很不利于维护,于是把一个函数分成几个函数。有时候这很难做到。开发工具的提取函数功能可以尝试,但并不是每次都能成功,这取决于要提取的代码是否相对独立。例如在一个循环内部,把循环里面的所有代码提取出函数,通常都是可以成功的。
4.将函数抽象到接口或父类
提取出来的函数可以私有方法的方式存在,也可以变成公有。如果条件合适,还可以直接添加到父类或者接口。