1

コードで netbeans から計算を実行したいのですが、計算されたデータは onButtonClick() アクション イベントとリスナーを持つ GUI から取得されます。計算を支援するために、このデータに一定の間隔で繰り返しアクセスできるようにしたいと考えています。私の問題は、私のコードでは計算を 1 回しか実行できないことです。その後、GUI に入力された変数がゼロになると、私のソリューションは誤った答えを返します。

GUI で入力されたこれらの数値を、何度も入力しなくても、一定の時間間隔で常にアクセスできるようにコーディングするにはどうすればよいでしょうか。

4

1 に答える 1

1

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;
       ...
   }

}
于 2014-03-14T23:47:41.960 に答える