如何创建更高效​​的版本?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

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

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

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

        int moduleCount = 53;
        int moduleRemainder;
        int secondInverter;

        int se3800hMax = 18;
        int se7600hMax = 37;
        int se10000hMax = 49;

        String se3800h = "SE300H Inverter";
        String se7600h = "SE7600H Inverter";
        String se10000h = "SE10000H Inverter";

        System.out.println("Total modules: " + moduleCount);

        if (moduleCount <= se3800hMax) {
            System.out.println(se3800h + ": " + moduleCount + " modules");
        } else if (moduleCount <= se7600hMax) {
            System.out.println(se7600h + ": " + moduleCount + " modules");
        } else if (moduleCount <= se10000hMax) {
            System.out.println(se10000h + ": " + moduleCount + " modules");
        } else if (moduleCount > se7600hMax * 2) {
            moduleRemainder = moduleCount % 2;
            secondInverter = moduleCount / 2 + moduleRemainder;
            System.out.println(se10000h + ": " + moduleCount / 2 + " modules");
            System.out.println(se10000h + ": " + secondInverter + " modules");
        } else if (moduleCount > se10000hMax) {
            moduleRemainder = moduleCount % 2;
            secondInverter = moduleCount / 2 + moduleRemainder;
            System.out.println(se7600h + ": " + moduleCount / 2 + " modules");
            System.out.println(se7600h + ": " + secondInverter + " modules");
        }


    }
}

这将打印出来:

总模块:53

SE7600H逆变器:26个模块

SE7600H逆变器:27个模块

提问于
用户回答回答于

如果你创建了一个具有numberOfModules和price的“逆变器”类,你可能会创建一个“最适合”的算法,它绕过它们并为给定数量的逆变器选择最低价格 - 但我猜这太过分了。我认为你所拥有的可能是最容易阅读和维护的(大多数代码最重要的方面)。

如果您只是想让现有的解决方案更加模块化,那么您可以创建更简化的内容......

创建一组5个“解决方案”对象。每种解决方案都有最多可处理的模块和可以处理它们的逆变器配置。迭代这些解决方案,直到你找到一个足以处理当前模块数量的解决方案。

然后,您将获得可用的逆变器的数量和类型,因此只需将模块划分为它们(而不仅仅是编码1或2,我会找到一种方法将模块划分为n个逆变器,以便将来扩展。)

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

用户回答回答于

“高效”是一个非常宽松的术语。如果你的意思是表现,我认为这很好。如果你的意思是模块化,如下:

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种不同类型的逆变器类可能过度,但它确实使您的代码在以后需要添加更多类型时更具可扩展性; 工厂也使测试更容易。

扫码关注云+社区

领取腾讯云代金券