Um den Buchclub zu Funktionale Programmierung in Java geht es in der einhundertachtundfünfzigsten Episode des IT-Berufe-Podcasts.
Podcast: Play in new window | Download (Duration: 1:20:33 — 36.9MB)
Abonnieren: Apple Podcasts | Spotify | RSS
Inhalt
Die folgenden Inhalte werden im Buch besprochen. Meiner Meinung nach sollte jeder Azubi zum Fachinformatiker Anwendungsentwicklung diese Begriffe wenigstens einmal gehört haben, besser noch sie mit eigenen Worten erklären können. Die funktionale Programmierung ist neben der Objektorientierung heutzutage sicherlich eine gängige Vorgehensweise.
Für die anderen IT-Berufe sind viele Inhalte sicherlich etwas zu speziell. Allerdings sollte jeder ITler zumindest die verbreiteten Programmierparadigmen auseinanderhalten können. Und dazu zählen meiner Meinung nach auch einige wichtige Schlagworte. So wie bei der Objektorientierung Vererbung und Polymorphie erklärt werden müssen, sollte man bei der funktionalen Programmierung Funktionen höherer Ordnung oder reine Funktionen erläutern können.
Grundlagen
- Lambda-Ausdrücke: Anonyme Funktionen in einer kurzen Schreibweise, meist mit einem „Pfeil“ als Trenner zwischen Methodenkopf und -rumpf (z.B.
->
). - Typinferenz: Implizite Ableitung der Datentypen z.B. von Funktionsparametern aus dem Kontext, z.B.
var text = "Text"
(text
ist „automatisch“ einString
). - Algebraische Datentypen
- Produkttypen: Der Datentyp wird definiert durch die Kombination verschiedener Werte. Das sind letztlich unsere bekannten Objekte bzw. Structs.
- Summentypen: Der Datentyp wird definiert als Liste möglicher Alternativen bzw. Varianten, z.B. ist eine
Krankenversicherung
entweder eineGesetzlicheKrankenversicherung
oder einePrivateKrankenversicherung
. Hierbei müssen die Alternativen nicht in einer Vererbungsbeziehung stehen, wie man am Beispiel vermuten könnte.
- Pattern Matching: Kontrollstruktur, die Datentypen „zerlegen“ kann. Quasi
switch
„on steroids“. - Generics: Datentypen, die mit anderen Datentypen parametriert werden können. Sie bieten allgemeingültige Algorithmen an, die auf mehreren Datentypen ausgeführt werden können.
- Ko- und Kontravarianz: Legen fest, welche Verallgemeinerungen bzw. Spezialisierungen bei Typparametern von generischen Klassen erlaubt sind. Beispiele:
- Kovarianz:
List<Person> students = new List<Student>();
- Kontravarianz:
List<Student> students = new List<Person>();
- Kovarianz:
Prinzipien der funktionalen Programmierung
- Funktionsobjekte (first class citizens): Funktionen sind fester Bestandteil der Sprache und können z.B. Variablen zugewiesen oder als Parameter übergeben werden.
- Reine Funktionen (pure functions): Funktionen haben keine Seiteneffekte. Sie liefern zum gleichen Input immer den gleichen Output.
- Funktionen höherer Ordnung (higher order functions): Funktionen, die andere Funktionen zurückgeben oder als Parameter bekommen.
- Bedarfsauswertung (lazy evaluation): Ein Ausdruck wird erst dann ausgewertet, wenn sein Wert auch wirklich benötigt wird.
- Unveränderbarkeit (immutability): Bestehende Werte sollen nicht mehr verändert werden. Stattdessen werden immer neue Werte erzeugt.
- Rekursion (recursion): Das Mittel der Wahl zur Iteration ohne veränderliche Variablen.
- Referentielle Transparenz (referential transparency): Ein Ausdruck kann jederzeit durch seinen Wert ersetzt werden und umgekehrt.
Funktionale Datenstrukturen
- Funktoren: Bieten die Funktion
map()
an, um den enthaltenen Datentypen in einen anderen zu transformieren. Beispiel:Optional<T>
. - Monoide: Mit Monoiden kann man eine Menge von Elementen zu einem Gesamtergebnis verknüpfen, es also reduzieren (fold). Dafür wird ein neutrales Element und eine Reduktionsfunktion benötigt. Beispiel: Addition ganzer Zahlen mit neutralem Element
0
. - Monaden: Bieten die Funktionen
of()
undflatMap()
an, um den enthaltenen Datentypen in einen anderen zu transformieren, wobei das Ergebnis dieser Transformation selbst wieder eine Monade ist. Beispiel:Stream<T>
. - Listenverarbeitung mit
Stream
s- Grundlagen von
map()
,filter()
undreduce
. - Parallele Streams und Eignung von Aufgaben für die Parallelisierung
- Grundlagen von
Sonstiges
- Asynchronität mit
CompletableFuture
s und Reactive Streams - Property Based Testing mit Quickcheck
- Ein komplett anderer Ansatz, um Funktionen zu testen. Statt Input und erwarteten Output selbst zu definieren, werden zufällige Input-Werte generiert und allgemeine Eigenschaften des Ergebnisses geprüft, z.B. dass bei einer Konkatenation zweiter Strings die Länge des Ergebnisses immer größer oder gleich der Länge des ersten Strings sein muss.
Was mir am Buch sehr gut gefällt
- Es werden nicht nur die Grundlagen der funktionalen Programmierung erläutert, sondern auch viele andere wichtige Begriffe rund um die moderne Programmierung.
- Gerade die Grundlagen werden sehr verständlich erklärt und mit vielen praxisnahen Beispielen angereichert.
- Es werden auch sehr moderne Konzepte wie wie Reactive Streams und Property Based Testing erläutert.
- Einige Grundlagen, die jeder Informatiker einmal gehört haben sollte, werden ebenfalls behandelt, z.B. Algorithmen zur Tiefensuche.
- Auch einige Entwurfsmuster werden im Detail erklärt und mit der funktionalen Lösung verglichen.
- Die technischen Hintergründe der Implementierung in Java werden gut verständlich erläutert. Das sollte heutzutage jeder Java-Entwickler kennen!
Was mir am Buch nicht ganz so gut gefällt
- Die Inhalte haben natürlich einen starken Fokus auf die Implementierung in Java. Man kann zwar auch als Nicht-Java-Entwickler im Bereich der Grundlagen einiges mitnehmen, aber am besten geeignet ist das Buch wohl für Hardcore-Java-Entwickler.
- Man merkt, dass der Autor Hochschuldozent ist. Die Beschreibungen und Beispiele sind teilweise etwas akademisch. Auch wenn die funktionale Programmierung ihren Ursprung in der Mathematik hat, ist das vielleicht für Azubis manchmal etwas schwere Kost.
- Die verwendeten Beispiele sind teilweise sehr umfangreich. Sehr lange Codeausschnitte, die schwer nachzuvollziehen sind, hätten vielleicht gekürzt werden können.
Fazit
- Ich kann das Buch uneingeschränkt weiterempfehlen. Es vermittelt einen sehr guten Überblick über moderne Programmmiertechniken und die funktionale Programmierung.
- Auch Azubis werden es gut verstehen können. Ich empfehle die Literatur allerdings erst ab dem zweiten Lehrjahr, wenn schon einige Programmierprojekte umgesetzt wurden.
- Auch als Nachschlagewerk für zentrale Begriff der funktionalen Programmierung finde ich das Buch sehr gut, da die Begriffe kurz und prägnant definiert und mit Beispielen erklärt werden.
- Insbesondere für Java-Entwickler empfehle ich das Buch zum Verständnis der technischen Implementierung der funktionalen Programmierung in Java.
Literaturempfehlungen
Naja, was soll ich wohl anderes empfehlen als das besprochene Buch Funktionale Programmierung in Java*? 🙂
Links
- Permalink zu dieser Podcast-Episode
- RSS-Feed des Podcasts
- Gregor Trefs über funktionale Programmierung, Konferenzen und Fachartikel
- Algebraic data type
- Summentypen
- Produkttypen
- Property-based Testing mit JUnit QuickCheck
- Präsentation: Property-based Testing mit JUnit-Quickcheck
- Railway Oriented Programming in Java
Ich habe diese Podcast-Folge erst die letzten Tage empfohlen bekommen und habe mir diese gleich auf der Autorückfahrt nach Hause in Spotify angehört.
Das Thema ist wahrscheinlich gefühlt zeitlos und daher spielte es auch keine Rolle, dass die Folge Nov. 2020 war. Das Buch habe ich gestern gleich bestellt und freue mich bereits darauf. Vielen Dank für die Empfehlung dazu!
Auch inhaltlich war die Folge vollgespickt mit wichtigen Dingen. Die Kirsche obendrauf war noch die Sprache auf Deutsch.
Die Folge werte gleichzeitig ich als pädagogisch wertvoll, da es in kurzer Zeit viele Aspekte anschneidet; mit einer notwendigen Tiefe, die wiederum erlaubt ein erstes Verständnis zu bekommen (für manche Konzepte kannte ich den en/de Namen nicht). Die Folge eignet sich meiner Meinung sehr in einem Team von Entwicklern als Einstieg oder Basis eines gemeinsamen gedanklichen Modells. Das ist sehr wertvoll.
Daher wollte ich auf jeden Fall dieses Feedback dazu geben. Vielen Dank für die Folge und deinen Podcast, den ich allgemein sehr empfehlenswert finde.
Danke für dein Feedback! Freut mich, wenn ich helfen kann. FP wird immer wichtiger und das genannte Buch finde ich sehr gelungen für einen Einstieg.