Denis Kuniß Diebold Nixdorf

Ich denke, funktionale Programmierung, reaktive Programmierung, Aktor-Programmierung und Flow Design bedeuten noch nicht das Ende der Entwicklung.

Der Flow-Design-Ansatz ist so fundamental wie der objektorientierte oder der funktionale, sodass sich die Umsetzung als eigenständiges Sprachkonstrukt geradezu aufdrängt. Allerdings muss es nicht gleich eine eigene Programmiersprache sein. In Scala lassen sich über interne DSLs Spracherweiterungen hinzufügen. Dieser Artikel beschreibt, wie sich die in Teil 4 dieser Artikelreihe vorgestellte Spracherweiterung in Scala umsetzen lässt.

Eine Funktionseinheit in Flow Design folgt dem in Abbildung 1 dargestellten Muster. Nachrichten erreichen eine Funktionseinheit über einen Port, Ergebnisse verlassen eine Funktionseinheit über einen solchen.

Abb. 1: Schema einer Funktionseinheit

Abb. 1: Schema einer Funktionseinheit

Nachrichten verarbeiten

Die in eine Funktionseinheit einfließenden Nachrichten müssen verarbeitet werden. Das ist schließlich ihr eigentlicher Zweck, den wir als Entwickler programmativ beschreiben wollen. Werfen wir einen Blick auf ein einfaches Beispiel, anhand dessen wir ableiten können, wie sich die Verarbeitung von Nachrichten einer Funktionseinheit in Scala realisieren ließe. Abbildung 2 zeigt eine einfache Funktionseinheit, die eine Zeichenkette empfängt und sie in eine Zeichenkette umwandelt, die ausschließlich aus Großbuchstaben besteht. Die Funktionalität ist trivial, aber es geht hier mehr um das Prinzip. Statt einer einfachen Umwandlung wäre auch eine komplexere Verarbeitung denkbar.

Artikelserie

  • Teil 1: Flow Design: ein neuer Ansatz für Softwaredesign
  • Teil 2: IODA: ein neuer Ansatz für Softwarearchitekturen
  • Teil 3: Flow Design in Java implementieren
  • Teil 4: Flow Design mit Scala
  • Teil 5: Eine Spracherweiterung für Flow Design in Scala implementieren
Abb. 2: Beispiel einer einfachen Funktionseinheit

Abb. 2: Beispiel einer einfachen Funktionseinheit

Die Verarbeitung der über den input-Port eintreffenden Nachricht ließe sich als Methode in Scala realisieren:

class ToUpper {
  def input(msg: String) 
  {
    process(msg)
  }  
  …
}

Die eintreffende Nachricht wird in der Methode process verarbeitet. Diese Methode definiert die eigentliche Funktionalität der Funktionseinheit.

class ToUpper {
  …
  private def process(msg: String) {
    output(msg.toUpperCase())
  }
}

Nachrichten versenden

Das Ergebnis der Verarbeitung muss aus der Funktionseinheit heraus fließen. Dazu wird es einfach einer output-Methode übergeben, die den Ausgangsport output der Funktionseinheit symbolisiert und für die Ausleitung des Ergebnisses sorgt. Diese output-Methode hat keine Implementierung in der Funktionseinheit ToUpper. Dazu müsste die Funktionseinheit ja wissen, wie das Ergebnis weiterverarbeitet wird. Das ist während der Implementierung der Funktionseinheit unbekannt und gewährleistet ihre Nichtbeachtung durch andere Funktionseinheiten, das Grundprinzip von Flow Design.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 12.17 - "Ordnung im Containerchaos"

Alle Infos zum Heft
579817649Syntaktischer Zucker: Flow-Spracherweiterungen in Scala
X
- Gib Deinen Standort ein -
- or -