Ich versuche das Beispiel nochmal zu konkretisieren:
Es sollen Daten aus einer Konfigurationsdatei gelesen werden. Mal sind das Json Daten, mal CSV. Am Ende kommt aber immer dasselbe heraus, ein Config-Objektgraph.
Input für das Ganze ist eine URI bzw. ein Dateiname.
Output ist der Config-Objektgraph.
-(uri)-> (Konfiguration laden) -(Config)->
Das Laden zerfällt in zwei Schritte: Die Daten in den Speicher holen und die Daten parsen.
Die Schwierigkeit nun: Es gibt zwei Parser. Es muss also einer ausgewählt werden nach dem Laden.
Wie findet die Auswahl statt (aufgrund der URI oder aufgrund des Inhalts)?
Wo findet die Auswahl statt (vor dem Laden oder hinterher)?
Ich mache es mir einfach und sage: Die Auswahl findet aufgrund der Daten statt. Eine Json Daten kann man leicht von CSV Daten unterscheiden.
(Konfiguration laden) {
(this) -(uri)-> (Daten laden) -(konfigdaten:string)-> (Datenformat erkennen),
(Datenformat erkennen.Json) -(string)-> (Json nach Config parsen) -(Config)-> (this),
(Datenformat erkennen.CSV) -(string)-> (CSV nach Config parsen) -(Config)-> (this),
}
Jetzt frage ich mich, ob FD dringend weitere Notationselemente braucht, um das zu verstehen?
Sollten die Output-Pins .Json und .CSV irgendwie speziell gekennzeichnet sein als "alternativ"?
Sollte (Datenformat erkennen) speziell gekennzeichnet sein als "Entscheidungsoperation"?
Hm... ersteres vielleicht.
Aber ich empfinde da keinen Druck. In den vielen Flow-Designs, die ich schon gemalt habe, war die Semantik in dieser Hinsicht kein Problem, das mir im Gedächtnis geblieben ist.
Ich denke, das Geheimnis liegt in der passenden Benennung einer entscheidenden Funktionseinheit.