2009-08-21 2 views
6

Ich habe jetzt ein paar Anwendungen geschrieben, die Scala-Darsteller verwenden, und ich bin daran interessiert, wie Menschen mit einigen der Probleme, auf die ich gestoßen bin, umgegangen sind.Schreiben von Anwendungen mit Scala-Darstellern in der Praxis

Eine Fülle von Nachrichtenklassen oder!?

Ich habe einen Akteur, der auf eine Benutzeroperation reagiert und etwas verursachen muss. Sagen wir es react s zu einer Nachricht UserRequestsX(id). Ein fortwährendes Problem, das ich habe, ist, dass, weil ich meine Programme modularisieren möchte, ein einzelner Akteur allein nicht in der Lage ist, die Handlung zu vollenden, ohne andere Akteure zu involvieren. Angenommen, ich muss den Parameter id verwenden, um eine Reihe von Werten abzurufen, und diese müssen dann über einen anderen Akteur gelöscht werden. Wenn ich ein normales Java-Programm geschrieben hat, könnte ich so etwas wie:

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

, die einfach genug ist. Bei Verwendung von Schauspielern wird dies jedoch zu einem kleinen Problem, da ich vermeiden möchte, !? zu verwenden. Ein Schauspieler reagiert auf die ReportTrades(date) Nachricht, aber es muss eine PersistenceActor für die Geschäfte und dann eine ReportActor bitten, sie zu melden. Die einzige Art, wie ich dies zu tun gefunden habe, ist zu tun:

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

so dass in meinem PersistenceActor Ich habe einen Block reagieren:

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

Aber jetzt habe ich zwei Probleme:

  1. Ich muss zusätzliche Nachrichtenklassen erstellen, um die gleiche Anfrage (dh "Bericht Trades") zu repräsentieren. Tatsächlich habe ich drei in diesem Szenario, aber ich kann viel mehr haben - es wird ein Problem, das diese
  2. verfolgen. Wie soll ich die erste und dritte Nachricht ReportTrades nennen? Es ist verwirrend, sie beide ReportTrades zu nennen (oder wenn ich das tue, muss ich sie in separate Pakete setzen). Im Wesentlichen gibt es keine overloading eine Klasse von val Typ.

Gibt es etwas, das ich vermisse? Kann ich das vermeiden? Sollte ich einfach aufgeben und verwenden !? Verwenden Menschen einige organisatorische Struktur, um zu klären, was vor sich geht?

+0

Ist es sicher, direkt auf den persistenten Speicher in "reagieren" zuzugreifen? Ich dachte, du könntest keine blockierenden Operationen machen.Vielleicht wird "erhalten" für diesen bestimmten Schauspieler benötigt. –

Antwort

2

Für mich ist Ihre Nachricht ReportTrades zwei verschiedene Konzepte. Eine ist eine Anfrage, die Bestellung ist eine Antwort. Sie können beispielsweise GetTradesReport(Date) und SendTradesReport(List[Trade]) genannt werden. Oder, vielleicht, ReportTradesByDate(Date) und GenerateTradesReport(List[Trade]).

+0

Aber mein Punkt steht immer noch; Ich habe all diese Klassen nur für die Weitergabe von Daten verwendet. Gestern habe ich einen Code geschrieben, bei dem ich eine Anfrage mit Informationen von 4 verschiedenen Akteuren "dekorieren" musste. Selbst wenn sinnvolle Benennungen möglich sind, ist es eine verwirrende Klasse! –

+0

Nun, solche Klassen werden nie nur verwendet, um Informationen zu vermitteln. Sie dienen dazu, Informationen für einen bestimmten Zweck von einem Ort zum anderen zu übermitteln. Wenn Sie sie entsprechend benennen, verbessern Sie die allgemeine Lesbarkeit des Codes. –

0

Gibt es Einwände gegen die Verwendung von reply? Oder vorbei trades herum? Wenn nicht, würde der Code wahrscheinlich 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))) 
} 

sind.

+0

Ich denke, mein Punkt ist, dass ich ein "Trades" -Objekt nicht einfach an meinen Koordinator weiterleiten kann als * wie würde es wissen, welcher ursprüngliche Befehl aufgerufen wurde? * Zum Beispiel kann ich mehrere Dinge haben, die ich tun muss: * DeleteTrades *, * ReportTrades *, * LoadTrades * usw. Der Coordinator muss eine Antwort wie 'SomeTradesToReport',' SomeTradesToDelete' oder 'SomeTradesToLoad' erhalten (vorausgesetzt, ich vermeide'!? ') –

Verwandte Themen