我正计划为物理创建一个计算器,该计算器将使用一些方程式。但是,我意识到这将是很多代码。
通过方程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);
}
这样一来,您就可以在一处定义方程式,而无需一堆堆的类。您可以类似地为
ThreeTermEq
,FourTermEq
等定义接口,并为solveThreeTermEq()
类定义solveFourTermEq()
,Calculator
等方法。这里的缺点是维护和组织起来可能会变得更加困难,而且我相信类文件的大小是有上限的。如果类文件变得太大,它将无法编译,如果您定义了大量的方程式,则可能会发生这种情况。对我来说,选择将取决于我想要如何组织代码。如果我只想包含(相对)少量(相对)简单的方程式,则可能会使用lambda。如果我想涵盖尽可能多的物理主题中的每个物理方程,则可能会使用类。
无论哪种方式,都必须为方程的不同排列编写一些类似的代码-我认为实际上没有任何解决方法。您可以尝试使用一种新颖的方法来使用一堆Objects来规避该问题,但是我认为这样做会太费力,不值得付出努力;并不是很难遍历变量。