Buchclub: Funktionale Programmierung in Java von Herbert Prähofer – IT-Berufe-Podcast #158

Buchclub: Funktionale Programmierung in Java von Herbert Prähofer – IT-Berufe-Podcast #158

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 Anwend...
1 Stunde 20 Minuten

Beschreibung

vor 5 Jahren

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)

Lade Inhalte...

Abonnenten

15
15