如何创建更有效的版本?

时间:2019-03-19 16:47:25

标签: java

我才刚刚开始学习Java。我的大部分知识是关于Python和html / css的。我想通过从工作中举一个例子来进行练习,以创建一个自动计数系统。基本上,太阳能电池板连接到“逆变器”,并且每种逆变器类型最多只能容纳一定数量的太阳能电池板(模块)。 3800h逆变器最多可容纳18个-如果超出该范围,我们将需要使用一个可容纳37个逆变器的7600h逆变器。为此,我创建了一个非常冗余的文本版本,主要目的是在各个模块之间平均分配模块如果我有超过10000h的逆变器,则可以容纳两个逆变器。基本上在两个7600h逆变器之间分配模块数量。

有人对更好的,更少冗余的方程式有任何指针/想法吗?而不是所有if / else if行?也许更好的变量存储?我显然是个初学者,所以答案很可能是我不知道从哪里开始的最简单的事情。感谢您的任何投入。

last = d[0]
for element in d:
   if element!=last:
      print('\n')
   last = element
   print(element)


这将打印出来:

总模块数:53

SE7600H逆变器:26个模块

SE7600H逆变器:27个模块

2 个答案:

答案 0 :(得分:0)

如果您创建了一个具有numberOfModules和price的“ Inverter”类,则可能会创建一个“ Best Fit”算法,该算法遍历它们并为给定数量的逆变器选择最低价格,但是我猜那太过分了。我认为您拥有的内容可能最容易阅读和维护(大多数代码的最重要方面)。

如果您只是想使现有解决方案更具模块化,则可以创建更简化的内容...

创建一组5个“解决方案”对象。每个解决方案都有其可以处理的最大模块数量以及可以处理这些模块的逆变器配置。迭代这些解决方案,直到您提出一个足够大的模块来处理当前的模块数量。

然后您将拥有可用的逆变器数量和类型,因此只需在其中划分模块(而不是仅编码1或2,我想出一种在n个逆变器之间划分模块的方法,以便将来扩展。)

这有意义吗?可以从文本配置文件中创建5个解决方案对象,以便您可以轻松添加新的解决方案而无需重建。

答案 1 :(得分:0)

“有效”是一个非常宽松的术语。如果您的意思是性能,我认为还可以。如果您的意思是模块化,那么我会做这样的事情:

public class Main {
    public static void main(String[] args) {

        InverterFactory factory = new InverterFactory();
        CountingSystem countingSystem = new CountingSystem(53);
        Inverter myInverter = factory.create("SE300H");

        countingSystem.calculate(myInverter);

    }
}

public class InverterFactory {

    public static Inverter create(String inverterType) {

        if (inverterType.equals("SE300H")) {
            return new InverterTypeA();
        } else if (inverterType.equals("SE7600H")) {
            return new InverterTypeB();
        } else if (inverterType.equals("SE1000H")) {
            return new InverterTypeC();
        }
    }
}

public interface Inverter {
}

public class InverterTypeA implements Inverter {

    private final int max;

    public InverterTypeA() {
        this.max = 18;
    }

    public int getMax() {
        return this.max;
    }

    @Override
    public String toString() {
        return "SE300H Inverter";
    }
}

public class CountingSystem {

    private final int moduleCount;

    public CountingSystem(int moduleCount) {
        this.moduleCount = moduleCount;
    }

    public void calculate(Inverter inverter) {

        if (moduleCount  <= inverter.getMax()) {
            System.out.println(inverter.toString() + ": " + moduleCount + " modules");
        }
        //etc
    }
}

很明显,应该更改用例中有意义的方法/类名称。同样,3种不同类型的Inverter类可能会过大,但是它确实使您的代码更具可伸缩性,以防将来您需要添加更多类型。工厂也使测试变得更容易。