我正计划为物理创建一个计算器,该计算器将使用一些方程式。但是,我意识到这将是很多代码。

通过方程v = x / t(我想包括的只是其中之一),已经存在三个可能的方程。

v = x/t     x = vt       t = x/v


我打算让该程序执行的操作是:

-向用户询问他们将使用什么方程式

-问缺少什么变量

-用匹配方程式解决

我的问题是,是否有一种方法可以更有效地格式化代码。不知道怎么做,似乎为方程的每个变体运行了很多非常相似的代码。

如果尚不清楚,我打算使用多个类来创建它。

最佳答案

我认为有2种方法最有意义。

第一种更传统的方法是为要包括的每种方程式创建一堆类。

public class Velocity implements Equation{
    public double solveT(double v, double x){
        if(v != 0)
            return x / v;
        else
            return 0; //or whatever value is appropriate
    }

    public double solveX(double v, double t){
        return v * t;
    }

    public double solveV(double t, double x){
        if(t != 0)
            return x / t;
        else
            return 0; //or whatever value is appropriate
    }
}


这使所有不同的方程式保持分离,如果定义了空的Equation接口,则可以根据需要替换不同的Equation对象。缺点是您需要跟踪很多类,并且必须确保要尝试调用方法的Equation对象是正确的实例,即,尝试调用solveX()在没有Density方法的solveX()实例上。但是,将每个类分开是组织和调试的一种好方法。

另一种方法是使用Java8 lambda:

interface twoTermEq{
    double solve(double a, double b);
}

public class Calculator{
    public double solveTwoTermEq(twoTermEq eq, double a, double v){
        eq.solve(a, b);
    }
}

public static void main(String[] args){
    twoTermEq velSolveX = (t, v) -> return t * v;
    twoTermEq velSolveT = (x, v) -> v != 0.0 ? return x / v : 0.0;
    twoTermEq velSolveV = (x, t) -> t != 0.0 ? return x / t : 0.0;
    //define as many equations as needed...

    Calculator c = new Calculator();
    //select which equation to run, collect user input
    ....
    //do the calculation
    double result = c.solveTwoTermEq(velSolveX, t, v);
}


这样一来,您就可以在一处定义方程式,而无需一堆堆的类。您可以类似地为ThreeTermEqFourTermEq等定义接口,并为solveThreeTermEq()类定义solveFourTermEq()Calculator等方法。这里的缺点是维护和组织起来可能会变得更加困难,而且我相信类文件的大小是有上限的。如果类文件变得太大,它将无法编译,如果您定义了大量的方程式,则可能会发生这种情况。

对我来说,选择将取决于我想要如何组织代码。如果我只想包含(相对)少量(相对)简单的方程式,则可能会使用lambda。如果我想涵盖尽可能多的物理主题中的每个物理方程,则可能会使用类。

无论哪种方式,都必须为方程的不同排列编写一些类似的代码-我认为实际上没有任何解决方法。您可以尝试使用一种新颖的方法来使用一堆Objects来规避该问题,但是我认为这样做会太费力,不值得付出努力;并不是很难遍历变量。

09-30 14:57
查看更多