2009-08-21 9 views
6

私は今、scalaアクターを使っていくつかのアプリケーションを書いています。私は遭遇したいくつかの問題に人々がどのように近づいたり対処しているかに興味があります。Scalaアクターを使ったアプリケーションの実際の作成

多すぎるメッセージクラスまたは!

私はユーザーの操作に反応して何かを起こさなければならない俳優があります。メッセージUserRequestsX(id)reactを書き込んでみましょう。私が続けている問題は、自分のプログラムをモジュール化したいので、1人の俳優だけが他の俳優を関与せずにアクションを完了できないということです。たとえば、idパラメータを使用して複数の値を取得する必要があるとし、これらの値を他のアクタから削除する必要があるとします。私が普通のJavaプログラムを書いていたら、私は次のようなことをするでしょう:

public void reportTrades(Date date) { 
    Set<Trade> trades = persistence.lookup(date); 
    reportService.report(trades); 
} 

これはどれも簡単です。しかし、私は!?の使用を避けたいので、俳優を使用するとこれは少し痛みになります。 1人の俳優はReportTrades(date)メッセージに反応しますが、取引についてはPersistenceActorに質問し、次にReportActorに報告する必要があります。私はこれを行うための見つけた唯一の方法は、実行することです。

react { 
    case ReportTrades(date) => 
     persistenceActor ! GetTradesAndReport(date) 
} 

PersistenceActorに私はブロックに反応しているようにするため:

react { 
    case GetTradesAndReport(date) => 
     val ts = trades.get(date) //from persietent store 
     reportActor ! ReportTrades(ts) 
} 

しかし、今、私は2つの問題を抱えて:

  1. を同じメッセージ(つまり「レポート取引」)を表すように追加のメッセージクラスを作成する必要があります。実際にはこのシナリオでは3つありますが、それ以上の問題が発生する可能性があります。
  2. ReportTradesとは何ですか。それらを両方ともReportTradesと呼ぶのは混乱します(もしそうであれば、別々のパッケージに入れなければなりません)。基本的にクラスのようなものはvalタイプではありません。

紛失しているものがありますか?これを避けることはできますか?私はちょうどあきらめて使うべきですか?!?何が起こっているのかを明確にするために組織の構造を使用していますか?

+0

「反応する」で永続ストアに直接アクセスすることは安全ですか?私はあなたがブロック操作を行うことができないと思った。その特定の俳優には「受け取り」が必要かもしれない。 –

答えて

2

私にとって、あなたのReportTradesメッセージは2つの異なる概念を混ぜています。一つはリクエスト、orderはレスポンスです。例えば、GetTradesReport(Date)SendTradesReport(List[Trade])という名前が付けられます。または、おそらく、ReportTradesByDate(Date)GenerateTradesReport(List[Trade])です。

+0

しかし私のポイントはまだ立っています。私はこれらすべてのクラスを、データを渡す以外には何も使用していません。昨日、私は4人の別々の俳優からの情報でリクエストを「装飾」する必要があるいくつかのコードを書いた。賢明な命名を許可しても、それは混乱するクラスです! –

+0

さて、このようなクラスは情報を伝達するために使われることはありません。彼らは目的のためにある場所から別の場所へ情報を伝達するために使用されます。それに応じて名前を付けると、コードの読みやすさが向上します。 –

0

replyの使用に異論はありますか?またはtradesを渡すか?ない場合は、あなたのコードは、おそらくそれぞれ

react { 
    case ReportTrades(date) => persistenceActor ! GetTrades(date) 
    case Trades(ts) => // do smth with trades 
} 

react { 
    case GetTrades(date) => reply(Trades(trades.get(date))) 
} 

ようになります。

+0

私のポイントは、「Trades」オブジェクトを私のコーディネーターに戻すことができないということですね。*どのオリジナルコマンドが呼び出されたかを知る方法は?*例えば、 DeleteTrades *、* ReportTrades *、* LoadTrades *など。コーディネーターは 'SomeTradesToReport'、' SomeTradesToDelete'または 'SomeTradesToLoad'のような応答を得る必要があります('!? 'を避けると仮定します) –

関連する問題