Wie man das Pipeline-Muster elegant mit Scala implementiert

8

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() .

    
Albert Li 07.03.2012, 01:03
quelle

4 Antworten

5

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.

%Vor%     
Albert Li 07.03.2012, 17:18
quelle
8

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.

    
Dave Griffith 07.03.2012 02:27
quelle
3
%Vor%

alle Credits für StephaneLD "| & gt; Operator wie in F #"

Ссылка

    
CocoOS 24.03.2013 17:49
quelle
0

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.

    
Daniel C. Sobral 07.03.2012 20:55
quelle

Tags und Links