Functional Reactive Programming (FRP): Mehr als nur Datenströme und Lambdas #1

Functional Reactive Programming (FRP) ist ein Programmierparadigma, welches reaktive Programmierung mit asynchronen Datenströmen verbindet und Bausteine der funktionalen Programmierung verwendet. Genau wie bei anderen Programmierparadigmen handelt es sich nicht um eine brandneue Idee. Das Konzept wurde 1997 eingeführt, jedoch seit 2014 wächst zunehmend die Beliebtheit, als das später noch zu erwähnende Reactive Manifesto veröffentlicht wurde. Auch bei der Spring I/O 2019, über die wir zuletzt berichtet haben, war reaktive Programmierung ein wichtiges Thema.

Warum asynchrone Datenströme?

Bei der Interaktion mit Mobil-, Desktop- oder Webanwendungen wird normalerweise das gesamte Formular an das Backend und die Rendering-Ansicht an das Frontend gesendet. Heutzutage erwarten Benutzer ein Echtzeiterlebnis. Nach der Eingabe einiger Buchstaben in das Suchfeld erwartet der Benutzer, dass die Suchergebnisse sofort angezeigt werden. Dies ist möglich, wenn der kontinuierliche Datenfluss zwischen Benutzeroberfläche und Back-End-Anwendungen bestehen bleibt und Datenströme hier eine entscheidende Rolle spielen.

Mit der reaktiven Programmierung ist es möglich, Datenströme aus allem zu erstellen.

Ausgegebene Daten werden asynchron erfasst und von einer definierten Funktion verarbeitet. Man kann auch eine andere Funktion definieren, wenn ein Fehler ausgegeben wird, und eine weitere Funktion, wenn der Stream abgeschlossen ist. Manchmal können die letzten beiden weggelassen werden, und man kann sich nur darauf konzentrieren, die Funktion für Werte zu definieren.

Das „Abhören“ des Streams wird Abonnieren genannt. Die Funktionen, die wir definieren, sind Beobachter. Der Strom ist das Beobachtbare, das eben beobachtet wird. Hierbei handelt es sich um den Observer Design Pattern.

Warum Funktionale Programmierung?

Funktionale Programmierung erhöht die Abstraktionsebene des Codes, sodass Entwickler sich auf die gegenseitige Abhängigkeit von Ereignissen konzentrieren können, die die Geschäftslogik definieren, anstatt ständig mit einer Vielzahl von Implementierungsdetails herumzuspielen, die jetzt unter Streams verborgen sind. Die funktionale Programmierung bietet außerdem eine fantastische Toolbox mit Funktionen zum Kombinieren, Erstellen, Zuordnen und Filtern beliebiger Datenströme.

Was ist das Reactive Manifesto?

FRP.png

Das Reaktive Manifest wurde 2013 erstmals von einer Gruppe von Entwicklern um Jonas Boner veröffentlicht und ist ein Dokument, dass die Kernprinzipien Reaktiver Programmierung festhält:

  • Responsive: Das System antwortet unter allen Umständen zeitgerecht, solange dies überhaupt möglich ist. Reaktionsfähigkeit bedeutet auch, dass Probleme schnell erkannt und effektiv behoben werden können.

  • Resilient: Das System reagiert auch im Fehlerfall und bleibt Responsive.

  • Elastic: Das System reagiert auf sich ändernde Arbeitslasten, reaktive Systeme können auf Änderungen der Eingaberate durch Erhöhen oder Verringern der den Diensten zugewiesenen Ressourcen reagieren.

  • Message Driven: Das System verwendet asynchrone Nachrichtenübermittlung zwischen seinen Komponenten zur Sicherstellung von deren Entkopplung und Isolation, sowie zwecks Übermittlung von Fehlern an übergeordnete Komponenten.

Zwischenfazit

Systeme, die auf Basis von Functional Reactive Programming erstellt werden sind flexibel, lose gekoppelt und skalierbar. Das macht es einfacher, sie zu entwickeln und Änderungen zuzulassen. Sie sind wesentlich toleranter gegenüber Misserfolgen und begegnen Misserfolgen eher mit Eleganz als mit einer Katastrophe.

In zweiten Blogpost zum Thema Functional Reactive Programming gehen wir auf die Implementierung in Java und dem Spring Framework ein und werfen einen Blick auf die Herausforderungen bei Legacy Systemen.