【代码重构】消灭重复代码

50 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

前言

垃圾代码中最常碰到的一种情况就是重复代码,如果你在一个以上的地方看到相同的程序结构,那么这就可能是一个糟糕的情况,如果将它们合而为一,程序会变得更好。重复代码往往有下面几种情况。

一个类中重复代码

最简单的方式就是一个类中存在重复的代码,比如:

public class DuplicatedCodeTest1 {

    public void say1() {
        String msg = "sadf" + "fadf";
        System.out.println("***************");
        System.out.println(msg);
        System.out.println("***************");
    }

    public void say2(String arg) {
        String msg = "sadf" + "fadf" + "sdasdf";
        msg += "aa";
        System.out.println("***************");
        System.out.println(msg);
        System.out.println("***************");
    }
}
  • say1()方法和say2()方法存在重复代码。

重构建议

使用Extract Method方式,将重复的代码放进一个独立的函数中,并让函数名称解释函数用途。如下图所示:

  • 选中要抽出的方法,点击上面的Extract Method....

  • idea会自动将重复的代码替换掉,是不是很简单呢

子类存在重复代码

还有些情况就是互为兄弟的子类包含相同的代码结构。如下图所示:

public class DupSon2 extends DupFather {

    public void say1() {
        String msg = "sadf" + "fadf" + "sdasdf";
        msg += "aa";

        System.out.println("***************");
        System.out.println(msg);
        System.out.println("***************");
    }
}

public class DupSon1 extends DupFather {

    public void say1() {
        String msg = "sadf" + "fadf";

        System.out.println("***************");
        System.out.println(msg);
        System.out.println("***************");
    }
}

重构建议

  1. 按照上面Extract Method的方法抽出相同的代码。
  2. 然后使用Pull Up Method方式抽取到父类中,如下图所示:

  • 选中方法,然后使用RefactorPull Members Up.....

不相干类存在重复代码

那么现在如果两个不相干的类里面出现重复代码怎么办呢?

public class DupCode1 {

    public void say1() {
        String msg = "sadf" + "fadf";
        msg += "ccasdf";
        
        System.out.println("***************");
        System.out.println(msg);
        System.out.println("***************");
    }
}

public class DupCode2 {

    public void say1() {
        String msg = "sadf" + "fadf";
        System.out.println("***************");
        System.out.println(msg);
        System.out.println("***************");
    }
}
  • DupCode1类和DupCode2类是两个不相干的类,那么该如何重构呢?

重构建议

可以考虑对其中一个类使用Extract Class,也就是将重复代码提炼到一个独立的类中,然后再另外一个类内使用这个新类。

比如本例抽出重复代码到DupCode中,如下图:

其他地方调用这个DupCode,如下图所示: