Ich möchte ein Pipeline-Muster mit Scala erstellen. Ich wünschte, nachdem ich die Pipeline-Objekte geschrieben habe, könnten sie so miteinander verbunden werden:
%Vor%Ich habe bisher mit ein paar Ideen experimentiert. Manche arbeiten und manche nicht. Aber keiner von ihnen scheint den Standardcode vollständig loszuwerden. Das Folgende ist das nächste, das ich habe.
Definieren Sie zuerst die abstrakte Klasse der Pipeline und der Quelle:
%Vor%Als Nächstes habe ich zwei Pipelines erstellt und versucht, sie miteinander zu verknüpfen
%Vor%Dies ist die Hauptklasse, in der zwei Pipelines miteinander verbunden sind.
%Vor%Also dieser Code funktioniert. Aber ich müsste den Code im TimesTen Companion-Objekt in jeder Pipeline-Klasse, die ich schreibe, wiederholen. Dies ist sicherlich nicht wünschenswert. Gibt es einen besseren Weg, dies zu tun? Die Reflexion könnte funktionieren, aber ich habe schlechte Dinge darüber gehört, dass alles, was mit Reflexion zu tun hat, schlecht ist. Ich bin auch unsicher über die Unterstützung von Scala für das Nachdenken.
Danke für Ihre Zeit.
Update : Ich habe dieses Spielzeugproblem entworfen, um es einfach zu verstehen. Als eine allgemeine Lösung, und wie meine Anwendung erfordert, hat jedes Pipeline-Objekt einen Zustand, der idealerweise in dem Objekt selbst eingekapselt ist und nicht jeder anderen Pipeline ausgesetzt ist. Ich habe den Code oben geändert, um dies zu reflektieren. Ich wünschte, es könnte eine objektbasierte Lösung geben. Ich experimentiere immer noch und werde Sie wissen lassen, ob ich einen finde.
Update 2 : Nach einigen Gedanken denke ich, dass die Idee der Pipeline wirklich nur eine verallgemeinerte Funktion ist, die einige interne Zustände sowie die Möglichkeit enthält, eine Function0
-Funktion mit einem% zu erstellen. co_de% -Funktion. In Scala hat die Klasse Function1
nicht die Methode Function0
oder compose()
.
Hier ist die Lösung mit Objekten, die andThen
verwenden. Die Idee ist, die Erstellung von Function1
-Objekten durch Verwendung der Eingabe Unit
zu erzwingen. Wenn Sie zwei Pipelines verbinden, wird eine neue Pipeline mit den beiden Funktionen erstellt. Diese Lösung ermöglicht es Pipelines, interne Zustände zu haben.
Eine weitere Vereinfachung wäre die Verwendung von apply()
anstelle von produce()
. Dies ist eine Übung für den Leser.
Wenn ich etwas nicht verpasse, sind Ihre Pipeline-Objekte nur Funktionen und Ihr :: -Operator ist nur "compose"
%Vor%Ihre "produce ()" Methode ist nur "apply ()", aber es ist üblich, die Abkürzung von "()" zu verwenden. Mit einer kleinen Menge an Bibliothekszuordnung können Sie einen Operator für die Komposition verwenden. Dies ist einer der Fälle, in denen objektorientierte Boilerplatten einfachen funktionalen Konzepten im Wege stehen. Glücklicherweise lässt Scala Sie für viele Anwendungsfälle wie dieses den Standard vermeiden.
Sie meinen wie ein Datenfluss oder eine funktionale reaktive Programmierung? Probieren Sie diese Frage aus. Die reaktive Bibliothek wird aktiv entwickelt - über den Rest weiß ich nichts.