Domanda

Nella maggior parte degli esempi di uso corretto dei quadri attore Scala (e Akka), le persone tendono a derivare ogni messaggio da un unico tratto. Ad esempio:

trait Message
object Ping extends Message
object Pong extends Message

Tuttavia, sia in Scala e Akka, la ricezione di messaggi non viene digitato a tutti. C'è qualche ragione per implementare un tratto comune?

È stato utile?

Soluzione

Questo dipende da cosa si sta cercando di ottenere. Ad esempio, di recente ho costruito una piccola applicazione utilizzando attori che avevano diversi tipi di attori, e un attore di gestione che ha agito più o meno come un router. Ora, gli attori che lavorano potrebbero ricevere un sacco di messaggi diversi, per esempio Foo, Bar e Baz. Senza un Supertype, l'attore gestione che avrei dovuto scrivere qualcosa di simile:

react {
    case x:Foo | x:Bar | x:Baz => worker ! x
}

che è ovviamente inutilmente prolisso. Quindi, in questo caso, un WorkerMessage supertipo farebbe un sacco di senso, in quanto semplifica il codice:

react {
    case x:WorkerMessage => worker ! x
}

D'altra parte, questo rende il messaggio Foo, Bar e Baz praticamente inutilizzabile per qualsiasi altro scopo che essere utilizzato dai WorkerActors. Se tu avessi un Stop messaggio o Init per esempio, questo probabilmente sarebbe male perché avresti bisogno di ridefinirlo in tutto il luogo.

Quindi, se si sa che si avrà solo attori che non passano i messaggi in giro (che è, li elaborano da soli), allora immagino che sarete bene anche senza un supertipo per loro.

Credo che la ragione per cui le persone fanno questo, più o meno per impostazione predefinita è che se successivamente si modifica il codice non è necessario per creare il tratto dopo, perché avete già fatto all'inizio.

Personalmente, cerco sempre di evitare un inutile sovraccarico, quindi mi piacerebbe probabilmente non definisco un supertipo a meno che non ne ho proprio bisogno. Inoltre, io davvero non so se la creazione di un supertipo ha alcun effetto sulle prestazioni a tutti, ma mi piacerebbe essere interessante sapere.

Altri suggerimenti

  1. Sia con scala.actors (via InputChannel[T] o Reactor[T]) e Akka (TypedActor) è possibile impostare il tipo di limiti per i messaggi in arrivo;

  2. Nella maggior parte dei esempi, i messaggi si estendono un sealed trait. Questo è fatto per 2 motivi:

    • Se il gestore di messaggi (funzione parziale) del tuo attore non copre tutti i messaggi che estendono il tratto, compilatore genera un avviso ;

    • sealed trait può essere esteso solo nel file di origine, in cui si definisce il tratto, e, in tal modo, il cliente non può definire è propri messaggi che estendono il tratto;

Questo non è obbligatorio, ma è una roba progettazione OO. È un disegno meglio avere un tipo astratto per voi i messaggi dominio applicazione. Così si può avere benefici polimorfismo quando si tratta di messaggi nel nostro codice di applicazione.

  
trait Message

object Ping extends Message
objet Pong extends Message

object Stop
  

Per esempio, se da qualche parte nella vostra applicazione hai a che fare con il mazzo di messaggi, ignorando i tipi specifici (Ping Pong o) si li trattano come oggetti di tipo Message. Ha senso? No?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top