Programmierkonzepte, Teil 2: Funktionen höherer Ordnung

Funktionen höherer Ordnung nehmen Funktionen als Parameter entgegen oder liefern eine Funktion als Rückgabewert zurück. Im Gegensatz dazu stehen Funktionen, die ausschließlich Daten verarbeiten können. Doch nicht alle Programmiersprachen unterstützen das Konzept gleichermaßen.

In Pocket speichern vorlesen Druckansicht 4 Kommentare lesen
Lesezeit: 4 Min.
Von
  • Golo Roden

Funktionen höherer Ordnung nehmen Funktionen als Parameter entgegen oder liefern eine Funktion als Rückgabewert zurück. Im Gegensatz dazu stehen Funktionen, die ausschließlich Daten verarbeiten können. Doch nicht alle Programmiersprachen unterstützen das Konzept gleichermaßen.

Den wenigsten Entwicklern ist der Rat, Redundanz zu vermeiden, neu. Wann immer Codezeilen wiederholt auftreten, lassen sie sich in eine Funktion auslagern: Auf dem Weg können komplexe Abläufe durch einen einzigen Aufruf ersetzt werden. Das Vorgehen gilt jedoch nicht nur für Daten, sondern kann sich auch auf die Definition von Code an sich beziehen.

Mehr Infos

Programmierkonzepte

Anders formuliert: Unterscheiden sich zwei Codeblöcke lediglich in der Definition der enthaltenen Funktionen oder werden zur Ausführung verschiedene Funktionen benötigt, lassen sich auch die Funktionen variabel gestalten. Dazu ist es allerdings erforderlich, Funktionen wie Daten handhaben zu können.

Genau das ermöglichen Funktionen höherer Ordnung. Sie nehmen Funktionen als Parameter entgegen oder liefern eine Funktion als Rückgabewert zurück. Als klassisches Beispiel dient die map-Funktion, die eine Liste von Daten durchläuft, jedes Element mit einer Funktion verarbeitet und die Ergebnisse in einer neuen Liste ablegt.

Auf dem Weg lassen sich beispielsweise die Quadratzahlen von einer Liste von Zahlen ermitteln, wie das folgende JavaScript-Beispiel zeigt:

const primes = [ 2, 3, 5, 7, 11 ];
const squares = primes.map(n => n * n);

console.log(squares); // => [ 4, 9, 25, 49, 121 ]

Auch das Verarbeiten aller Werte einer Liste zu einem einzigen Ergebniswert ist möglich. Dazu dient die reduce-Funktion, mit der sich beispielsweise die Summe berechnen lässt:

const primes = [ 2, 3, 5, 7, 11 ];
const sum = primes.reduce((sum, n) => sum + n);

console.log(sum); // => 28

Selbstverständlich ließe sich das gleiche Ergebnis auch durch den Einsatz einer Schleife ermitteln. Bemerkenswert ist an den Funktionen map und reduce aber, dass der Umgang mit der Liste von der eigentlichen (fachlichen) Verarbeitung eines einzelnen Elements getrennt wird.

Für den Entwickler ist transparent, wie die Liste tatsächlich durchlaufen wird. Daher wäre es durchaus möglich, die map-Funktion intern zu parallelisieren und auf dem Weg zu beschleunigen, ohne dass Entwickler dies wissen oder gar beachten müssten.

Genau das beschreibt Joel Spolsky in seinem Blogeintrag "Can Your Programming Language Do This?", wenn er schreibt:

"And now you understand something I wrote a while ago where I complained about CS students who are never taught anything but Java: Without understanding functional programming, you can't invent MapReduce, the algorithm that makes Google so massively scalable."

Er zieht daraus den Schluss, dass Funktionen höherer Ordnung helfen, das Abstraktionsvermögen von Sprachen zu verbessern, und dass sich Code kompakter, wiederverwendbarer und besser skalierbar schreiben lässt, wenn Funktionen als Bürger erster Klasse angesehen werden:

"Ok. I hope you're convinced, by now, that programming languages with first-class functions let you find more opportunities for abstraction, which means your code is smaller, tighter, more reusable, and more scalable. Lots of Google applications use MapReduce and they all benefit whenever someone optimizes it or fixes bugs."

Wichtig dabei ist, dass nicht alle Programmiersprachen das Konzept gleichermaßen unterstützen. Auf die gleiche Art wie logische Bedingungen irgendwann erstmals unterstützt wurden, gilt das auch für Funktionen höherer Ordnung.

Interessanterweise handelt es sich in beiden Fällen um die gleiche Sprache, nämlich Lisp. Anders als logische Bedingungen, die man heutzutage in nahezu jeder Programmiersprache antrifft, sind Funktionen höherer Ordnung und Funktionen als Bürger erster Klasse nicht in jeder Sprache üblich.

tl;dr: Funktionen höherer Ordnung sind Funktionen, die Funktionen wie Daten als Parameter und Rückgabewerte verwenden. Obwohl sie das Abstraktionsvermögen verbessern, werden sie noch immer nicht von allen Programmiersprachen unterstützt. ()