Buchclub: Funktionale Programmierung in Java von Herbert Prähofer – IT-Berufe-Podcast #158
IT-Berufe-Podcast - A podcast by Stefan Macke - Lunedì
Categorie:
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<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.