代码重构心得

所谓重构,之前的理解大多是:针对重复代码的封装提炼,针对过多if-else结构的整合。
然而,在实际操作中,存在很多重构方法。

  1. 重复代码提炼
    寻找代码中完成某项子功能的重复代码,将之封装成独立函数,必要时进行调用。
class GoodExample {

    public void someMethod1(){
        //code
        someMethod3();
        //code
    }

    public void someMethod2(){
        //code
        someMethod3();
        //code
    }

    public void someMethod3(){
        System.out.println("重复代码");/* 重复代码块 */
    }

}
  1. 冗长方法的分割
    将某个冗长方法实现 切割成几个独立的函数,这样既增加了可读性,同时也一定程度上避免了可能的重复代码。
class GoodExample {

    public void someMethod(){
        function1();
        function2();
        function3();
    }

    private void function1(){
        //function[1]
    }

    private void function2(){
        //function[2]
    }

    private void function3(){
        //function[3]
    }

}
  1. 针对if-else结构的优化
    将else中的语句放在前面,并及时跳出方法,以免对后面的判断造成影响。(但是要注意在某些情况下无法提前跳出)
class BadExample {

    public void someMethod(Object A,Object B){
        if (A != null) {
            if (B != null) {
                //code[1]
            }else {
                //code[3]
            }
        }else {
            //code[2]
        }
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Object A,Object B){
        if (A == null) {
            //code[2]
            return;
        }
        if (B == null) {
            //code[3]
            return;
        }
        //code[1]
    }

}

或者 我们可以将分支条件合并,以此来达到代码清晰的目的。

class BadExample {

    public void someMethod(Object A,Object B){
        if (A != null) {
            if (B != null) {
                //code
            }
        }
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Object A,Object B){
        if (A != null && B != null) {
            //code
        }
    }

}
  1. 去掉那些可有可无的临时变量
    class BadExample {

    private int i;

    public int someMethod(){
    int temp = getVariable();
    return temp * 100;
    }

    public int getVariable(){
    return i;
    }

}

/* ---------------------分割线---------------------- */

class GoodExample {

private int i;

public int someMethod(){
    return getVariable() * 100;
}

public int getVariable(){
    return i;
}

}
6. 消除过长参数列表,将所有参数包装成一个类。
class BadExample {

public void someMethod(int i,int j,int k,int l,int m,int n){
    //code
}

}

/* ---------------------分割线---------------------- */

class GoodExample {

public void someMethod(Data data){
    //code
}

}

class Data{

private int i;
private int j;
private int k;
private int l;
private int m;
private int n;

//getter&&setter

}
8. 提取类中定义的常量(magic number/string constant) 这样我们调用的话就只是调用变量名即可
class GoodExample {

protected static final String SUCCESS_MESSAGE = "您的操作已成功!";

public void someMethod1(){
    send(SUCCESS_MESSAGE);
}

public void someMethod2(){
    send(SUCCESS_MESSAGE);
}

public void someMethod3(){
    send(SUCCESS_MESSAGE);
}

private void send(String message){
    //code
}

}
10. 拆分冗长的类
这个操作难度很大,特别是对于那些应用广泛的大类来说。在拆分的时候,我们关注点应该主要集中在类的属性上面,拆分出来的两批属性在逻辑上应该是可以分离的。也就是说某个方法如果同时含有这两种属性,就会很麻烦。
11. 观察工程中可能存在的继承体系,这样子类就不用再实现一遍父类的方法了。

posted @ 2020-07-12 22:55  EvanMeetTheWorld  阅读(34)  评论(0)    收藏  举报