Montag, 4. November 2013

Flow Design


Flow Design finde ich wirklich toll und bin überzeugt, dass man damit bessere Programme schreiben kann (wartbarer, verständlicher, testbarer). Immer wieder lese ich in Ralf Westphals Blogs (z.B. One Man Think Tank Gedanken) darüber und habe auch schon manchmal probiert das umzusetzen.

Doch es sind immer nur kleine Ausflüge. In der täglichen Arbeit mache ich es noch nicht. Da arbeite ich wild drauf los, mache funktionale Abhängigkeiten nach der Reihe und habe all die Probleme, die Flow Design lösen würde. Was habe ich so schon alles verbrochen?! :-)

Der Grund, warum ich nicht diesen FD Richtlinien folge, ist wohl, dass ich noch zu unsicher bin und es in der Umsetzung in C# oder Javascript auch ein wenig umständlich ist. Nein, das stimmt so nicht. Es ist eher ungewöhnlich für mich. Es ist mir einfach noch nicht in Fleisch und Blut übergegangen.

Ich brauche Übung und somit habe ich das Angebot von Ralf Westphal sehr gerne angenommen, ein Design abzuliefern und hoffe bald Anmerkungen dafür zu erhalten.

Die Aufgabenstellung:


Mein Lösungsansatz:
Ich habe nicht nach einer Rekursion gesucht, keinen Baum aufgebaut und ihn flachgeklopft und nicht mal auf Geschwindigkeit getrimmt. Ich habe eine Lösung verfolgt, wie ich es händisch relativ einfach machen könnte.

Was mir schon ein wenig im Hinterkopf rumschwebte, war, dass ich irgendwann eine schöne Fehlermeldung erhalten will, welche Abhängigkeiten Probleme machen und so war es mir wichtig, die vermutlich dazu nötige Infos, dann zur Verfügung zu haben.

Kurz erklärt:
Bei register() wird eine Liste aufgebaut, die dann als Start für sort() verwendet wird.
Und bei sort() wird zuerst eine Vereinfachung der Jobliste durchgeführt, sodass es für jeden Job nur einen Eintrag gibt.
Diese Liste wird dann nach der Reihe abgearbeitet und jene Jobs werden durchnummeriert, die ausgeführt werden können, weil sie keine Abhängigkeiten haben, bzw. die abhängigen Jobs bereits erledigt sind. Am Ende wird überprüft, ob es noch nicht sortierte Jobs gibt, dann wird die Liste ein zweites Mal abgearbeitet. Das wird so lange wiederholt, bis alle Jobs sortiert sind oder in einer Runde keine neuen Jobs mehr nummeriert werden konnten, dann wird eine Exception geworfen. Ansonsten muss die Jobliste dann nur mehr anhand der Nummerierung ausgegeben werden.

2 Kommentare:

  1. Hi, ich finde die angewandte Lösung ziemlich komplex - ich tu mich schwer beim Lesen von dem Diagramm.

    In der Einleitung schreibst du, das es ungewöhnlich sei für dich anzuwenden - wieso? Mich würde interessieren wie du Probleme momentan zerlegst und Lösungen entwickelst.

    Gruß
    Patrick Koglin
    www.agile-is-limit.de

    AntwortenLöschen
    Antworten
    1. Danke für Deinen Kommentar.
      Ja, auch ich finde meinen Lösungsansatz noch zu komplex. Durch Deinen Kommentar fühle ich mich da auch bestätigt und motiviert, das noch zu verbessern.

      Zu Deiner Frage:
      Um eine Lösung zu entwickeln gehe ich im Moment eigentlich genau so vor, wie meine Zeichnungen es zeigen. Ich mache es für gewöhnlich nicht so detailliert, aber ich zeichne schon sehr gerne Kasterln (Bubbles) und Pfeile und die helfen mir auch bei der Umsetzung.

      > ungewöhnlich für dich anzuwenden
      Da habe ich mich anscheinend nicht ganz richtig ausgedrückt. Was für mich ungewöhnlich ist, ist die Umsetzung in Code. Die Pfeile sind für mich auf der Zeichnung Messages, so wie das FD vorsieht. Bei der Umsetzung in Code wird daraus bei mir (aus Bequemlichkeitsgründen befürchte ich) aber meist ein Funktionsaufruf mit einem Rückgabewert und keine Nachricht, die rausfließt.
      Zu oft entsteht bei mir auch eine Funktion, indem ich mit Hilfe der Refaktorisierungstools in Visual Studio einen Sourcecodeabschnitt als Methode extrahiere und dann diese Funktion einfach so weiterleben lasse, ohne sie nachzubearbeiten und so bleibt sie vom aufrufenden Code abhängig.

      Der erste Weg zur Besserung ist die Erkenntnis :-). Mal sehen, ob ich dieses Wochenende wieder Zeit habe, an der Aufgabe zu basteln.

      Löschen