2009-08-21 16 views
6

Ora ho scritto alcune applicazioni utilizzando attori di scala e sono interessato a come le persone si sono avvicinate o hanno affrontato alcuni dei problemi che ho incontrato.Scrivere applicazioni con attori di Scala in pratica

Una pletora di classi di messaggi o!?

Ho un attore che reagisce a un'operazione dell'utente e deve causare qualcosa. Diciamo che è react s a un messaggio UserRequestsX(id). Un problema continuo che ho è che, poiché voglio modularizzare i miei programmi, un singolo attore da solo non è in grado di completare l'azione senza coinvolgere altri attori. Ad esempio, supponiamo di dover utilizzare il parametro id per recuperare un gruppo di valori e quindi questi devono essere eliminati tramite qualche altro attore. Se stavo scrivendo un normale programma Java, potrei fare qualcosa del tipo:

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

Che è abbastanza semplice. Tuttavia, usando gli attori questo diventa un po 'un dolore perché voglio evitare di usare !?. Un attore reagisce al messaggio ReportTrades(date) ma deve chiedere un PersistenceActor per le transazioni e quindi un ReportActor per segnalarli. L'unico modo che ho trovato per farlo è quello di fare:

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

Così che nel mio PersistenceActor ho un blocco di reagire:

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

Ma ora ho 2 problemi:

  1. Devo creare classi messaggio aggiuntive per rappresentare la stessa richiesta (ad esempio "report delle negoziazioni"). In effetti ho tre in questo scenario ma potrei averne molti altri - diventa un problema tenere traccia di questi
  2. Cosa dovrei chiamare il primo e il terzo messaggio ReportTrades? È confuso chiamarli entrambi ReportTrades (o se lo faccio, devo metterli in pacchetti separati). In sostanza non esiste una classedi classe val.

C'è qualcosa che mi manca? Posso evitare questo? Devo semplicemente rinunciare e usare !? Le persone usano qualche struttura organizzativa per chiarire cosa sta succedendo?

+0

È sicuro accedere allo store persistente direttamente in "react"? Pensavo che non potessi fare operazioni di blocco.Forse "ricevere" è necessario per quel particolare attore. –

risposta

2

Per me, il tuo messaggio ReportTrades sta mescolando due concetti diversi. Uno è una richiesta, l'ordine è una risposta. Potrebbero essere denominati GetTradesReport(Date) e SendTradesReport(List[Trade]), ad esempio. O forse ReportTradesByDate(Date) e GenerateTradesReport(List[Trade]).

+0

Ma il mio punto è ancora valido; Ho tutte queste classi utilizzate per nient'altro che passare i dati in giro. Ieri ho scritto un codice per cui avevo bisogno di "decorare" una richiesta con le informazioni di 4 attori separati. Anche tenendo conto di un nome ragionevole, ci sono un sacco di classi confusionarie! –

+0

Bene, tali classi non vengono mai utilizzate solo per trasmettere informazioni. Sono usati per trasmettere informazioni da un posto all'altro per uno scopo. Se li chiami di conseguenza, migliori la leggibilità complessiva del codice. –

0

Ci sono obiezioni all'utilizzo di reply? O passando trades in giro? In caso contrario, il codice sarebbe probabilmente simile

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

e

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

rispettivamente.

+0

Credo che il mio punto sia che non posso semplicemente passare un oggetto 'Trades' al mio coordinatore come * come farebbe a sapere quale comando originale è stato invocato? * Ad esempio, potrei avere diverse cose che devo fare: * DeleteTrades *, * ReportTrades *, * LoadTrades * ecc. Il coordinatore avrà bisogno di ottenere una risposta come 'SomeTradesToReport',' SomeTradesToDelete' o 'SomeTradesToLoad' (supponendo che eviti'!? ') –