dependencies {
compile 'de.grammarcraft:de.grammarcraft.xtend.flow:0.3.+'
compile 'org.eclipse.xtend:org.eclipse.xtend.lib:2.8.+'
}
@FunctionBoard(
inputPorts = #[
@InputPort(name="input", type=String)
],
outputPorts = #[
@OutputPort(name="lower", type=String),
@OutputPort(name="upper", type=String)
]
)
class Normalize {
val toLower = new ToLower
val toUpper = new ToUpper
new() {
toLower.output -> lower
toUpper.output -> upper
input -> toLower
input -> toUpper
}
}
input <= "a input value"
output <= [ if (index > 0) "a value" else "another value" ]
@Operation @FlowUnit(@InputPorts=[], @OutputPorts=[]) class XXX {}
@Integration @FlowUnit(@InputPorts=[], @OutputPorts=[]) class YYY {}
@FlowUnit(@InputPorts=[], @OutputPorts=[]) interface ZZZ {}
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
Aber warum man zur DSL noch einen Klassendefinition für das Zusammenbauen des Flows braucht, verstehe ich nicht. Gerade das möchte ich mir ja sparen
Vielleicht liegt es daran, dass du dich auf die Funktionseinheiten konzentrierst? Statt dich auch die Flows zu fokussieren.
Hier eine noch einfachere DSL, mit der natürlich nicht so viel geht:produzent | konsumentUm diesen Flow herzustellen, würde ich gern nur Instanzen für produzent und konsument registrieren, z.B.flowfx.Bind("produzent", new ReadFromFile("myfile.txt"));flowfx.Bind("konsument", new OutputToConsole());Und dann wird alles zusammengesetzt:flowfx.Integrate();Und dann ausgführt:flowfx.Run();
class RunFlow {
def static void main(String[] args) {
// build
val produzent = new ReadFromFile("myfile.txt")
val konsument = new OutputToConsole()
// bind
produzent -> konsument
// run
konsument <= start // entspricht einem Signal wie '()'
}
}
Normalize:
.output, lower
.output, upper
input, toLower
input, toUpper
OK, das ist kürzer als im FunctionBoard, aber dafür ist das FuntionBoard schon zur Compile-Zeit typsicher und die IDE unterstützt einen mit Autovervollständigung.Normalize:
.in, toLower
.in, toUpper
toLower.out, .lower
toUpper.out, .upper
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
hm... ob Runtime, die eine DSL interpretiert oder ein Compiler in Eclipse: ein bisschen mehr Abstraktion bei der Definition hätte ich mir schon erwartet. Wie gesagt, es sieht für mich irgendwie doppeltgemoppelt aus,
public class Normalize
{
private Action<string> _toLower, _toUpper;
public void input(string inpt)
{
_toLower (inpt);
_toUpper (inpt);
}
public event Action<string> lower;
public event Action<string> upper;
// build
ToLower toLower = new ToLower();
ToUpper toUpper = new ToUpper();
public Normalize ()
{
_toLower = toLower.input;
_toUpper = toUpper.input;
toLower.output += o => this.lower (o);
toUpper.output += o => this.upper (o);
}
}
Das FunctionBoard beschreibt Ports?
functionboard Normalize
inputport String input
outputport String lower
outputport String upper
{ ... }
Und der ctor? Der beschreibt den Flow, da passiert Integration?
Hm...Warum beschreibt die Klasse nicht selbst ihre Ports? Warum brauche ich dafür eine Annotation?
Du siehst, irgendwie wird es für mich nicht wirklich einfach. Vielleicht machst du mal einen größeren Flow, damit man die Vorteile besser sieht. Irgendwas bekanntes wie WordWrap oder CSV Viewer.
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
Hm... Ich glaube, ich sehe nun ein Missverständnis: IODA (oder die dahinter stehenden Prinzipien IOSP und PoMO) verlangen eben keine EBC! Das ist mir sehr wichtig.
EBC war der Anfang von Flow Design. Aber EBC sind nicht das Ende und ich benutze EBC nur noch sehr selten. Sie Übersetzung einer Flow Funktionseinheit in eine EBC macht manchmal Sinn - viel häufiger ist sie aber viel zu umständlich. Das Normalize-Beispiel ist schon so ein Fall. Ohne EBC sähe das für mich so aus:void Normalize(string input, Action<string> lowercased, Action<string> uppercased) {lowercased(s1.ToLower(input));uppercased(s2.ToUpper(input));}Wo die Funktionen ToLower()/ToUpper() herkommen, ist egal. Ich habe mal zwei Dienstobjekte s1 und s2 angenommen. Sie können aber auch auf demselben Objekt oder statisch oder sonstwie definiert sein.
[FunctionBoard]
void Normalize([InputPort] string input, [OutputPort] Action<string> lowercased, [OutputPort] Action<string> uppercased) {
lowercased(s1.ToLower(input));
uppercased(s2.ToUpper(input));
}
Jedenfalls ist das alles, was nötig ist, um einen Flow zu verdrahten, der einen Input durch zwei Funktionseinheiten fließen lässt und zwei Outputs erzeugt.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-components+unsub...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
--Ralf Westphal - One Man Think TankHans-Henny-Jahnn-Weg 44
D-22085 Hamburg
Germany
Tel 0170-3200458
Email in...@ralfw.de
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
Ich geb dir Recht, eine Konvention ist schwächer als Syntax. [...]
In anderen Sprachen versucht man es mit Fluent Interfaces verschiedener Frameworks (z.B. Linq, Rx, TPL Dataflow).Allen gemein ist jedoch, dass die Trennung von Integration und Operation darin nur eine Konvention ist.Um einen großen Schritt voranzukommen wäre es nötig, genau diese Unterscheidung aber zu formalisieren. Die Trennung darf nicht optional sein. Das sehe ich aber nur mit einer DSL für Flows als möglich, die extern ist. Ob die von einer Runtime interpretiert wird oder von einem Compiler nach C# oder IL übersetzt wird, ist egal.
Wenn man ein Programm mit der Flow DSL (FDSL) schreibt, muss man wie in C# Projekten anderen Code referenzieren können. Der steht dann passend zur Verfügung. Der Compiler (oder gar die IDE) prüft sofort, ob der Flow syntaktisch korrekt zusammengesteckt ist.
Das sollte auch nicht nur für EBC funktionieren, sondern ebenso für Funktionseinheiten, die als normale Funktionen realisiert sind.
void Normalize([InputPort] string input, [OutputPort] Action<string> lowercased, [OutputPort] Action<string> uppercased)
Das Problem bei einer textuellen Sprache für Flows bleiben jedoch 2D-Flows. Die kennen selbst die FPler ja nicht wirklich, weil sie sie nicht vernünftig in ihrer Sprache ausdrücken können.Also ist Flow Design am Ende eh nur wirklich expressiv mit einer visuellen DSL möglich. Die braucht eine textuelle Entsprechung zur Serialisierung. Doch die müsste dann nicht mehr auf Lesbarkeit für Menschen optimiert sein.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-components+unsub...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
--Ralf Westphal - One Man Think TankHans-Henny-Jahnn-Weg 44
D-22085 Hamburg
Germany
Tel 0170-3200458
Email in...@ralfw.de
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-components+unsub...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
Ich weiß nicht, meine Erfahrungen mit grafischen Editier-Tools ist die, dass man damit meistens viel zu langsam in der Bedienung selbiger ist. Zumindest langsamer als wenn man das Design in einer formalen Notationen niederschreibt.
Was ich mir dann aber vorstellen könnte, ist eine automatische grafische Visualisierung des Flows - sozusagen nicht WYSIWYG sondern paralleles Rendering mit Rückverlinkung (also wenn ich ein grafisches Element selektiere springt der Texteditor zum zugehörigen textuellen Element), ähnlich vielen Markdown-Editoren.
Das Ganze ist einfacher zu realisieren und, behaupte ich mal, im Durchschnitt auch schneller zu bedienen.
Aber das hängt sicher stark vom Geschmack und eigenen Fertigkeiten und am Ende von den Fähigkeiten des Tools ab.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
--Ralf Westphal - One Man Think TankHans-Henny-Jahnn-Weg 44
D-22085 Hamburg
Germany
Tel 0170-3200458
Email in...@ralfw.de
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
--Ralf Westphal - One Man Think TankHans-Henny-Jahnn-Weg 44
D-22085 Hamburg
Germany
Tel 0170-3200458
Email in...@ralfw.de
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Event based Components" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an event-based-compo...@googlegroups.com.
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.