我想执行DRY原理,但不知道如何

时间:2018-10-03 19:24:13

标签: java

我在Java中有此方法。

    public double[] pruebas(int dimension, String prueba) {
    random rd1 = new random(semilla, numSol); 
    double mejorSolucion[] = new double[dimension];


    switch (prueba) {
        case "schwefelUnimodal":
            for (int i = 0; i < numSol; i++) {
                for (int j = 0; j < dimension; j++) {
                    tresDimenciones[j] = schwefelUnimodal(numSol, rd1.nextInt());
                    if (tresDimenciones[j] < mejorSolucion[j]) {
                        mejorSolucion[j] = tresDimenciones[j];
                    }
                }
                System.out.println("///////////Corrida " + i);
                System.out.println("Primera:" + tresDimenciones[0] + "\nSegunda:" + tresDimenciones[1] + "\ntercera:" + tresDimenciones[2]);
            }
            break;
        case "schwefelMultimodal":
            for (int i = 0; i < numSol; i++) {
                for (int j = 0; j < dimension; j++) {
                    tresDimenciones[j] = schwefelMultimodal(numSol, rd1.nextInt());
                    if (tresDimenciones[j] < mejorSolucion[j]) {
                        mejorSolucion[j] = tresDimenciones[j];
                    }
                }
                System.out.println("///////////Corrida " + i);
                System.out.println("Primera:" + tresDimenciones[0] + "\nSegunda:" + tresDimenciones[1] + "\ntercera:" + tresDimenciones[2]);
            }
            break;
        case "rosenbrock":
            for (int i = 0; i < numSol; i++) {
                for (int j = 0; j < dimension; j++) {
                    tresDimenciones[j] = rosenbrock(numSol, rd1.nextInt(), rd1.nextInt());
                    if (tresDimenciones[j] < mejorSolucion[j]) {
                        mejorSolucion[j] = tresDimenciones[j];
                    }
                }
                System.out.println("///////////Corrida " + i);
                System.out.println("Primera:" + tresDimenciones[0] + "\nSegunda:" + tresDimenciones[1] + "\ntercera:" + tresDimenciones[2]);
            }
            break;

    }

    return mejorSolucion;
}

它调用了其他方法,这里只显示了3个(schwefelUnimodal,schwefelMultimodal和rosenbrock),但是我必须使用另外6个,它们都使用相同的参数(均为int)并且必须执行相同的操作(2个 for 循环)。 我知道Java不会将方法作为参数传递。

我在考虑接口(我不确定,我对接口了解不多),但是我需要一些有关如何操作的指南,或者我想知道是否还有其他选择。

1 个答案:

答案 0 :(得分:1)

当您要寻找重复数据删除/干dry的东西时,应该寻找功能之间的通用性。

首要的是:接口在这里不会给您带来任何好处。您可以使用接口在该接口的所有实现者之间强制执行特定合同;也就是说,无论您为List使用哪种实现,他们都将拥有size()

现在,重点是-您的switch语句中有非常非常通用的代码,除了不同的方法调用外,该代码似乎可以重复自身。

真正的区别在于您要提供的数组,但是您还需要引入许多其他常量状态的东西。因此,您只需创建一个方法即可抽象出tresDimenciones数组中的差异。

public void doOperation(int dimension, int numSol, double[] tresDimenciones, double[] mejorSolucion) {
    for (int i = 0; i < numSol; i++) {
        for (int j = 0; j < dimension; j++) {
            if (tresDimenciones[j] < mejorSolucion[j]) {
                mejorSolucion[j] = tresDimenciones[j];
            }
        }
        System.out.println("///////////Corrida " + i);
        System.out.println("Primera:" + tresDimenciones[0] + "\nSegunda:" + tresDimenciones[1] + "\ntercera:" + tresDimenciones[2]);
    }
}

将其集成到您的应用程序中是我要做的练习。