Frage

In den meisten Beispielen für die ordnungsgemäße Verwendung der Scala- (und AKKA) -Aktoren -Frameworks neigen Menschen dazu, jede Botschaft von einem einzigen Merkmal abzuleiten. Zum Beispiel:

trait Message
object Ping extends Message
object Pong extends Message

Sowohl in Scala als auch in AKKA wird der Nachrichtenempfang jedoch überhaupt nicht eingegeben. Gibt es einen Grund, ein gemeinsames Merkmal umzusetzen?

War es hilfreich?

Lösung

Dies hängt wirklich davon ab, was Sie erreichen möchten. Zum Beispiel habe ich kürzlich eine kleine Anwendung unter Verwendung von Akteuren mit mehreren Arten von Akteuren und einem Managing Actor gebaut, der mehr oder weniger wie ein Router verhielt. Jetzt könnten die arbeitenden Schauspieler beispielsweise viele verschiedene Nachrichten erhalten Foo, Bar und Baz. Ohne Supertype müsste ich im Managing -Schauspieler so etwas schreiben:

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

Das ist offensichtlich unnötig ausführlich. Also in diesem Fall ein Supertyp WorkerMessage Würde viel Sinn machen, weil es Ihren Code vereinfacht:

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

Andererseits macht dies die Nachrichten Foo, Bar und Baz Für jeden anderen Zweck ziemlich unbrauchbar, als von Ihren Arbeiteraktoren verwendet zu werden. Wenn Sie eine Nachricht hätten Stop oder Init Zum Beispiel wäre dies wahrscheinlich schlecht, weil Sie es überall neu definieren müssten.

Wenn Sie also wissen, dass Sie nur Akteure haben, die keine Nachrichten übergeben (dh sie verarbeiten sie selbst), dann werden Sie es wohl ohne Supertyp für sie in Ordnung sein.

Ich denke, der Grund, warum die Leute dies standardmäßig mehr oder weniger tun, ist, dass Sie, wenn Sie später Ihren Code ändern, das Merkmal danach nicht erstellen müssen, weil Sie es bereits am Anfang getan haben.

Persönlich versuche ich immer, unnötigen Overhead zu vermeiden, daher würde ich wahrscheinlich keinen Supertyp definieren, es sei denn, ich brauche es wirklich. Außerdem weiß ich wirklich nicht, ob das Erstellen eines Supertyps überhaupt auf die Leistung wirkt, aber ich wäre interessant zu wissen.

Andere Tipps

  1. Beide mit scala.actors (über InputChannel[T] oder Reactor[T]) und Akka (TypedActor) Sie können Typengrenzen für die eingehenden Nachrichten festlegen.

  2. In den meisten Beispielen erweitern Nachrichten a sealed trait. Das wird aus 2 Gründen geschehen:

    • Wenn der Nachrichtenhandler (Teilfunktion) Ihres Schauspielers nicht alle Nachrichten abdeckt, die das Merkmal erweitern, Compiler erzeugt eine Warnung;

    • sealed trait kann nur in der Quelldatei erweitert werden, in der das Merkmal definiert ist, und der Client kann daher keine eigenen Nachrichten definieren, die das Merkmal erweitern.

Dies ist nicht obligatorisch, aber es ist ein OO -Design -Zeug. Es ist ein besseres Design, einen abstrakten Typ für Ihre Anwendungsdomänennachrichten zu haben. So können Sie bei der Bearbeitung von Nachrichten in unserem Anwendungscode Polymorphismus -Vorteile haben.

  
trait Message

object Ping extends Message
objet Pong extends Message

object Stop
  

Wenn Sie beispielsweise irgendwo in Ihrer Anwendung unabhängig von ihren spezifischen Typen (Ping oder Pong) sich mit einer Reihe von Nachrichten befassen müssen, behandeln Sie sie alle als Objekte des Typs von Typen. Es ergibt Sinn? Nein ?

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