"Side-Effect-Free Function" heißt
übersetzt soviel wie "Funktion ohne Nebenwirkung". Es handelt sich hier
um ein einfaches, und trotzdem wirkungsvolles Konzept in Domain-Driven Design.
Grundsätzlich kann man Operationen in zwei Kategorien unterteilen: Kommandos (Commands) und Funktionen (Queries).
Dabei sind Kommandos Methoden, die den Zustand des Systems sichtbar
verändern. Das kann zum Beispiel so etwas Einfaches sein wie das Ändern
einer privaten Variablen, oder etwas Komplexeres wie das Speichern von
Daten in eine Datenbank. Kommandos liefern dabei keine, für die Domänen
relevanten Daten an den Aufrufer zurück. Die einzigen Rückgabewerte von
Kommandos könnten Statusinformationen sein. Also beispielsweise die
Information, ob die Aktion erfolgreich oder erfolglos war.
Funktionen hingegen sind Methoden, die ein Ergebnis zurückliefern.
Das kann zum Beispiel der Inhalt einer privaten Variable, das Ergebnis
einer Berechnung oder auch einer Datenbankabfrage sein. Das
Entscheidende hier ist, dass während der Ausführung der Funktion
keinerlei sichtbare Änderungen am System stattfinden. Erst wenn das
sichergestellt ist, haben wir es mit Side-Effect-Free Funtions zu tun.
Side-Effect-Free Functions bieten ernorme Vorteile gegenüber
Funktionen mit Nebeneffekten. Deshalb sollte man grundsätzlich auf eine
Trennung der Methoden in Kommandos und Funktionen ohne Nebeneffekten
achten.
Side-Effect-Free Functions zeichnen sich zum Beispiel
dadurch aus, dass mehrere Aufrufe mit denselben Parametern immer
dasselbe Ergebnis liefern. Da sich der Zustand des Systems bei einem
Aufruf nicht ändert verändert, muss das Ergebnis bei einem wiederholten
Aufruf logischerweise das Gleiche sein.
Der Vorteil ist nun, dass
das Risiko von ungewollten Effekten erheblich reduziert ist. Diese
Funktionen können bedenkenlos von Client-Code oder von anderen
Funktionen aufgerufen werden. Auch lassen sich solche Methoden viel
besser testen. Das ist auch kein zu unterschätzender Vorteil.
Natürlich wird man kaum Anwendungen programmieren können, die nur
Side-Effect-Free Functions verwendet. Man muss sicherlich auch Methoden
aufrufen, die den Zustand des Systems beeinflussen. Das ist kein
Problem, solange man die Logik ordentlich in Kommandos und Funktionen
aufteilt. Das Ziel sollte sein, soviel Logik wie möglich in
Side-Effect-Free Functions zu stecken und den Code von Kommandos so
einfach wie möglich zu halten.