GUI がビジネス ロジックと密接に結びついているようです。
多くのオプションがありますが、1 つのアプローチは、計算に必要な設定をいくつかのクラスのフィールドとして保存することです (おそらく、計算を独自のクラスに分割します)。次に、GUI ボタンが押されると、構成が GUI から取得され、解析され、計算が実行される前に計算オブジェクトにコピーされます。
これにより、自動的にいくつかの利点が得られます。
- 構成は GUI ではなくプライベートに保存されるようになったため、GUI の変更は実行中の計算の構成に影響しなくなりました (特に必要な場合を除きます)。あなたは完全にコントロールできます。
- 入力の検証 (たとえば、数値が範囲内にあるかどうかのチェックなど) は、計算オブジェクトによって処理できます。これには多くの良い結果があります。最も顕著なのは、計算が記述された不変条件に依存し、構成された設定が有効な範囲内にあると常に想定できるようになったことです。また、GUI 以外の方法で計算を開始し、検証を行うこともできます。
- 計算コードと構成をメイン アプリケーションから分離することで、必要に応じて他のあらゆることを実行できるようになりました。たとえば、複数の計算を複数のスレッドで同時に実行するなどです。
これらすべてを実行したくない場合もありますが、要点は、ビジネス ロジックを GUI から分離するだけで自動的に実行できるようになることです。
例:
class Calculation {
final int input1;
final int input2;
Calculation (int input1, int input2) {
if (input1 < 0 || input2 < 0)
throw new IllegalArgumentException("Inputs can't be negative."); // for example
this.input1 = input1;
this.input2 = input2;
}
void begin () {
...
}
}
次に、GUI ボタンが押されたとき:
int input1 = ...; // get value from gui
int input2 = ...; // get value from gui
calculation = new Calculation(input1, input2);
calculation.begin();
// now the actual settings are preserved in 'calculation' regardless of gui changes.
もちろん、それを整理する方法はたくさんあります (上記の GUI ボタンの例にはまだ多くの要望が残されています)。たとえば、定期的な更新を取得する方法などが必要ですが、そのフレームワークではすべて簡単に行うことができます。
また、計算ごとに別のインスタンスを用意する必要はありません。Calculation
セッターなども使用でき、次のようなことができます。
class Calculation {
final int input1;
final int input2;
boolean running;
Calculation (int input1, int input2) {
setInput1(input1);
setInput2(input2);
}
void setInput1 (int input1) {
if (running)
throw new IllegalStateException("Inputs can't be changed while calculation running.");
if (input1 < 0)
throw new IllegalArgumentException("Input 1 can't be negative.");
this.input1 = input1;
}
void setInput2 (int input2) {
if (running)
throw new IllegalStateException("Inputs can't be changed while calculation running.");
if (input2 < 0)
throw new IllegalArgumentException("Input 2 can't be negative.");
this.input2 = input2;
}
void begin () {
if (running)
throw new IllegalStateException("Calculation is already running.");
running = true;
...
}
}