Schreiben von Anwendungen mit Scala -Akteuren in der Praxis
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 react
s 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:
- 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
- Wie soll ich die erste und dritte Nachricht nennen?
ReportTrades
? Es ist verwirrend, sie beide zu nennenReportTrades
(Oder wenn ich das tue, muss ich sie in separate Pakete einfügen). Im Wesentlichen gibt es keineoverloading
eine Klasse vonval
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?
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.