如何重构只有变量不同的代码

时间:2012-12-16 03:06:18

标签: java refactoring

大家好:我正在研究两个java程序,其中字面意思是两者之间的唯一区别是定义二维数组的开始语句。我在以下示例中大大缩短了代码:

public class Qwerty {
    /** this is what needs to be replaced */
    private static char master[][] = {
        QwertyKbd.lIndex,
        QwertyKbd.lMiddle,
        QwertyKbd.lRing,
        QwertyKbd.lPinky,
            /** and so forth in this fashion */
    };

    public static int[] analyze(String file) {
    }

    public static void split(char c) {
    }
}

和第二堂课:

 public class Dvorak{
        /** this is what needs to be replaced */
        private static char master[][] = {
            /** various definitions, eliminated for conciseness */
        };

        public static int[] analyze(String file) {
            /** this is the same*/
        }

        public static void split(char c) {
            /** this is the same*/
        }
    }

问题是如何重构一个类,其中唯一的区别是'主'二维数组?钩子方法等在这里会很愚蠢。因为程序没有什么需要修改的。你觉得怎么样?

2 个答案:

答案 0 :(得分:2)

这似乎是继承的经典案例。继承的真正目的是代码重用,这正是你在这里得到的。我将所有方法都设置为非静态并对它们执行“Extract Superclass”,将analyze()split()拉入抽象类,并添加抽象getMaster()或其他类似的,每个类都会覆盖以返回适当的值。

更糟糕的选择 - 出于几个原因,但主要是因为它让你处于“静态土地”,这是一个可怕的地方 - 只需将analyze()split()移入一些第三类,这是一个容纳你的“共享”实用程序方法的地方。

答案 1 :(得分:1)

如果您的课程属于不同的项目,则无法做到这一点 但是如果它们是项目的一部分,你可以为你的所有类创建一个抽象类或超类:Qwerty,Dvorak ...... 例如,您创建一个抽象

public class CustomAbstract{
    protected char master[][];
    public int[] analyze(String file){return null;};
    public void split(char c){};
}

然后在你的课程中,你扩展了这个抽象类

public class Qwerty extends CustomAbstract{
    public Qwerty(){
        //master = ...;
    }
    //your code
}

当你在CustomAbstract中重构主字段时,其他类中的所有master也会被重构。

上面代码的问题是你不能使用静态字段master,eventhough静态方法分析等。可能你需要你的类中的所有方法和字段都是静态的,你可以使用单个骨架模式。在每个类中,您创建一个类似

的静态方法
public class Qwerty extends CustomAbstract{
    //your code
    static Qwerty instance = new Qwerty();
    public static Qwerty getInstance(){
        return instance;
    }
}

然后您可以使用Qwerty.getInstance()。analyze(String)而不是使用Qwerty.analyze(String)。 希望这有帮助。