Frage

Ich habe jetzt ein paar Anwendungen mit Scala -Schauspielern geschrieben und interessiert daran, wie Menschen einige der Probleme, die ich aufgetreten bin, angesprochen oder mit ihnen umgegangen bin.

Eine Fülle von Nachrichtenklassen oder!?

Ich habe einen Schauspieler, der auf eine Benutzeroperation reagiert und etwas verursachen muss. Sagen wir es reacts zu einer Nachricht UserRequestsX(id). Ein anhaltendes Problem, das ich habe, ist, dass ein einzelner Schauspieler, weil ich meine Programme selbst modularisieren möchte, die Aktion nicht ausführen kann, ohne andere Akteure einzubeziehen. Angenommen, ich muss das verwenden id Parameter zum Abrufen einer Reihe von Werten und dann müssen diese über einen anderen Schauspieler gelöscht werden. Wenn ich ein normales Java -Programm schreiben würde, könnte ich so etwas tun wie:

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

Welches ist einfach genug. Mit den Schauspielern wird dies jedoch zu einem kleinen Schmerz, weil ich es vermeiden möchte !?. Ein Schauspieler reagiert auf die ReportTrades(date) Nachricht, aber es muss a fragen PersistenceActor für die Trades und dann a ReportActor sie melden. Ich habe nur festgestellt, dass ich dies tun soll:

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

Also das in meinem PersistenceActor Ich habe einen React -Block:

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

Aber jetzt habe ich 2 Probleme:

  1. Ich muss zusätzliche Nachrichtenklassen erstellen, um darzustellen die gleiche Anfrage (IE "Berichtshandel"). Tatsächlich habe ich drei in diesem Szenario, aber ich habe vielleicht noch viel mehr - es wird zu einem Problem, diese im Auge zu behalten
  2. Wie soll ich die erste und dritte Nachricht nennen? ReportTrades? Es ist verwirrend, sie beide zu nennen ReportTrades (Oder wenn ich das tue, muss ich sie in separate Pakete einfügen). Im Wesentlichen gibt es keine overloading eine Klasse von val Typ.

Fehlt mir etwas? Kann ich das vermeiden? Soll ich einfach aufgeben und verwenden !? Verwenden Menschen eine Organisationsstruktur, um zu klären, was los ist?

War es hilfreich?

Lösung

Für mich, deine ReportTrades Nachricht mischt zwei verschiedene Konzepte. Eines ist eine Anfrage, die Bestellung ist eine Antwort. Sie könnten benannt werden GetTradesReport(Date) und SendTradesReport(List[Trade]), zum Beispiel. Oder vielleicht, ReportTradesByDate(Date) und GenerateTradesReport(List[Trade]).

Andere Tipps

Gibt es einige Einwände gegen die Verwendung reply? Oder vorübergehen trades um? Wenn nicht, würde Ihr Code wahrscheinlich so aussehen

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

und

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

beziehungsweise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top