jenswinter.com
Software Development 24/7

Side-Effect-Free Functions

January 12, 2006 21:29 by Jens

"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.