9

54:53分の時点での彼の講演で、Rich Hickeyは、依存するプログラム部分を分離する手段としてのキューの使用について話している。デザインや柔軟性を向上させるために、次のJava擬似コードを重複排除する方法の例を教えてください。

// Warning: Java-pseudo-code ahead
class Job {
    public void doRun(A a) {
        saveObjectToDatabase(a);

        B b = computeB(a);
        saveObjectToDatabase(b);

        C c = computeC(b);
        logToFile(c);
    }
}

saveObjectToDatabasesaveObjectToDatabaseは副作用のあるメソッドと見なすことができますが、computeB'sとcomputeC'の出力はにのみ依存しaます。

私はこの質問がかなり曖昧/広範であることを知っています。プログラムを大幅に複雑にすることなく、キューイングメカニズムを活用する方法を理解したいと思います。それでも、プログラムが正しい順序で正しいことを実行することを確認します。正しい方向へのポインタはありがたいです。

4

4 に答える 4

3

これはあまり良い例ではありませんが、(最も単純な設計では) 基本的に 2 つのキューがあり、(関連するデータの量によっては) データベースを省略できます。

a最初のプロセスは、「外界」からオブジェクトを受け取り、それらをキュー 1 に入れます。2 番目のプロセスは、キュー 1 からオブジェクトを取り出し、実行computeBし、結果をキュー 2 に入れます。3 番目のプロセスは、キュー 2 からオブジェクトを取り出します。を実行computeCし、結果などをログに記録します。

私が言ったように、関連するデータの量 (およびおそらく他のいくつかの要因) に応じて、キューに渡される「オブジェクト」は、実際のaオブジェクトbまたはデータベース内のデータを見つけるための単なるトークン/キーのいずれかになります。

キュー自体は、いくつかの方法で実装できます。たとえば、詳細はややこしいですが、データベースを使用してキューを実装することは可能です。「プロセス」は、単一の Java プロセス内の Java タスクである場合もあれば、別個のマシン上の別個の OS プロセスである場合もあります。

Unix で「パイプ」を使用すると、この方法で効果的にキューを使用できます。

于 2012-01-04T12:41:13.900 に答える
1

これは、私が使用している Java ライブラリで使用されている原則とまったく同じです。アイデアは、プログラム内の個々のタスクにコンポーネントを割り当てることです (ロガーは完璧な例です)。ここで、各コンポーネントは、スレッドとして、またはイベント ハンドラーとして、他のコンポーネントとは独立して実行する必要があります。

イベント駆動型の場合、各コンポーネントは、リッスンするイベント/メッセージのタイプを通知します。着信メッセージを収集して受信者のキューに挿入するディスパッチャーがあります。受信者は処理を行い、最終的に新しいメッセージを生成します。や。。など...

あなたの場合、次のようなものです:

class SaveObjectHandler{
//
void handle(Event e, Object o){
  if(e instanceof SaveEvent)
      saveObjectToDatabase(o);
}

};

class TransformObject{
//
 void handle(Event e,Object o){
   if(e instanceof TransformEvent){
      B result = compute(o);
      send(new SaveEvent(),result)
   }

 }

};

class Logger{

   void handle(Event e, Object o){
      if(o instanceof B)
        //perform computeC
        logEvent((B)o);
   }

};

};

問題のライブラリはSEDAです。

于 2012-01-04T12:46:38.350 に答える
0

saveObject メソッドには副作用があり、うまく分離できないか、少なくとも簡単に分離できないのではないかと心配しています。

しかし、いくつかのオブジェクトを高速にデータベースに書き込む必要があるとしましょう。私の意見では、リレーショナル DB で最速の方法は、複数のクライアントによってオブジェクトをキューに保存し、1 人または 2 人の非常に高速なライターがデータベースにデータをできるだけ速くプッシュしてオブジェクトを取得することです。

于 2012-01-04T17:27:05.413 に答える