Есть два подхода, о которых я могу думать, что будет иметь наибольший смысл.
Первым более традиционным способом было бы создать кучу классов для каждого типа уравнения, которое вы хотели включить.
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 лямбды:
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
. Недостатком здесь является то, что его может стать сложнее поддерживать и организовывать, и я считаю, что существует верхний предел того, насколько большой может быть файл класса; если файл класса становится слишком большим, он не будет компилироваться, что может произойти, если вы определили тонны уравнений.
Для меня выбор сводится к тому, как я хотел организовать код; если бы я хотел включить только (относительно) небольшое число (относительно) простых уравнений, я бы, вероятно, использовал лямбда. Если бы я хотел включить каждое физическое уравнение в максимально возможное количество физических вопросов, я бы, вероятно, использовал классы.
В любом случае, это должно быть аналогичный код, написанный для разных перестановок уравнения - я не думаю, что есть что-то в этом роде.Вы можете попробовать новый подход, используя кучу объектов, чтобы попытаться обойти это, но я думаю, что это было бы чрезмерным и не стоило бы усилий; это не так, как перевертывание переменных вокруг трудно.
Не уверен, что я понял. Предоставляет ли пользователь какие-либо значения для переменных или должна ли программа отображать только форму уравнения, которое разрешено переменной, введенной пользователем? –
Возможный дубликат [Как решить уравнения с помощью java?] (Http://stackoverflow.com/questions/1431885/how-to-solve-equations-with-java) – cyroxis