Pure Function (reine Funktion)
Kurz: Eine reine Funktion liefert bei gleichen Argumenten immer dasselbe Ergebnis und hat keine Nebenwirkungen: Sie ändert weder globale Variablen noch Eingaben, schreibt nichts in Dateien und gibt nichts aus.
Genauer: Reine Funktionen sind leicht zu verstehen, zu testen und zu parallelisieren, weil ihr Ergebnis nur von den Argumenten abhängt. Ergebnisse lassen sich zwischenspeichern (Memoization), und der Compiler darf sie umsortieren oder wegoptimieren. Sie sind das Rückgrat der funktionalen Programmierung.
Im Detail
# rein
def mwst(netto):
return netto * 1.19
# unrein: hängt von äußerem Zustand ab
satz = 1.19
def mwst_unrein(netto):
return netto * satz # Ergebnis ändert sich, wenn "satz" geändert wird
# unrein: Nebenwirkung auf die Eingabe
def fuege_hinzu(liste, x):
liste.append(x) # verändert das übergebene Objekt!
return liste
# rein: erzeugt eine neue Liste
def fuege_hinzu_rein(liste, x):
return liste + [x]Typische Nebenwirkungen
- globale oder statische Variablen lesen und schreiben
- Eingabeobjekte verändern (siehe Unveränderlichkeit)
- Ausgabe auf Konsole, Datei, Netzwerk oder Datenbank
- Zufallszahlen, aktuelle Uhrzeit, Benutzereingabe
Praxis: Kern rein, Rand unrein
Kein Programm kommt ohne Nebenwirkungen aus – es müsste ja etwas ausgeben. Bewährt hat sich das Muster „funktionaler Kern, imperative Hülle“: Die Geschäftslogik besteht aus reinen Funktionen und lässt sich mit Unit-Tests ohne Mocks prüfen; Ein- und Ausgabe (Dateien, Datenbank, Netzwerk) passieren am Rand des Programms.
Siehe auch: Unveränderlichkeit, Higher-Order-Funktion, Memoization, Unit-Test