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.

Probeabo bei Audible (Affiliate)

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<Person> students = new List<Student>();
    • Kontravarianz: List<Student> students = new List<Person>();

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() und flatMap() 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 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*? 🙂

Funktionale Programmierung in Java: Eine umfassende Einführung von Herbert Prähofer (Affiliate)*

Links

Stefan Macke
Polyglot Clean Code Developer
About the Author
Ausbildungsleiter für Fachinformatiker Anwendungsentwicklung und Systemintegration, IHK-Prüfer und Hochschuldozent für Programmierung und Software-Engineering.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax