私には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
オブジェクトが正しいインスタンスであることを確認する必要があります。つまり、を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);
}
これは、あなたがすべて一つの場所にあなたの方程式を定義し、クラスの最大積載量を必要としないことができます。同様にCalculator
クラスのThreeTermEq
,FourTermEq
などのインターフェイスだけでなく、solveThreeTermEq()
、solveFourTermEq()
などのインターフェイスを定義することもできます。ここでの欠点は、保守や整理がより難しくなるかもしれないことです。クラスファイルの大きさに上限があると思います。クラスファイルが大きすぎるとコンパイルされません。これは、数多くの方程式を定義した場合に発生します。
私の場合は、コードをどのように整理したいのかという選択肢があります。 (比較的)少数の(比較的)単純な方程式だけを含めるには、おそらくラムダを使います。できるだけ多くの物理トピックに物理方程式を含めるには、おそらくクラスを使用します。
いずれにしても、である必要があります。類似のコードは、方程式の異なる順列のために書かれています。本当にその周りには何の方法もないと思います。あなたは、それを回避しようとするオブジェクトの束を使用して斬新なアプローチを試みることができますが、私はそれが過労と努力の価値がないと思う。変数を反転させるのは難しいことではありません。
私はそれが正しいかどうかわかりません。ユーザーは変数に任意の値を指定するか、またはプログラムはユーザーが入力した変数に解決される式の形式のみを表示する必要がありますか? –
[Javaで方程式を解く方法は?](http://stackoverflow.com/questions/1431885/how-to-solve-equations-with-java)の可能な複製 – cyroxis