首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建一个更有效的版本?

如何创建一个更有效的版本?
EN

Stack Overflow用户
提问于 2019-03-20 00:47:25
回答 2查看 83关注 0票数 0

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

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

代码语言:javascript
复制
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个模块

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 01:21:55

如果您创建了一个具有numberOfModules和价格的"Inverter“类,那么您可能会创建一个”最佳拟合“算法,该算法遍历这些类并为给定数量的逆变器选择最低价格--但我猜这有点过分了。我认为你所拥有的可能是最容易阅读和维护的(大多数代码中最重要的方面)。

如果你只是想让你现有的解决方案更加模块化,你可以创建一些更简单的东西……

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-03-20 01:36:57

“高效”是一个非常宽松的术语。如果你指的是性能,我认为这很好。如果你指的是模块化,那么我会这样做:

代码语言:javascript
复制
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);

    }
}

代码语言:javascript
复制
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();
        }
    }
}

代码语言:javascript
复制
public interface Inverter {
}

代码语言:javascript
复制
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";
    }
}

代码语言:javascript
复制
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类可能有些夸张,但它确实使您的代码更具可伸缩性,以防将来需要添加更多类型;该工厂还使其更容易测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55246126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档