首页 > 解决方案 > 我想实现 DRY 原则但不知道如何

问题描述

我在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 不会将方法作为参数传递。

我正在考虑接口(我不太确定,我不太了解接口),但我需要一些关于如何做的指导,或者我想知道是否还有其他选择。

标签: java

解决方案


当您正在寻找重复数据删除/干涸的东西时,您应该寻找函数之间的共性。

首先也是最重要的:接口在这里不会为您带来任何好处。您使用接口来强制执行该接口的所有实现者之间的特定合同;也就是说,无论您对 a 使用什么实现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]);
    }
}

将其集成到您的应用程序中是我留给读者的练习。


推荐阅读