6

私は現在、scala アクターを使用していくつかのアプリケーションを作成しており、私が遭遇した問題のいくつかに人々がどのようにアプローチしたり対処したりしたかに興味があります。

大量の Message クラスまたは !?

ユーザー操作に反応し、何かを起こさなければならないアクターがいます。reactそれをメッセージにしましょうUserRequestsX(id)。私が抱えている継続的な問題は、プログラムをモジュール化したいため、1 つのアクターだけでは、他のアクターを巻き込むことなくアクションを完了できないことです。たとえば、idパラメーターを使用して一連の値を取得する必要があり、これらを他のアクターを介して削除する必要があるとします。普通の Java プログラムを書いていたら、次のようなことをするかもしれません:

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

これは簡単です。ただし、アクターを使用するのは少し面倒です。使用を避けたいからです !?。1 つのアクターがメッセージに反応しますが、取引をReportTrades(date)依頼してから報告する必要があります。これを行うために私が見つけた唯一の方法は、次のことです。PersistenceActorReportActor

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. 1 番目と 3 番目のメッセージは何と呼べばよいReportTradesですか? それらを両方と呼ぶのは紛らわしいReportTradesです (または、そうする場合は、それらを別々のパッケージに入れる必要があります)。overloading本質的に、型によるクラスのようなものはありませんval

足りないものはありますか?これを避けることはできますか?あきらめて使用する必要があり!?ますか?

4

2 に答える 2

2

私にとって、あなたのReportTradesメッセージは 2 つの異なる概念を混ぜ合わせたものです。1 つは Request で、注文は Response です。たとえば、GetTradesReport(Date)やなどの名前が付けられます。SendTradesReport(List[Trade])または、多分、ReportTradesByDate(Date)そしてGenerateTradesReport(List[Trade])

于 2009-08-21T17:31:43.780 に答える
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)))
}

それぞれ。

于 2009-08-22T20:28:51.370 に答える