0

まったく異なる操作を実行するA、B、C(このリストは大きくなる可能性があります)を実行する操作のリストがあります。この各操作は、個別のJavaクラスによって実行されます。上に座ってA、B、Cに電話するマネージャーMngrYがいます

操作(A、B、C)を実行するクラスは、目的のためにさまざまなサービスX1、X2、X3、X4、X5を呼び出す必要があります。サービスを呼び出すためのラッパークラスWX1、WX2、WX3、WX4、WX5があります。A、B、Cからの呼び出しの一部は一般的です(たとえば、WX3、WX4)。(A、B、Cの2つ、またはそれらの3つになります)。

ここで、からX1、X2、X3、X4、X5を呼び出す必要があります。理想的には、A、B、Cのそれぞれが必要なサービスを呼び出す必要があります。しかし、A、B、Cのすべてで共有されているものの場合、MngrYから呼び出して、サービス呼び出しの出力をA、B、Cのそれぞれに送信することは理にかなっています(効率的には理にかなっていますが、MngrYのように設計的には理にかなっています) A、B、Cがどのように動作するかを知らないでください)。

したがって、オプションは

  1. MngrYから共通サービスコール(WX3、WX4)を呼び出します。これは、個々のコンポーネントから個別に必要です。いいデザインですか?

  2. ManagerMngrYからすべてのサービスコールを発信します。スケールアップしますか?将来的には多くのサービスリクエストを行う必要があるかもしれません。他の人のために各モジュールをブロックし、MnagrYに各モジュールの要件を認識させるように設計します。

  3. 必要に応じて、個々のコンポーネントから(必要に応じて)すべてのサービス呼び出しを行い、ラッパーにキャッシュによって重複リクエストを処理させます。2つの呼び出しが行われないことをキャッシュに依存するのは良いことですか?サービスは数ミリ秒以内に結果を返す必要があり、常に2つの呼び出しを行う余裕はありません。

  4. または、WX1、WX2、WX3、...にキャッシュメカニズムを設定して、同じ呼び出しが2回行われないようにする必要があります。

また、将来的には、MngrYからA、B、Cを並行して呼び出したい場合があるため、その場合、キャッシングによって問題が発生する可能性があります。同じリクエストが複数回行われる可能性があるため。

4

1 に答える 1

0

うーん...

複雑でさまざまな一連の操作を実行する必要がある場合、私は通常、ある種の「リクエスト/コマンド/結果」クラスを持つステートマシンに頼ります。たとえば、「OpClass」と呼びます。マネージャは、クラスのインスタンスに、A、B、または C 操作、データ、コマンド列挙、リンク、他のクラス インスタンス、ロットを定義するために必要なすべてのものをロードします。このようにして、OpClass インスタンスは、必要な X1..X5 操作を正しい順序で実行するために必要なすべての状態とその他の情報 (順序が重要な場合) を持ち、操作が不必要に繰り返されないようにします (A、B)。または C がカプセル化されています。その後、OpClass が A、B、または C に発行され、これらのエージェントは、要求された操作を完了するために必要に応じて X1..X5 を呼び出すことができます。OpClass には、結果とエラー報告を保存するためのメンバーが含まれている必要があります。

TBH、私はおそらく A、BC も OpClass に集約し、データとコマンドをロードしてから実行を提供するだけでよい一種の「スーパー」OpClass を形成します。run() メソッドによって。後でキュー、スレッド、および/またはスレッドプールを使用した並列操作に移行することは、はるかに簡単になり、実際には些細なことに接しています:)

これは関連性がありますか、それとも理にかなっていますか?

于 2012-07-16T10:02:09.817 に答える