FD Kontrollstrukturen auf hoher Abstraktionsebene

87 views
Skip to first unread message

Leba

unread,
Jan 24, 2014, 6:13:03 AM1/24/14
to clean-code...@googlegroups.com
Hallo,

bei der Beschäftigung mit dem Thema Flow Design, bin ich auf eine Frage gestoßen, zu der ich keine Informationen finden konnte.
Wie notiert und implementiert man am besten Kontrollstrukturen auf hoher Abstraktionsebene.

Klar, Logik, also Bedingungen und Schleifen, darf bei einem FD nur in den Blättern des Abhängigkeitsgraphen der Funktionseinheiten enthalten sein.

Aber was ist, wenn eine FU z.B. unter einer Bedingung oder innerhalb einer Schleife einen Subflow aufrufen soll?

Ich kann mir nicht vorstellen, dass dies im FD nicht vorgesehen ist.

Natürlich hab ich schon mal mein eigens Hirn angestrengt. Im Anhang ist ein simpler Beispiel Flow zu sehen.
Nehmen wir an, dass C und D komplizierte Subflows enthalten. A ist ein "Board" und B ist ein "Part" bzw. Blatt.
Wie kennzeichne ich hier die Bedingung, dass entweder B oder C ausgeführt wird?

Eine mögliche Umsetzung mit Methoden wäre wie folgt.

public string A(string message)
{
    Result1 = C;
    Result2 = D;
    return B(message);
}
 
private string B(string message)
{
    if (DateTime.Now.Millisecond % 2 == 0)
    {
        return Result1(message);
    }
    else
    {
        return Result2(message);
    }
}
 
private Func<stringstringResult1;
private Func<stringstringResult2;
 
private string C(string message)
{
    return message + "C";
}
 
private string D(string message)
{
    return message + "B";
}

Kann mir jemand hierzu was sagen, sind meine Überlegungen grundsätzlich richtig, oder gibt es Ressourcen, die ich noch nicht kenne?

Danke und Grüße
Leif
fd_if.jpg

Ralf Westphal

unread,
Jan 25, 2014, 4:14:07 AM1/25/14
to clean-code...@googlegroups.com
Flow-Design kennt keine Kontrollstrukturen. Das ist der Trick an der Sache mit Flow-Design :-) Das wird durch das Integration Operation Segregation Principle (IOSP) ausgedrückt. Logik - also Ausdrücke und Kontrollstrukturen - gibt es nur in Blättern.

Aber natürlich kann eine Funktionseinheit auf beliebiger Abstraktionsebene - also Operationen wie Integrationen - mehrere Output-Ports haben. Wie dein B im Bild. Das kann man dann so verdrahten wie du es getan hast - aber dann sieht man nur schwer den Fluss. Und es ist umständlich.

Vielmehr sollte dein B so aussehen (wenn du keine EBC daraus machen willst):

void B(string input, Action<string> beiGeraderZeit, Action<string> beiUngeraderZeit) {
  if (... == 0)
    beiGeraderZeit(input);
  else
    beiUngeraderZeit(input);
}

und A sähe dann so aus:

void A(string input) {
  B(input,
    C,
    D);
}

Wichtig ist, dass B dann nicht "if" heißt, sondern einen sinnigen Namen hat, z.B. "Auf Signalzeit prüfen".

Diese Codierung nennt man Continuation Passing Style (CPS).

Leba

unread,
Jan 26, 2014, 2:36:07 PM1/26/14
to clean-code...@googlegroups.com
Super, danke für die Antwort.

Grüße
Leif
Reply all
Reply to author
Forward
0 new messages