JVM Functional Language Battle - OIO-Die Java … › m › konf › vortraege ›...
Transcript of JVM Functional Language Battle - OIO-Die Java … › m › konf › vortraege ›...
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
JVM Functional
Language Battle
1.0
JVM Functional Language Battle© Orientation in Objects GmbH
Ihr Sprecher
Architektur
Agile Softwareentwicklung
Codequalität
Trainer, Berater, Entwickler
Falk Sippach (@sippsack)
2
Co-Organisator
JVM Functional Language Battle© Orientation in Objects GmbH
Java, XML und Open Source seit 1998
) Competence Center)) Object Rangers )
• Schulungen, Coaching,
Weiterbildungsberatung,
Train & Solve-Programme
• Methoden, Standards und
Tools für die Entwicklung
von offenen, unternehmens-
weiten Systemen
• Unterstützung laufender
Java Projekte
• Perfect Match
• Rent-a-team
• Coaching on the project
• Inhouse Outsourcing
• Schlüsselfertige Realisierung
von Java Software
• Individualsoftware
• Pilot- und Migrationsprojekte
• Sanierung von Software
• Software Wartung
) Software Factory )
3
JVM Functional Language Battle© Orientation in Objects GmbH
Abstract
4
Funktionale Programmierung soll so viel ausdrucksstärker sein, aber
leider ist dieses Programmier-Paradigma nicht ganz kompatibel zu der
prozedural- und objektorientierten Denkweise von uns Java-Entwicklern.
Anhand eines kleinen Algorithmus werden wir uns verschiedene Lösungen
zunächst im klassischem imperativen Java (vor Java 8) und als Vergleich
dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw.
JavaScript) anschauen und die verschiedenen Lösungen diskutieren.
Herauskommen soll eine saubere und verständlichere Struktur, die zu
besser les- und wartbarem Code führen wird. Die gewonnenen
Erkenntnisse wollen wir dann letztendlich in Java 8 mittels Streams und
Lambda-Ausdrücken umsetzen, so dass jeder Zuhörer die Grundideen der
funktionalen Programmierung mit in seine tägliche Arbeit nehmen kann.
Es sind keine speziellen Vorkenntnisse in den angesprochenen
alternativen Sprachen notwendig, ein solides Verständnis für die
Programmiersprache Java genügt.
JVM Functional Language Battle© Orientation in Objects GmbH 5
Einführung Imperativ DeklarativFunctional
Java
Agenda
<x>
<y/>
</x>
JVM Functional Language Battle© Orientation in Objects GmbH 6
Experiment
JVM Functional Language Battle© Orientation in Objects GmbH 7
Java
GroovyHaskell
ScalaClojure
Frege
FunktionalImperativ
JVM Functional Language Battle© Orientation in Objects GmbH 8
Imperative Programmierung (lat. imperare
‚anordnen‘, ‚befehlen‘) ist ein
Programmierparadigma, nach dem „ein
Programm aus einer Folge von
Anweisungen besteht, die vorgeben, in
welcher Reihenfolge was vom Computer
getan werden soll“.
Imperative Programmierung
https://de.wikipedia.org/wiki/Imperative_Programmierung
JVM Functional Language Battle© Orientation in Objects GmbH 9
Funktional
DeklarativImperativ
JVM Functional Language Battle© Orientation in Objects GmbH 10
Funktionale Programmierung ist
ein Programmierparadigma, bei dem
Programme ausschließlich aus Funktionen
bestehen. Dadurch wird bewusst auf die aus
der imperativen Programmierung
bekannten Nebenwirkungen verzichtet.
Funktionale Programmierung
JVM Functional Language Battle© Orientation in Objects GmbH 11
Problemstellung
JVM Functional Language Battle© Orientation in Objects GmbH 12
?
JVM Functional Language Battle© Orientation in Objects GmbH 13
Luhn-Algorithmus;
Luhn-Formel;
"Modulo 10"-Algorithmus;
Double-Add-Double-Methode
Prüfsummen-Berechnung
JVM Functional Language Battle© Orientation in Objects GmbH
Validierung von Kreditkarten
• Luhn Algorithmus
• Kreditkartennummern können sich selbst prüfen
• Berechnung einer Prüfsumme aus den einzelnen Ziffern
• wenn Prüfsumme modulo 10
– = 0 => valide
– <> 0 => nicht valide
14
rein clientseitige
Prüfung möglich
JVM Functional Language Battle© Orientation in Objects GmbH
Wie funktioniert die Validierung genau
1. (Umwandlung in Ziffern)
2. Reihenfolge vertauschen
3. jede zweite Zahl verdoppeln
4. einzelne Zahlen zusammenaddieren
– bei Zahlen größer 9 werden die einzelnen Ziffern aufaddiert
5. valide, wenn die Summe modulo 10 == 0
15
JVM Functional Language Battle© Orientation in Objects GmbH 16
Beispiel
"4716347184862961"4 7 1 6 3 4 7 1 8 4 8 6 2 9 6 1
1 6 9 2 6 8 4 8 1 7 4 3 6 1 7 4
1 12 9 4 6 16 4 16 1 14 4 6 6 2 7 8
1 1 2 9 4 6 1 6 4 1 6 1 1 4 4 6 6 2 7 8
1 3 9 4 6 7 4 7 1 5 4 6 6 2 7 8
1 + 3 + 9 + 4 + 6 + 7 + 4 + 7 + 1 + 5 + 4 + 6 + 6 + 2 + 7 + 8
80
80 % 10 == 0
gültig
JVM Functional Language Battle© Orientation in Objects GmbH 17
JVM Functional Language Battle© Orientation in Objects GmbH 18
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch – Variante 1
19
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch – Variante 2
20
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch mit sprechenden Methodennamen
21
JVM Functional Language Battle© Orientation in Objects GmbH
Demo
Kreditkarten-Nummer prüfen mit Java:
public static void main(String[] args) {
System.out.println(isValid("4716347184862961"));
}
22
JVM Functional Language Battle© Orientation in Objects GmbH 23
Programm: Folge von elementaren Schritten
Typischer Schritt ist die Wertzuweisung
Speicherung von Daten erfolgt in Variablen
Kontrollstrukturen:
• Sequenzen (…; …;)
• Alternativen (if, switch)
• Schleifen (for, while, do…while)
• Sprünge und Unterprogrammaufrufe (goto)
JVM Functional Language Battle© Orientation in Objects GmbH
Imperativ vs. Deklarativ
24
Imperativ: Wie erreiche ich mein Ziel?
Deklarativ: Was will ich erreichen?
JVM Functional Language Battle© Orientation in Objects GmbH 25
Funktional
Imperativ
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch – Spaghetti-Code
26
Aufspalten in Ziffern
Jede 2. Ziffer verdoppeln
Aufsummieren
Validierungsprüfung
Reihenfolge drehen
JVM Functional Language Battle© Orientation in Objects GmbH 27
Und in anderen Sprachen?
JVM Functional Language Battle© Orientation in Objects GmbH
Groovy
• objektorientiert
• dynamisch und/statisch typisiert
• ausdrucksstarke/prägnante Syntax
• sehr gute Integration mit Java (JVM, Bibliotheken, Vererbung, …)
• Metaprogrammierung, Closures, Operatorüberladung
28
JVM Functional Language Battle© Orientation in Objects GmbH
Demo
Kreditkarten-Nummer prüfen mit Groovy
groovy> isValid 4716347184862961
true
29
JVM Functional Language Battle© Orientation in Objects GmbH
JavaScript
• objektorientierte Skriptsprache
• aber klassenlos (Prototyp-basiert)
• dynamisch typisiert
• Funktionen sind First-Class-Citizens
• Client (Browser) und Server (Node.js, Nashorn auf JVM)
30
JVM Functional Language Battle© Orientation in Objects GmbH
Demo
Kreditkarten-Nummer prüfen mit JavaScript
> isValid(4716347184862961)
true
31
JVM Functional Language Battle© Orientation in Objects GmbH
Scala
• funktional und objektorientiert
• statisch typisiert (Typinferenz)
• Funktionen als First-Class-Citizens
• Pattern Matching
• Java-Integration
32
JVM Functional Language Battle© Orientation in Objects GmbH
Demo
Kreditkarten-Nummer prüfen mit Scala
scala> isValid(4716347184862961)
true
33
JVM Functional Language Battle© Orientation in Objects GmbH
Frege
• Haskell for the JVM
• rein funktionale Programmiersprache
• statisch typisiert mit Typinferenz und Typvariablen
• frei von Nebeneffekten
• Monaden zur Kapselung von imperativen Konstrukten
• Pattern Matching
• Typklassen
34
JVM Functional Language Battle© Orientation in Objects GmbH
Demo
Kreditkarten-Nummer prüfen mit Frege (Haskell)
frege> isValid 4716347184862961
True
35
JVM Functional Language Battle© Orientation in Objects GmbH
Algorithmus in Frege
36
isValid n =
(sumDigits (double2nd (toDigitsRev n))) % 10 == 0
Validierungs-
funktion
Teilbar
durch 10?
Ziffern
rückwärts
Verdoppeln
jede 2. Ziffer
Summe
der Ziffern
Kreditkarten-
nummer
JVM Functional Language Battle© Orientation in Objects GmbH
Haskell/Frege
toDigits n = toDigits (n `div` 10) ++ [(n `mod` 10)]
toDigitsRev n = reverse (toDigits n)
double2nd = zipWith (*) (cycle [1, 2])
sumDigits xs = sum (concat (map toDigits xs))
isValid n =
mod (sumDigits (double2nd (toDigitsRev n))) 10 == 0
37
isValid n =
(sumDigits (double2nd (toDigitsRev n))) % 10 == 0
JVM Functional Language Battle© Orientation in Objects GmbH 38
Keine veränderbaren Zustände
Seiteneffekt-frei
Referentielle Transparenz
First-Class-Citizens
Higher-Order Functions
Lambdas/Closures
Lazy Evaluation
Rekursion
JVM Functional Language Battle© Orientation in Objects GmbH
Funktionen
39
JVM Functional Language Battle© Orientation in Objects GmbH
Warum Funktionale Programmierung
• einfach zu testen, zu debuggen
• einfach zu verstehen durch einfache Abstraktionen und referentielle
Transparenz
• seiteneffektfrei, lässt sich leicht parallelisieren
• modularisierbar und einfach wieder zusammenführbar
• erhöht Code-Qualität
40
JVM Functional Language Battle© Orientation in Objects GmbH
OO vs. Funktional
41
JVM Functional Language Battle© Orientation in Objects GmbH 42
Ist Java 8 funktional?
JVM Functional Language Battle© Orientation in Objects GmbH
"Funktional Programmieren" mit Java 8
• Lambdas: Funktionsliterale als First-Class-Citizens
• Higher-Order Functions
• Currying und Funktionskomposition
• Streams
• Erweiterungen Collections mit Default-Methoden
• (Rekursion)
43
JVM Functional Language Battle© Orientation in Objects GmbH
Java 8: Currying und partielle Funktionsaufrufe
44
Currying: Konvertierung einer Funktion mit n Argumenten
in n Funktionen mit jeweils einem Argument.
JVM Functional Language Battle© Orientation in Objects GmbH
Java 8: Funktionskomposition
45
JVM Functional Language Battle© Orientation in Objects GmbH
Luhn-Algorithmus in Java 8 – Variante 1
46
JVM Functional Language Battle© Orientation in Objects GmbH
Was fehlt Java 8 zur besseren funktionalen
Unterstützung?
• Erzwingen von Immutability
• persistente Datenstrukturen
• Vermeidung von Seiteneffekten
• referentielle Transparenz
• Lazy Evaluation
• funktionale Bibliotheksfunktionen
47
JVM Functional Language Battle© Orientation in Objects GmbH
Immutable Klassen
• genau ein Zustand
– keine Prüfung von Invarianten und von Zustandsübergänge (API-Doc)
– abgeleitete Größen können in Cache gehalten werden
• Thread-safe
– keine Zustandsänderung
– keine Synchronisation
• gemeinsame Nutzung von Instanzen
– public Konstanten
– Instanzkontrolle durch statische Factories
– keine defensive Copies
• gemeinsame Nutzung innerer Zustände
– BigInteger#negate()
– String#subString()
48
JVM Functional Language Battle© Orientation in Objects GmbH
Funktionale Erweiterungen für Java
49
Project Lombok
JVM Functional Language Battle© Orientation in Objects GmbH
Project Lombok
• Compile-Time Metaprogrammierung
• Reducing Boilerplate Code durch Annotationen
• Generation des Immutable-Gerüsts mit @Value
• Lazy Evaluierung mit @Getter(lazy = true)
50
JVM Functional Language Battle© Orientation in Objects GmbH 51
private, final,
keine Setter,
Argument-Konstruktor
equals/hashcode
Lazy-Evaluierung
JVM Functional Language Battle© Orientation in Objects GmbH
FunctionalJava
• funktionale Programmierbibliothek für Java
• Lernplattform für funktionale Programmierung mit der gewohnten
Sprache
• unterstützt Java 6+ (mit Retro Lambda)
• Basis Datenstrukturen (Funktionen, partielle Funktionen, Unit, Void,
Option, Either, …
• Immutable Collections (Array, List, Stream, Set, Map, …
• Monaden, Zipper
52
JVM Functional Language Battle© Orientation in Objects GmbH 53
JVM Functional Language Battle© Orientation in Objects GmbH
Demo
Kreditkarten-Nummer prüfen mit Java 8 + FunctionalJava:
public static void main(String[] args) {
System.out.println(isValid("4716347184862961"));
}
54
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang
• "Javaslang is a functional library for Java 8+ that provides persistent
data types and functional control structures."
• Persistent Data Structures
– LinkedList, Queue, Sorted Set, Stream
• Tuple
• Functions, CheckedFunctions
55
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang: Tuple (bis Tuple8)
56
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang: Partielle Funktionsaufrufe und
Komposition
57
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang: Currying
58
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang: Function Lift (Fangen von Exceptions)
59
JVM Functional Language Battle© Orientation in Objects GmbH
Links
• Learn You a Haskell for Great Good!
– http://learnyouahaskell.com/chapters
• LYAH (Learn You a Haskell) adaptions for Frege
– https://github.com/Frege/frege/wiki/LYAH-adaptions-for-Frege
• Project Lombok
– https://projectlombok.org/
• Functional Java
– http://www.functionaljava.org/
• Javaslang
– http://www.javaslang.io/
60
JVM Functional Language Battle© Orientation in Objects GmbH
Literaturhinweise
61
• Functional Programming in Java: Harnessing the Power Of Java 8 Lambda Expressions
– Venkat Subramaniam
– The Pragmatic Programmers, Erscheinungsdatum: Februar 2014
– ISBN: 978-1-93778-546-8
– Sprache: Englisch
• Mastering Lambdas– Maurice Naftalin
– Oracle Press
– Erscheinungsdatum: Oktober 2014
– ISBN: 0071829628
– Sprache: Englisch
JVM Functional Language Battle© Orientation in Objects GmbH
Literaturhinweise
62
• Learn You a Haskell for Great Good!: A Beginner's Guide
– Miran Lipovaca
– No Starch Press, Erscheinungsdatum: April 2011
– ISBN: 978-1593272838
– Sprache: Englisch
• Real World Haskell
– Bryan O'Sullivan und John Goerzen
– O'Reilly, Erscheinungsdatum: 2010
– ISBN: 978-0596514983
– Sprache: Englisch
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
? ?
??
?Fragen ?
63
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Vielen Dank für Ihre
Aufmerksamkeit !