Um den Buchclub zu Funktionale Programmierung in Java geht es in
der einhundertachtundfünfzigsten Episode des IT-Berufe-Podcasts.
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" ein String). 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 eine
GesetzlicheKrankenversicherung oder eine
PrivateKrankenversicherung. 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
students = new List(); Kontravarianz: List students = new List();
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.
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() und flatMap() an, um den enthaltenen
Datentypen in einen anderen zu transformieren, wobei das Ergebnis
dieser Transformation selbst wieder eine Monade ist. Beispiel:
Stream. Listenverarbeitung mit Streams Grundlagen von map(),
filter() und reduce. Parallele Streams und Eignung von Aufgaben für
die Parallelisierung Sonstiges Asynchronität mit CompletableFutures
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 Präsentation: Railway Oriented Programming -
Funktionaler programmieren ohne Exceptions
Kommentare (0)
Melde dich an, um einen Kommentar zu schreiben.