Eine reine Funktion (englisch pure function) ist eine Funktion mit zwei festen Eigenschaften: Sie liefert bei gleicher Eingabe immer dieselbe Ausgabe, und sie verursacht keine Seiteneffekte. Reine Funktionen sind das Fundament der funktionalen Programmierung.

Die zwei Eigenschaften

Erstens ist eine reine Funktion deterministisch: Gleiche Argumente ergeben immer denselben Rückgabewert. Ein Aufruf wie add(2, 3) liefert zu jedem Zeitpunkt 5. Zweitens hat sie keine Seiteneffekte: Sie verändert keine globalen Variablen, schreibt nicht auf die Konsole, liest keine Dateien und greift nicht auf die Systemuhr zu. Sie berechnet nur ihren Rückgabewert.

Wichtig ist die Unterscheidung: Jede reine Funktion ist deterministisch, aber nicht jede deterministische Funktion ist rein. Eine Funktion, die zwar vorhersagbar rechnet, dabei aber Daten auf die Festplatte schreibt, ist deterministisch, aber wegen dieses Seiteneffekts nicht rein.

Beispiel

// rein: gleiche Eingabe, gleiche Ausgabe, kein Effekt
const add = (a, b) => a + b;

// unrein: veraendert globalen Zaehler (Seiteneffekt)
let count = 0;
const increment = () => ++count;

Warum reine Funktionen?

  • Testbarkeit: Ein Test ruft die Funktion mit Argumenten auf und prüft den Rückgabewert — kein Setup, kein Mocking nötig.
  • Wiederverwendung: Reine Funktionen sind referenziell transparent und lassen sich daher sicher cachen — eine Technik, die als Memoization bekannt ist.
  • Parallelität: Ohne geteilten Zustand gibt es keine Race Conditions zwischen reinen Funktionsaufrufen.
  • Vorhersagbarkeit: Der Code ist leichter zu verstehen, weil jede Funktion isoliert betrachtet werden kann.

In der Praxis kombiniert man reine Funktionen mit Immutability: Daten werden nicht verändert, sondern durch neue Werte ersetzt. Zusammen mit Higher-Order-Funktionen und Funktionskomposition entstehen daraus klare Datenfluss-Pipelines.

Verwandte Grundlagen: Seiteneffekte, Funktionale Programmierung, Referentielle Transparenz.