class: center, middle # Patterns der funktionalen Programmierung ## Frank Thomas ??? Ziel ist es zu zeigen wie man ein Programm rein funktional schreiben kann. --- # Was ist funktionale Programmierung FP ist programmieren mit **reinen** Funktionen Reine Funktionen haben keine Seiteneffekte wie z.B. * Variablen ändern * Datenstrukturen ändern * Exceptions werfen * Dateien lesen oder schreiben * Benutzereingaben lesen oder Ausgaben auf die Konsole schreiben
FP schränkt ein
wie
wir Programme schreiben,
aber nicht
welche
wir schreiben können
--- # Kernprinzipien funktionalen Designs * **Funktionen** * **Typen** * **Komposition** ??? Funktionen: * im mathematischen Sinn, d.h. eine Abbildung zwischen zwei Mengen ohne Seiteneffekte * mit leichtgewichtiger Syntax * können Parameter und Rückgabewerte sein und Variablen zugewiesen werden Typen: * Datentypen wie Produkttypen und Summentypen * Typparameter * sind Dokumentation und leiten uns bei der Implementierung Komposition: * größere Komponenten können aus Kleineren zusammengesetzt werden * Komponenten können isoliert verwendet, getestet und verstanden werden --- # Warum das Ganze? Alles was eine Funktion macht wird durch deren Rückgabewert repräsentiert. * Funktionen sind einfacher zu verstehen * Testbarkeit * Wiederverwendbarkeit * Refactoring * FP macht glücklich :-) ??? * Einfacher zu verstehen, weil ihre Logik vom Erlangen der Eingaben und der Interpretation getrennt ist * Zum Testen reicht es die Rückgabewerte zu inspizieren - es sind keine Mocks oder Spies nötig * Da keine Seiteneffekte ausgeführt werden ist es einfacher Komponenten wiederzuverwenden und miteinander zu kombinieren * Da keine Seiteneffekte ausgeführt werden, kann man Ausdrücke Variablen zuweisen und gleiche Ausdrücke durch die Variable ersetzen * man schafft verständliche, wiederverwendbare und einfach zu testende Komponenten --- class: center, middle # Beispiel Eine minimalistische Shell für eine Key-Value-Datenbank --- # Zusammenfassung * Programme sind Werte * große Programme werden aus kleineren Programmen zusammengebaut * Seiteneffekte werden von Interpretern ausgeführt * Interpreter müssen nicht immer Seiteneffekte ausführen * Schleifen können durch Rekursion abgebildet werden * Datentypen für verschiedene Effekte (z.B. `ConsoleIO` und `KVStore`) ??? * Aufruf des Interpreters ist der letzte Aufruf in unserem Programm und passiert hauptsächlich in der main-Methode --- class: center, middle # THE END Slides:
Code: