Higher-order Functions

Warum sollte man funktionale Programming überhaupt lernen?

Es gibt viele Gründe, die dafür sprechen, dass man sich mit funktionaler Programmierung auseinandersetzen sollte.

Ein paar davon:

  1. Coding macht mehr Spaß 🙂
  2. Der Code wird sicherer.
  3. Man produziert weniger Bugs.
  4. Man benötigt weniger zeit, um Features umzusetzen.
  5. Die Wiederverwendbarkeit wird besser.
  6. Der Code ist “easier to reason about”.

“easier to reason about”?

Preethi Kasireddy hat darüber einen schönen Artikel geschrieben: What does it mean when code is “easy to reason about”? Sobald man versteht, was der Ausspruch bedeutet, fällt es schon leichter, besseren Code zu schreiben. Ein Code ist “easy to reason about”, wenn folgendes gilt:

  1. Es treten keine unerwarteten Nebeneffekte auf.
  2. Code hängt nicht von externen Faktoren ab (Variablen, Zuständen).
  3. Mit dem selben Input wird immer derselbe Output generiert (referential transparency oder pure function).

Wenn man sich darum bemüht, seinen Code so zu schreiben, dann kann man ihn auch leichter validieren. So z.B. mit Unit Testing, Static Typ Checking (Flow) oder Immutable Data (ImmutableJS).

Was sind higher-order functions

Das Besondere an funktionaler Programmierung? Funktionen sind Werte! Alle Programmiersprachen haben Funktionen, aber diese einer Variablen zuweisen zu können, das können die Wenigsten. Hier eine normale Funktion

Folgendes Konstrukt mit nur einer leichten Änderung der Funktion wird z.B. eine anonyme Funktion genannt, bei der die anonyme Funktion einer Variablen zugewiesen wird:

Und mit dieser Variablen kann man natürlich sehr gut weiterarbeiten.

Nun, da Funktionen wie Variablen behandelt werden können, können wir auch ganz abgefahrene Dinge tun und diese an andere Funktionen übergeben – als Parameter! Das sind dann die sogenannten higher-order functions. Das tolle daran ist, dass eine Menge kleiner Funktionen zu größeren, mächtigeren Funktionen zusammengefügt werden können. Das nennt sich Komposition (composition). Das ist die Theorie. Jetzt mal ein paar Beispiele. Es existieren natürlich schon einige benutzbare higher order functions in Java Script. z.B. filter, map, etc..

Wenn wir konventionell arbeiten wollen ohne functional programming, dann würde eine filter-Funktion z.B. so aussehen.

Funktionen, die in andere Funktionen übergegeben werden, werden callback functions genannt, weil die äußere Funktion diese aufrufen wird. Filter wird durch jedes Item gehen und dieses in die callback function übergeben. Filter erwartet dann von der callback function, dass diese einen Boolean zurückgibt, um zu entscheiden, ob das entsprechende Element gefiltert werden soll oder nicht.

Man kann hier sehr schön sehen, dass in der Tat weniger Code benötigt wird. Das ist aber nicht so, weil wir eine schönere, schlankere Syntax haben. In der Tat wird nämlich weniger Logik benötigt. Das Iterieren fällt weg und das Instanziieren eines neuen Rückgabe-Arrays. Alles wunderschön verpackt in der konkreten Beschreibung durch den Funktionsnamen: filter.

Das filter-Beispiel braucht also nur eine Zeile Logik. Den Rest macht die filter-Funktion für uns. Das Zusammenspiel der filter-Funktion und der callback function ist genau diese Komposition, die dieses Konzept so mächtig werden lässt. Die beiden Teile greifen harmonisch ineinander.

Wenn man die Aufspaltung der logischen Schritte weiter treiben möchte, dann kann man natürlich die Logik zur Prüfung auf gesundes Essen extrahieren:

Dieser Post ist hauptsächlich inspiriert von einem Post auf Quora von Mattias Petter Johansson (JavaScript developer at Spotify), den Ihr hier finden könnt: higher-order functions