Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
1. Art of the state
Funktionale Softwarearchitektur mit Plain Old Java
Gunter Jantzen
¨
Capgemini
16. Januar 2013 1
1
Angepasst an jdk8 lambda-8-b117 vom 21.11.2013
Art of the state
1 / 98
3. Die FunctionalOWL vom Hackerspace Bielefeld
http://hackerspace-bielefeld.de/
Verwendung mit
freundlicher
Genehmigung des
Kunstlers Jonah
¨
Joen Bethlehem.
Art of the state
3 / 98
10. Die FunctionalOWL vom Hackerspace Bielefeld
In der Reihenfolge, so wie ihr sitzt.
Art of the state
7 / 98
11. Die FunctionalOWL vom Hackerspace Bielefeld
In der Reihenfolge, so wie ihr sitzt.
¨
¨
¨
Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihr
Euch ja schon mal uberlegen, wie sich das Aufschreiben
¨
¨
parallelisieren lasst.
Art of the state
7 / 98
12. Die FunctionalOWL vom Hackerspace Bielefeld
In der Reihenfolge, so wie ihr sitzt.
¨
¨
¨
Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihr
Euch ja schon mal uberlegen, wie sich das Aufschreiben
¨
¨
parallelisieren lasst.
Aber die Reihenfolge muss stimmen!!
Art of the state
7 / 98
16. Vorgeschichte
Das Entscheidungsproblem
Gullivers Reise nach Laputa
1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz in
der Ars Combinatoria formulierte Idee, auf kombinatorische Weise alle
¨
mogliche Wahrheiten zu finden.
Art of the state
10 / 98
17. Vorgeschichte
Das Entscheidungsproblem
Gullivers Reise nach Laputa
1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz in
der Ars Combinatoria formulierte Idee, auf kombinatorische Weise alle
¨
mogliche Wahrheiten zu finden.
http://www.gutenberg.org/files/829/829-h/829-h.htm
Art of the state
10 / 98
20. Vorgeschichte
Das Entscheidungsproblem
Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.
In diesem Refactoring entstand die Vorstellung, der Fortschritt in
der Mathematik sei nicht so sehr von den Anwendungen
getrieben.
Art of the state
11 / 98
21. Vorgeschichte
Das Entscheidungsproblem
Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.
In diesem Refactoring entstand die Vorstellung, der Fortschritt in
der Mathematik sei nicht so sehr von den Anwendungen
getrieben.
Sondern alle mathematischen Wahrheiten ließen sich mit finiten
Methoden aus endlichen Axiomen und Regeln formal
schematisch ableiten.
Art of the state
11 / 98
22. Vorgeschichte
Das Entscheidungsproblem
Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.
In diesem Refactoring entstand die Vorstellung, der Fortschritt in
der Mathematik sei nicht so sehr von den Anwendungen
getrieben.
Sondern alle mathematischen Wahrheiten ließen sich mit finiten
Methoden aus endlichen Axiomen und Regeln formal
schematisch ableiten.
¨
David Hilberts Ziel waren vollstandige und widerspruchsfreie
endliche Axiomenysteme fur alle mathematischen Theorien.
¨
Art of the state
11 / 98
24. Vorgeschichte
Das Entscheidungsproblem
¨
¨
¨
Die Godelschen Unvollstandigkeitssatze
Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit
¨
¨
¨
den Godelschen Unvollstandigkeitssatzen einen schweren
Ruckschlag.
¨
Art of the state
12 / 98
25. Vorgeschichte
Das Entscheidungsproblem
¨
¨
¨
Die Godelschen Unvollstandigkeitssatze
Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit
¨
¨
¨
den Godelschen Unvollstandigkeitssatzen einen schweren
Ruckschlag.
¨
¨
Kurt Godel konnte zeigen, dass formale Systeme nach Art der
¨
Arithmetik weder vollstandig sind, noch dass sich deren
¨
Widerspruchsfreiheit zeigen lasst.
Art of the state
12 / 98
26. Vorgeschichte
Das Entscheidungsproblem
¨
¨
¨
Die Godelschen Unvollstandigkeitssatze
Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit
¨
¨
¨
den Godelschen Unvollstandigkeitssatzen einen schweren
Ruckschlag.
¨
¨
Kurt Godel konnte zeigen, dass formale Systeme nach Art der
¨
Arithmetik weder vollstandig sind, noch dass sich deren
¨
Widerspruchsfreiheit zeigen lasst.
¨
Formal lasst sich mathematische Wahrheit nur unzureichend
erfassen.
Art of the state
12 / 98
28. Vorgeschichte
Das Entscheidungsproblem
Das Entscheidungsproblem
Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mit
dem fur eine beliebige, im formalen System der Arithmetik
¨
formulierte Aussage entschieden werden kann, ob sie
mathematisch wahr ist.
Art of the state
13 / 98
29. Vorgeschichte
Das Entscheidungsproblem
Das Entscheidungsproblem
Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mit
dem fur eine beliebige, im formalen System der Arithmetik
¨
formulierte Aussage entschieden werden kann, ob sie
mathematisch wahr ist.
¨
1936 wurden bei zwei Zeitschriften unabhangig Arbeiten
eingereicht, die zeigten, dass es in der Arithmetik nicht
entscheidbare Probleme gibt. Diese Arbeiten legten nebenbei
¨
Grundlagen fur die spater entstehende Informatik.
¨
Art of the state
13 / 98
30. Vorgeschichte
Das Entscheidungsproblem
Literatur
Alonzo Church.
An unsolvable problem of elementary number theory.
American Journal of Mathematics, 58(2):345–363, April 1936.
Church fuhrte mit dem λ-Kalkul Grundlagen der funktionalen
¨
¨
Programmierung ein.
Alan M. Turing.
On computable numbers, with an application to the
Entscheidungsproblem.
Proceedings of the London Mathematical Society, 42:230–265,
1936.
Turing fuhrte die Universelle Turing-Machine ein und zeigte, dass das
¨
¨
Halteproblem unlosbar ist.
Art of the state
14 / 98
33. Vorgeschichte
Das Entscheidungsproblem
Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule
HuHu
Ich geb euch mal nen Tip.
Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die
Klammern setzt.
Art of the state
16 / 98
34. Vorgeschichte
Das Entscheidungsproblem
Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule
HuHu
Ich geb euch mal nen Tip.
Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die
Klammern setzt. Es ist:
(a ◦ b ◦ c) ◦ (d ◦ e ◦ f ) ◦ (g ◦ h ◦ i)
gerade so viel, wie einmal von vorne nach hinten gekringelt.
Art of the state
16 / 98
35. Vorgeschichte
Das Entscheidungsproblem
Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule
HuHu
Ich geb euch mal nen Tip.
Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die
Klammern setzt. Es ist:
(a ◦ b ◦ c) ◦ (d ◦ e ◦ f ) ◦ (g ◦ h ◦ i)
gerade so viel, wie einmal von vorne nach hinten gekringelt.
Das war jetzt nur ein Beispiel!
Art of the state
16 / 98
42. Funktionale Programmierung
Einfuhrung
¨
Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.
immer neue Abstraktionen erlauben.
Art of the state
19 / 98
43. Funktionale Programmierung
Einfuhrung
¨
Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.
immer neue Abstraktionen erlauben.
ohne unerwunschte Seiteneffekte interagieren.
¨
Art of the state
19 / 98
44. Funktionale Programmierung
Einfuhrung
¨
Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.
immer neue Abstraktionen erlauben.
ohne unerwunschte Seiteneffekte interagieren.
¨
Idee . . .
¨
Vielleicht hilft mathematischer Mortel?
Art of the state
19 / 98
46. Funktionale Programmierung
Einfuhrung
¨
¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Art of the state
20 / 98
47. Funktionale Programmierung
Einfuhrung
¨
¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Art of the state
20 / 98
48. Funktionale Programmierung
Einfuhrung
¨
¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Funktionen sind frei von Seiteneffekten.
Art of the state
20 / 98
49. Funktionale Programmierung
Einfuhrung
¨
¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Funktionen sind frei von Seiteneffekten.
Stop
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?
Art of the state
20 / 98
50. Funktionale Programmierung
Einfuhrung
¨
¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Funktionen sind frei von Seiteneffekten.
Stop
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?
Weiter
¨
¨
Wir lassen das Ratsel vorerst ungelost . . .
Art of the state
20 / 98
56. Funktionale Programmierung
Einfuhrung
¨
Geschichte
Einige funktionale Sprachen
Name Jahr
Autor Typisierung
Λ-Kalkul 1936
Alonzo Church
¨
Lisp 1958
John McCarthy
dynamisch
ML 1973
Robert Milner
statisch
Scheme 1975
Steele / Sussman
dynamisch
Common Lisp 1984
Komitee
dynamisch
Erlang 1986 Ericsson, Joe Armstrong
dynamisch
Haskell 1990
Komitee
statisch
OCaml 1996
INRIA statisch, OO
Scala 2003
Martin Odersky statisch, OO
F# 2005
Microsoft, Don Syme statisch, OO
Clojure 2007
Rich Hickey
dynamisch
Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2
¨
2
Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.
Art of the state
21 / 98
59. Funktionale Programmierung
Einfuhrung
¨
Theoretisches Intermezzo
Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().
Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,
wenn er durch seinen Wert ersetzt werden kann, ohne
¨
das Verhalten des Programms zu verandern.
Art of the state
22 / 98
60. Funktionale Programmierung
Einfuhrung
¨
Theoretisches Intermezzo
Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().
Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,
wenn er durch seinen Wert ersetzt werden kann, ohne
¨
das Verhalten des Programms zu verandern.
Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zu
¨
Einzeilern zusammenzuschieben.
Art of the state
22 / 98
61. Funktionale Programmierung
Einfuhrung
¨
Theoretisches Intermezzo
Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().
Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,
wenn er durch seinen Wert ersetzt werden kann, ohne
¨
das Verhalten des Programms zu verandern.
Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zu
¨
Einzeilern zusammenzuschieben.
Das ist nicht immer eine gute Idee.
Art of the state
22 / 98
62. Funktionale Programmierung
Fraktales SQL
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
23 / 98
63. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Obfuscated Query contest
In den Nesseln eines fraktalen Ungeheuers?
¨
Selects konnen
uberall Selects
¨
enthalten und es
sind nur Einzeiler
¨
moglich.
WITH LatestOrders (ID) AS (SELECT MAX(ID)
FROM dbo.Orders GROUP BY CustomerID)
SELECT
Customers.∗,
Orders.OrderTime AS LatestOrderTime,
(SELECT COUNT(∗) FROM dbo.OrderItems
WHERE OrderID IN
(SELECT ID FROM dbo.Orders WHERE
CustomerID = Customers.ID))
AS TotalItemsPurchased
FROM
dbo.Customers INNER JOIN dbo.Orders
ON Customers.ID = Orders.CustomerID
WHERE
Orders.ID IN (SELECT ID FROM LatestOrders)
Art of the state
www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx
24 / 98
64. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Obfuscated Query contest
In den Nesseln eines fraktalen Ungeheuers?
¨
Selects konnen
uberall Selects
¨
enthalten und es
sind nur Einzeiler
¨
moglich.
Doch werden
keine Werte
¨
verandert.
WITH LatestOrders (ID) AS (SELECT MAX(ID)
FROM dbo.Orders GROUP BY CustomerID)
SELECT
Customers.∗,
Orders.OrderTime AS LatestOrderTime,
(SELECT COUNT(∗) FROM dbo.OrderItems
WHERE OrderID IN
(SELECT ID FROM dbo.Orders WHERE
CustomerID = Customers.ID))
AS TotalItemsPurchased
FROM
dbo.Customers INNER JOIN dbo.Orders
ON Customers.ID = Orders.CustomerID
WHERE
Orders.ID IN (SELECT ID FROM LatestOrders)
Art of the state
www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx
24 / 98
65. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Obfuscated Query contest
In den Nesseln eines fraktalen Ungeheuers?
¨
Selects konnen
uberall Selects
¨
enthalten und es
sind nur Einzeiler
¨
moglich.
Doch werden
keine Werte
¨
verandert.
Und Funktionen
haben keine
Seiteneffekte.
WITH LatestOrders (ID) AS (SELECT MAX(ID)
FROM dbo.Orders GROUP BY CustomerID)
SELECT
Customers.∗,
Orders.OrderTime AS LatestOrderTime,
(SELECT COUNT(∗) FROM dbo.OrderItems
WHERE OrderID IN
(SELECT ID FROM dbo.Orders WHERE
CustomerID = Customers.ID))
AS TotalItemsPurchased
FROM
dbo.Customers INNER JOIN dbo.Orders
ON Customers.ID = Orders.CustomerID
WHERE
Orders.ID IN (SELECT ID FROM LatestOrders)
Art of the state
www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx
24 / 98
67. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Fazit
¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Art of the state
26 / 98
68. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Fazit
¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Art of the state
26 / 98
69. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Fazit
¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Art of the state
26 / 98
70. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Fazit
¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Zwischen lesenden und schreibenden Zugriffen in SQL besteht
eine klare Trennung.
Art of the state
26 / 98
71. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Fazit
¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Zwischen lesenden und schreibenden Zugriffen in SQL besteht
eine klare Trennung.
¨
Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.
Art of the state
26 / 98
72. Funktionale Programmierung
Fraktales SQL
Fraktales SQL
Fazit
¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Zwischen lesenden und schreibenden Zugriffen in SQL besteht
eine klare Trennung.
¨
Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.
3
und gelegentlich auch in Inserts
Art of the state
26 / 98
74. Funktionale Programmierung
Fraktales SQL
Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.
Frage
Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder
¨
Anderung eine neue Collection anlegen zu mussen?
¨
Art of the state
27 / 98
75. Funktionale Programmierung
Fraktales SQL
Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.
Frage
Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder
¨
Anderung eine neue Collection anlegen zu mussen?
¨
Antwort
¨
Aus der Verwendung unveranderlicher Bausteine entstehen ganz
¨
neue Moglichkeiten der Wiederverwendung.
Art of the state
27 / 98
76. Funktionale Programmierung
Fraktales SQL
Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.
Frage
Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder
¨
Anderung eine neue Collection anlegen zu mussen?
¨
Antwort
¨
Aus der Verwendung unveranderlicher Bausteine entstehen ganz
¨
neue Moglichkeiten der Wiederverwendung.
Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zu
¨
tun. Persistente Datenstrukturen erhalten bei Anderungen
die vorherige Version, speichern jeweils nur die Differenz
¨
und sind damit im Effekt unveranderlich.
Art of the state
27 / 98
77. Funktionale Programmierung
Fraktales SQL
Eine persistente Datenstruktur aus dem Jahr 2000 4
public class FullIntList extends IntList {
private int sz;
private Object val ;
private IntList next;
public FullIntList (Object x) {
sz = 1; val = x; next = new EmptyIntlist() ; }
public Object first () { return val ; }
public Object rest () { return next; }
public IntList addEl(Object x) {
FullIntList n = new FullIntList(x);
n.next = this;
n.sz = this .sz + 1;
return n; }
}
4
Figure 7.1.3 aus Barbara Liskov with John Guttag: Program Development in Java :
Abstraction, Specification, and Object-Oriented Design. 1. Aufl.. 2000.
Art of the state
28 / 98
78. Funktionale Programmierung
Eine funktionale Berechnung
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
29 / 98
79. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
¨
d’hondtsches Hochstzahlverfahren
Das Verfahren nach d’Hondt ist bei den Landtagswahlen in
Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein
maßgeblich fur die Sitzzuteilung (Zweitstimmen).
¨
5
¨
Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/
de/glossar/texte/d_Hondtsche_Sitzverteilung.html
Art of the state
30 / 98
80. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
¨
d’hondtsches Hochstzahlverfahren
Das Verfahren nach d’Hondt ist bei den Landtagswahlen in
Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein
maßgeblich fur die Sitzzuteilung (Zweitstimmen).
¨
Die Stimmen der Parteien werden durch eine Folge von Divisoren
¨
geteilt. Die Sitze werden in der Reihenfolge der großten sich
5
¨
ergebenen Hochstzahlen zugeteilt.
5
¨
Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/
de/glossar/texte/d_Hondtsche_Sitzverteilung.html
Art of the state
30 / 98
81. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
¨
d’hondtsches Hochstzahlverfahren
Das Verfahren nach d’Hondt ist bei den Landtagswahlen in
Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein
maßgeblich fur die Sitzzuteilung (Zweitstimmen).
¨
Die Stimmen der Parteien werden durch eine Folge von Divisoren
¨
geteilt. Die Sitze werden in der Reihenfolge der großten sich
5
¨
ergebenen Hochstzahlen zugeteilt.
Den Sonderfall Stimmengleichheit beim letzten Sitz
¨
vernachlassigen wir.
5
¨
Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/
de/glossar/texte/d_Hondtsche_Sitzverteilung.html
Art of the state
30 / 98
82. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Art of the state
31 / 98
83. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
10000
6000
1500
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
84. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000
6000
1500
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
85. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
86. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
87. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000
3000
750
4.
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
88. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
89. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333
2000
500
6.
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
90. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333
2000
500
6.
2500
1500
375
7.
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
91. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333 8. 2000
500
6.
2500
1500
375
7.
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188
Art of the state
31 / 98
92. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
3.
5000 5. 3000
4.
3333 8. 2000
6.
2500
7.
2000
5
3
Art of the state
0
31 / 98
93. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Am Wahlabend
Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze
Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
3.
5000 5. 3000
4.
3333 8. 2000
6.
2500
7.
2000
5
3
0
Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalen
Programmierstudio.
Art of the state
31 / 98
94. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Schritt fur Schritt
¨
Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Art of the state
32 / 98
95. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Schritt fur Schritt
¨
Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Art of the state
32 / 98
96. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Schritt fur Schritt
¨
Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Sortiere quotienten absteigend nach der zweiten Komponente und
nehme die ersten sitze Paare in eine neue Liste auf:
[(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)]
Art of the state
32 / 98
97. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Schritt fur Schritt
¨
Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Sortiere quotienten absteigend nach der zweiten Komponente und
nehme die ersten sitze Paare in eine neue Liste auf:
[(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)]
Bilde daraus die Liste plazierung, die von jedem Paar nur die
¨
Partei-Komponente enthalt [A, B, A, A, B, A, B, A]
Art of the state
32 / 98
98. Funktionale Programmierung
Eine funktionale Berechnung
Eine funktionale Berechnung
Schritt fur Schritt
¨
Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Sortiere quotienten absteigend nach der zweiten Komponente und
nehme die ersten sitze Paare in eine neue Liste auf:
[(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)]
Bilde daraus die Liste plazierung, die von jedem Paar nur die
¨
Partei-Komponente enthalt [A, B, A, A, B, A, B, A]
Filtere nach den einzelnen Parteien. Jedes der Filtrate
[A, A, A, A, A], [B, B, B] und [] ist dann eine sitzliste. Partei A
¨
¨
erhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.
Art of the state
32 / 98
99. Funktionale Programmierung
Konzepte und Programme
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
33 / 98
100. Funktionale Programmierung
Konzepte und Programme
First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
Art of the state
34 / 98
101. Funktionale Programmierung
Konzepte und Programme
First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
Art of the state
34 / 98
102. Funktionale Programmierung
Konzepte und Programme
First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
Art of the state
34 / 98
103. Funktionale Programmierung
Konzepte und Programme
First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
eine Funktion einer Variablen zugewiesen werden,
Art of the state
34 / 98
104. Funktionale Programmierung
Konzepte und Programme
First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
eine Funktion einer Variablen zugewiesen werden,
eine Funktion in einer Datenstruktur gespeichert werden,
Art of the state
34 / 98
105. Funktionale Programmierung
Konzepte und Programme
First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
eine Funktion einer Variablen zugewiesen werden,
eine Funktion in einer Datenstruktur gespeichert werden,
eine Funktion zur Laufzeit erzeugt werden.
Art of the state
34 / 98
106. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
¨
Erklarung und Beispiele
¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
Art of the state
35 / 98
107. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
¨
Erklarung und Beispiele
¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state
35 / 98
108. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
¨
Erklarung und Beispiele
¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
map map(f, seq) erstellt eine neue Sequenz durch Anwendung
der Funktion f auf alle Elemente von seq.
So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state
35 / 98
109. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
¨
Erklarung und Beispiele
¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
map map(f, seq) erstellt eine neue Sequenz durch Anwendung
der Funktion f auf alle Elemente von seq.
filter f ilter(test, seq) erstellt eine neue Sequenz, die nur noch
¨
die Elemente von seq enthalt, fur die die boolesche
¨
Funktion test zutrifft.
So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state
35 / 98
110. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
¨
Erklarung und Beispiele
¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
map map(f, seq) erstellt eine neue Sequenz durch Anwendung
der Funktion f auf alle Elemente von seq.
filter f ilter(test, seq) erstellt eine neue Sequenz, die nur noch
¨
die Elemente von seq enthalt, fur die die boolesche
¨
Funktion test zutrifft.
¨
reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufend
auf eine Sequenz an und liefert einen einzelnen Wert
zuruck.
¨
So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state
35 / 98
111. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
Weitere Beispiele
In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an:
6
Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.
1. Aufl.. No Starch Press, 2011.
Art of the state
36 / 98
112. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
Weitere Beispiele
In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an:
<html><head><meta charset="UTF-8"></head>
<body><script src = "higher-order.js" type="text/javascript">
</script></body></html>
6
Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.
1. Aufl.. No Starch Press, 2011.
Art of the state
36 / 98
113. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
Weitere Beispiele
In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an:
<html><head><meta charset="UTF-8"></head>
<body><script src = "higher-order.js" type="text/javascript">
</script></body></html>
¨
Zur Vertiefung empfehle ich dieses schone Buch6
http://eloquentjavascript.net/chapter6.html
6
Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.
1. Aufl.. No Starch Press, 2011.
Art of the state
36 / 98
114. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
im Einsatz
var plazierung = [[ ’A’, 10000], [’B’, 6000], [’A’, 5000], [’A’, 3333],
[’B’, 3000], [’A’, 2500], [’B’, 2000], [’A’, 2000]]
// erste Komponente, z.B. ’A’ fur first ([’ A’, 10000])
¨
function first (a) {return a[0]}
// eq(a) gibt Funktion zuruck, die Gleichheit mit a prueft
¨
function eq(a){
return function (b){return a == b}
}
// map(first ) −> [ABAABABA], filter(eq(A)) −> [AAAAA]
function sitzliste ( partei ) {
return plazierung.map(first ) . filter (eq(partei) )
}
// length [AAAAA] = 5
for each (var p in [’A’, ’B’, ’C’]) {
document.write(p + ’:’ + sitzliste (p).length+ ’ ’)
}
Art of the state
37 / 98
115. Funktionale Programmierung
Konzepte und Programme
Higher Order Functions
Comprehensions
Statt map und filter werden gerne List Comprehensions genommen.
¨
Als Bonus erhalt man noch ein ein einfaches Pattern Matching.
list-comprehension.js
var plazierung = [[ ’A’, 10000], [’B’, 6000], [’A’, 5000], [’A’, 3333],
[’B’, 3000], [’A’, 2500], [’B’, 2000], [’A’, 2000]]
function sitzliste ( partei ) {
return [p for each([p, q] in plazierung) if (p == partei) ]
}
for each (var p in [’A’, ’B’, ’C’]) {
document.write(p + ’:’ + sitzliste (p).length+ ’ ’)
}
Art of the state
38 / 98
116. Funktionale Programmierung
Konzepte und Programme
Das Wahlprogramm
/∗∗ script type =”application / javascript ;version=1.7 ∗∗/
function range(begin, end){
for ( let i = begin; i < end; ++i){yield i ;}}
var sitze = 8, votum = [[’A’, 10000], [’C’, 1500], [’B’, 6000]];
var plazierung =
[[ p, v/ i ] for ( i in range(1, sitze +1)) for each ([p, v] in votum)]
. sort ( function (a, b){return b[1] − a[1]}) . slice (0, sitze ) ;
function sitzliste ( partei ) {
return [p for each([p, q] in plazierung) if (p == partei) ]
}
for each (var p in [’A’, ’B’, ’C’]) {
document.write(p + ’:’ + sitzliste (p).length+ ’ ’)
}
Art of the state
39 / 98
117. Funktionale Programmierung
Konzepte und Programme
Lazy Evaluation
Generator Expressions in JavaScript 1.8 erlauben Lazy Evaluation.
/∗∗ script type =”application / javascript ;version=1.8 ∗∗/
// ALLE natuerlichen Zahlen
function nat() {
var i = 0;
while (true) {
yield i ;
i +=1;
}
}
// ALLE Zahlen , deren Quadrate groesser als 1000 sind
var q1000 = (i for each (i in nat() ) if ( i ∗i > 1000));
// Die erste Zahl, deren Quadrat groesser als 1000 ist, ist 32
document.write(q1000.next())
Art of the state
40 / 98
118. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Seiltanzer Pierre
Dieses Beispiel kommt aus dem Buch Learn you a Haskell for Great
Good von Miran Lipovaˇ a7 und ist auch online verfugbar.
c
¨
http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line
7
Lipovaˇ a, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.
c
Aufl.. No Starch Press, 2011.
Art of the state
41 / 98
119. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Seiltanzer Pierre
Dieses Beispiel kommt aus dem Buch Learn you a Haskell for Great
Good von Miran Lipovaˇ a7 und ist auch online verfugbar.
c
¨
http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line
Das Buch ist unbedingt empfehlenswert.
7
Lipovaˇ a, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.
c
Aufl.. No Starch Press, 2011.
Art of the state
41 / 98
121. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.
Art of the state
42 / 98
122. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.
¨
Vogel auf der
Balancierstange!
Art of the state
42 / 98
123. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.
¨
Vogel auf der
Balancierstange!
¨
¨
Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierre
¨
ins Netz. Der Unterschied darf hochstens drei sein.
Art of the state
42 / 98
124. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.
¨
Vogel auf der
Balancierstange!
¨
¨
Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierre
¨
ins Netz. Der Unterschied darf hochstens drei sein.
Ein Haskell-Programm soll nach erfolgreichem Seilgang den
Vogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.
¨
Art of the state
42 / 98
126. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Art of the state
43 / 98
127. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Pierre1.hs
routine :: Maybe Pole
routine = case landLeft 1 (0,0) of
Nothing −> Nothing
Just pole1 −> case landRight 4 pole1 of
Nothing −> Nothing
Just pole2 −> case landLeft 2 pole2 of
Nothing −> Nothing
Just pole3 −> landLeft 1 pole3
Art of the state
43 / 98
128. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Pierre1.hs
routine :: Maybe Pole
routine = case landLeft 1 (0,0) of
Nothing −> Nothing
Just pole1 −> case landRight 4 pole1 of
Nothing −> Nothing
Just pole2 −> case landLeft 2 pole2 of
Nothing −> Nothing
Just pole3 −> landLeft 1 pole3
Ein Vogel landet links, vier landen rechts, zwei links, noch einer links.
Art of the state
43 / 98
129. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
¨
Vogel auf der Balancierstange
Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Pierre1.hs
routine :: Maybe Pole
routine = case landLeft 1 (0,0) of
Nothing −> Nothing
Just pole1 −> case landRight 4 pole1 of
Nothing −> Nothing
Just pole2 −> case landLeft 2 pole2 of
Nothing −> Nothing
Just pole3 −> landLeft 1 pole3
Ein Vogel landet links, vier landen rechts, zwei links, noch einer links.
¨
Schon bekommt das Programm einen leichten Seitwartsdrall.
Art of the state
43 / 98
130. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
Kontrollierter Umgang mit Seiteneffekten in Haskell
Art of the state
44 / 98
131. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
Kontrollierter Umgang mit Seiteneffekten in Haskell
Weder Haskell noch Pierre lassen sich aus der Ruhe bringen.
Pierre2.hs
routine2 :: Maybe Pole
routine2 = do
start <− return (0, 0)
pole0 <− landLeft 1 start
pole1 <− landRight 4 pole0
pole2 <− landLeft 2 pole1
landLeft 1 pole2
Art of the state
44 / 98
132. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
Kontrollierter Umgang mit Seiteneffekten in Haskell
Weder Haskell noch Pierre lassen sich aus der Ruhe bringen.
Pierre2.hs
routine2 :: Maybe Pole
routine2 = do
start <− return (0, 0)
pole0 <− landLeft 1 start
pole1 <− landRight 4 pole0
pole2 <− landLeft 2 pole1
landLeft 1 pole2
Pierre3.hs
routine3 = return (0,0) >>= landLeft 1 >>= landRight 4 >>= landLeft 2
>>= landLeft 1
Art of the state
44 / 98
133. Funktionale Programmierung
Konzepte und Programme
Das programmierbare Semikolon
Was war jetzt der Trick mit der Banane?
type Birds = Int
type Pole = (Birds, Birds)
landLeft :: Birds −> Pole −> Maybe Pole
landLeft n ( left , right )
| abs (( left + n) − right ) < 4 = Just ( left + n, right )
| otherwise
= Nothing
landRight :: Birds −> Pole −> Maybe Pole
landRight n ( left , right )
| abs ( left − ( right + n)) < 4 = Just ( left , right + n)
| otherwise
= Nothing
banana :: Pole −> Maybe Pole
banana = Nothing
Art of the state
45 / 98
135. Funktionale Programmierung
Konzepte und Programme
Die Antwort auf eine andere offene Frage
Frage
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?
Art of the state
46 / 98
136. Funktionale Programmierung
Konzepte und Programme
Die Antwort auf eine andere offene Frage
Frage
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?
Antwort
Das geht nicht, aber die funktionale Programmierung verfugt uber
¨ ¨
Mittel und Wege, Seiteneffekte zu kontrollieren.
Art of the state
46 / 98
138. Funktionale Programmierung
Konzepte und Programme
Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule
HuHu
Na, habt ihrs rausgefunden?
Art of the state
48 / 98
139. Funktionale Programmierung
Konzepte und Programme
Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule
HuHu
Na, habt ihrs rausgefunden?
Richtig, jede Reihe kann einen eigenen Zettel ausfullen.
¨
Art of the state
48 / 98
140. Funktionale Programmierung
Konzepte und Programme
Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule
HuHu
Na, habt ihrs rausgefunden?
Richtig, jede Reihe kann einen eigenen Zettel ausfullen.
¨
¨
Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolge
¨
zusammenheften.
Art of the state
48 / 98
141. Funktionale Programmierung
Konzepte und Programme
Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule
HuHu
Na, habt ihrs rausgefunden?
Richtig, jede Reihe kann einen eigenen Zettel ausfullen.
¨
¨
Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolge
¨
zusammenheften.
¨
Nachstes Mal!
Art of the state
48 / 98
143. Lambda Expressions in Java 8
Motivation
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
50 / 98
144. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Art of the state
51 / 98
145. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Interne Iteration
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’
Art of the state
51 / 98
146. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Interne Iteration
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’
Externe Iteration
int sum = 0;
for (Wahlkreis wk : wahlkreise) {
if ( partei .equals(wk.partei)) {
sum += wk.stimmen;
}
}
Art of the state
51 / 98
147. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Interne Iteration
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’
Externe Iteration
int sum = 0;
for (Wahlkreis wk : wahlkreise) {
if ( partei .equals(wk.partei)) {
sum += wk.stimmen;
}
}
Frage
Wo ist hier noch Spielraum?
Art of the state
51 / 98
148. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
Art of the state
52 / 98
149. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)
Art of the state
52 / 98
150. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)
Problem externe Iteration
Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung.
¨
Art of the state
52 / 98
151. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)
Problem externe Iteration
Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung.
¨
¨
Problem Kompatibilitat
¨
Man kann nicht so ohne weiteres die Libraries andern.
Art of the state
52 / 98
152. Lambda Expressions in Java 8
Motivation
Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨
Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)
Problem externe Iteration
Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung.
¨
¨
Problem Kompatibilitat
¨
Man kann nicht so ohne weiteres die Libraries andern.
¨
Losung
Java Language Architect Brian Goetz und sein Team haben daher die
¨
Sprache Java geandert.
Art of the state
52 / 98
153. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
53 / 98
154. Lambda Expressions in Java 8
Collections und Higher-Order Functions
¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013
Art of the state
54 / 98
155. Lambda Expressions in Java 8
Collections und Higher-Order Functions
¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013
java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}
Art of the state
54 / 98
156. Lambda Expressions in Java 8
Collections und Higher-Order Functions
¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013
java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}
java/util/List.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , Spliterator .ORDERED);
}
Art of the state
54 / 98
157. Lambda Expressions in Java 8
Collections und Higher-Order Functions
¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013
java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}
java/util/List.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , Spliterator .ORDERED);
}
Aha, polymorphe Default Implemetierung in Interfaces und . . .
Art of the state
54 / 98
158. Lambda Expressions in Java 8
Collections und Higher-Order Functions
¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013
java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}
java/util/List.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , Spliterator .ORDERED);
}
Aha, polymorphe Default Implemetierung in Interfaces und . . .
SPLITERATOR
Art of the state
54 / 98
159. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Disclaimer
Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zu
¨
¨
klaren, andere konnen das besser. Insbesondere verweise ich auf
¨
Maurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen von
Brian Goetz und Maurice Naftalin:
http://openjdk.java.net/projects/lambda/
http://www.lambdafaq.org/
http://naftalin.org/maurice/professional/talks/
cAfter8_devoxx2012.pdf
https://blogs.oracle.com/briangoetz/resource/
devoxx-lang-lib-vm-co-evol.pdf
Art of the state
55 / 98
160. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Disclaimer
Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zu
¨
¨
klaren, andere konnen das besser. Insbesondere verweise ich auf
¨
Maurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen von
Brian Goetz und Maurice Naftalin:
http://openjdk.java.net/projects/lambda/
http://www.lambdafaq.org/
http://naftalin.org/maurice/professional/talks/
cAfter8_devoxx2012.pdf
https://blogs.oracle.com/briangoetz/resource/
devoxx-lang-lib-vm-co-evol.pdf
Aber was ist jetzt mit diesen Streams?
Art of the state
55 / 98
161. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream in Action
Art of the state
56 / 98
162. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream in Action
Parametrisierung mit anonymen Klassen
int sumStimmenAno(List<Wahlkreis> wahlkreise, String partei) {
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei .equals(wk.partei); // Vor Java 8 Fehlermeldung 8
}
};
ToIntFunction<Wahlkreis> mpStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
return wahlkreise.stream(). filter ( testPartei ) .mapToInt(mpStimm).sum();
}
Art of the state
56 / 98
163. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream in Action
Parametrisierung mit anonymen Klassen
int sumStimmenAno(List<Wahlkreis> wahlkreise, String partei) {
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei .equals(wk.partei); // Vor Java 8 Fehlermeldung 8
}
};
ToIntFunction<Wahlkreis> mpStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
return wahlkreise.stream(). filter ( testPartei ) .mapToInt(mpStimm).sum();
}
8
Cannot refer to a non-final variable partei inside an inner class defined in a
different method
Art of the state
56 / 98
164. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
in Java
Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Art of the state
57 / 98
165. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
in Java
Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Art of the state
57 / 98
166. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
in Java
Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order
¨
Functions moglich.
Art of the state
57 / 98
167. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
in Java
Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order
¨
Functions moglich.
Anonyme Klassen sind jedoch absolute Holzklasse.
Art of the state
57 / 98
168. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
in Java
Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order
¨
Functions moglich.
Anonyme Klassen sind jedoch absolute Holzklasse.
Wir werden bald was besseres haben . . .
Art of the state
57 / 98
169. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream und Parallelisierung
Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Art of the state
58 / 98
170. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream und Parallelisierung
Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Art of the state
58 / 98
171. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream und Parallelisierung
Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Art of the state
58 / 98
172. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream und Parallelisierung
Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Ein Stream wird von einer Collection mit stream() oder
¨
parallelStream() ausgelost.
Art of the state
58 / 98
173. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream und Parallelisierung
Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Ein Stream wird von einer Collection mit stream() oder
¨
parallelStream() ausgelost.
Bei der Parallelverarbeitung verdoppelt sich der Stream durch
Zellteilung (FORK ).
Art of the state
58 / 98
174. Lambda Expressions in Java 8
Collections und Higher-Order Functions
Higher-Order Functions
Stream und Parallelisierung
Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Ein Stream wird von einer Collection mit stream() oder
¨
parallelStream() ausgelost.
Bei der Parallelverarbeitung verdoppelt sich der Stream durch
Zellteilung (FORK ).
Die Arbeitsergebnisse werden in der richtigen Reihenfolge
zusammengetragen (JOIN).
Art of the state
58 / 98
175. Lambda Expressions in Java 8
Closures
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
59 / 98
177. Lambda Expressions in Java 8
Closures
Closures
Definition
Anonyme Funktionen wurden 1936 von Alonzo Church mit dem
Λ-Kalkul eingefuhrt. Eine anonyme Funktion kann
¨
¨
definiert und aufgerufen werden, ohne an einen Identifier
gebunden zu sein.
Art of the state
60 / 98
178. Lambda Expressions in Java 8
Closures
Closures
Definition
Anonyme Funktionen wurden 1936 von Alonzo Church mit dem
Λ-Kalkul eingefuhrt. Eine anonyme Funktion kann
¨
¨
definiert und aufgerufen werden, ohne an einen Identifier
gebunden zu sein.
Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closure
¨
ist eine anonyme Funktion, die nicht nur Zugriff auf ihren
unmittelbaren lexical scope hat, sondern auch auf das
lexical environment, aus dem sie aufgerufen wird. Ihre
freien Variablen werden in dem aufrufenden Kontext
gebunden (closed). Daher der Name Closure.
Art of the state
60 / 98
179. Lambda Expressions in Java 8
Closures
Closures
in Programmiersprachen
Die ersten Programmiersprachen mit Closures
Name
Jahr
Autor
Typisierung
Paradigma
Smalltalk
1972
Alan Kay, Dan Ingalls
und Adele Goldberg
dynamisch
objektorientiert
Scheme
1975
Guy L. Steele und
Gerald Jay Sussman
dynamisch
funktional
Art of the state
61 / 98
180. Lambda Expressions in Java 8
Closures
Closures
in Programmiersprachen
Die ersten Programmiersprachen mit Closures
Name
Jahr
Autor
Typisierung
Paradigma
Smalltalk
1972
Alan Kay, Dan Ingalls
und Adele Goldberg
dynamisch
objektorientiert
Scheme
1975
Guy L. Steele und
Gerald Jay Sussman
dynamisch
funktional
Und seitdem in vielen, vielen anderen Sprachen . . .
Art of the state
61 / 98
182. Lambda Expressions in Java 8
Closures
Closures in Java 8
Java: Closures mit anonymen Klassen
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei.equals(wk.partei) ;
}
};
ToIntFunction<Wahlkreis> mapStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
int sum = wahlkreise.stream()
. filter ( testPartei ) .map(mapStimm).sum();
Art of the state
62 / 98
183. Lambda Expressions in Java 8
Closures
Closures in Java 8
Java: Closures mit anonymen Klassen
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei.equals(wk.partei) ;
}
};
ToIntFunction<Wahlkreis> mapStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
int sum = wahlkreise.stream()
. filter ( testPartei ) .map(mapStimm).sum();
Java 8: Closures mit anonymen Funktionen
int sum = wahlkreise.stream()
. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();
Art of the state
62 / 98
184. Lambda Expressions in Java 8
Closures
Closures in Java 8
Funktionale Interfaces
Was haben diese Interfaces gemeinsam?
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
Art of the state
63 / 98
185. Lambda Expressions in Java 8
Closures
Closures in Java 8
Anonyme Funktionen implementieren funktionale Interfaces
Art of the state
64 / 98
186. Lambda Expressions in Java 8
Closures
Closures in Java 8
Anonyme Funktionen implementieren funktionale Interfaces
Funktionale Interfaces deklarieren genau eine abstrakte Methode.
Art of the state
64 / 98
187. Lambda Expressions in Java 8
Closures
Closures in Java 8
Anonyme Funktionen implementieren funktionale Interfaces
Funktionale Interfaces deklarieren genau eine abstrakte Methode.
Eine anonyme Funktion implementiert ein funktionales Interface.
Welches, das erschließt sich aus dem Kontext.
Typen mussen nicht immer angegeben werden. Der
¨
Java-Compiler lernt zunehmend Typ-Inferenz.
Art of the state
64 / 98
188. Lambda Expressions in Java 8
Closures
Closures in Java 8
¨
¨
Anonyme Funktionen sind dunnhautige Chamaleons
¨
Art of the state
65 / 98
189. Lambda Expressions in Java 8
Closures
Closures in Java 8
¨
¨
Anonyme Funktionen sind dunnhautige Chamaleons
¨
Anonyme Funktionen und anonyme Klassen haben Zugriff auf
effectively final Variablen des lexical environments.
Art of the state
65 / 98
190. Lambda Expressions in Java 8
Closures
Closures in Java 8
¨
¨
Anonyme Funktionen sind dunnhautige Chamaleons
¨
Anonyme Funktionen und anonyme Klassen haben Zugriff auf
effectively final Variablen des lexical environments.
Im Gegensatz zu anonymen Klassen haben anonyme Funktionen
¨
keine eigene Identitat. Sie stehen in keiner Vererbungshierarchie,
sie bringen keinen eigenen Scope mit. Selbst das Schlusselwort
¨
this ist das this ihres lexical environments.
Art of the state
65 / 98
191. Lambda Expressions in Java 8
Closures
¨
Zum Aufwarmen
lambda-8-b117 vom 21.11.2013
import java. util .∗;
import java. util . function .∗;
import static java. util .stream.Collectors. toList ;
List <String> worte = Arrays.asList("Wo", "ist", "meine", "Brille");
// Ausgabe [meine, Brille]
show(worte.stream(). filter (p −> p.length() > 3). collect ( toList () ) ) ;
// Ausgabe jedesmal [2, 3, 5, 6]
Function<String, Integer> f1 = p −> p.length(); // closure
Function<String, Integer> f2 = String :: length; // method reference
show(worte.stream().map(f1).collect( toList () ) ) ;
show(worte.stream().map(f2).collect( toList () ) ) ;
List <Integer> zahlen = Arrays.asList(6, 5, 2, 3);
zahlen.sort (( p1, p2) −> p1.compareTo(p2));
show(zahlen);
Art of the state
66 / 98
192. Lambda Expressions in Java 8
Closures
Spielraum fur Parallelisierung
¨
Interne Iteration mit SQL
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’
Interne Iteration mit Java 8
int sum =wahlkreise.parallelStream()
. filter (wk−>"A".equals(wk.partei))
. mapToInt (wk−>wk.stimmen)
. sum();
Art of the state
67 / 98
193. Lambda Expressions in Java 8
Closures
Abfragen zur Wahl . . .
lambda-8-b117 vom 21.11.2013
import java. util .∗;
import java. util . function .∗;
import java. util .stream.Collectors;
List <Pair> quotienten = new ArrayList<>();
for ( int i = 1; i <= anzSitze; ++i) {
for (Pair v : votum) {
quotienten.add(new Pair(v.partei, v.zahl/ i ) ) ;
}
}
// quotienten = [(’ A’,10000) ,(’ B’,6000) ,(’ C’,1500) ,(’ A’,5000) ...
List <String> plazierung = quotienten.stream()
.sorted((p1, p2) −> p2.zahl − p1.zahl).limit (anzSitze)
.map(pair −> pair.partei)
. collect (Collectors . toList () ) ;
// plazierung = [A, B, A, A, B, A, B, A]
Art of the state
68 / 98
194. Lambda Expressions in Java 8
Closures
Abfragen zur Wahl im LINQ Stil
lambda-8-b117 vom 21.11.2013
import
import
import
import
java. util .∗;
java. util . function .∗;
java. util .stream.Collectors;
static java. util .stream.Collectors.groupingBy;
// quotienten = [(’ A’,10000) ,(’ B’,6000) ,(’ C’,1500) ,(’ A’,5000) ...
Map<String, List<String>> parteiSitze = quotienten.stream()
.sorted((p1, p2) −> p2.zahl − p1.zahl)
. limit (anzSitze).map(pair −> pair.partei)
. collect (groupingBy(a−>a));
// parteiSitze ={A=[A, A, A, A, A], B=[B, B, B]}
Art of the state
69 / 98
195. Lambda Expressions in Java 8
Closures
Codeblock in Action
lambda-8-b117 vom 21.11.2013
Fur Smalltalk und Ruby-Fans.
¨
// parteiSitze ={A=[A, A, A, A, A], B=[B, B, B]}
parteiSitze .entrySet() .stream().
forEach(e−>{
System.out.print(e.getKey()+":"+e.getValue().size()+" ");
}) ;
// A:5 B:3
Art of the state
70 / 98
196. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
Hu
Art of the state
71 / 98
197. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
HuHu
Art of the state
72 / 98
198. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
HuHuHu
Art of the state
73 / 98
199. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL
Hu
Bielefeld ist in Existenznot und braucht meine Hilfe.
Art of the state
74 / 98
200. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL
Hu
Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
Art of the state
74 / 98
201. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL
Hu
Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
Spliterator geht nicht,
Art of the state
74 / 98
202. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL
Hu
Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
¨
Spliterator geht nicht, zu wenig Assoziativitat.
Art of the state
74 / 98
203. Lambda Expressions in Java 8
Closures
Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL
Hu
Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
¨
Spliterator geht nicht, zu wenig Assoziativitat.
Wenn nur das Lambdagate noch offen ist . . .
Art of the state
74 / 98
205. Funktionale Software-Architektur und Java
Motivation
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
76 / 98
207. Funktionale Software-Architektur und Java
Motivation
Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Art of the state
77 / 98
208. Funktionale Software-Architektur und Java
Motivation
Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
Art of the state
77 / 98
209. Funktionale Software-Architektur und Java
Motivation
Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
¨
mit unveranderlichen Bausteinen zu arbeiten?
Art of the state
77 / 98
210. Funktionale Software-Architektur und Java
Motivation
Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
¨
mit unveranderlichen Bausteinen zu arbeiten?
Aber
¨
sind nicht veranderliche Objekte ein Grundmerkmal der
Objektorientierung?
Art of the state
77 / 98
211. Funktionale Software-Architektur und Java
Motivation
Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
¨
mit unveranderlichen Bausteinen zu arbeiten?
Aber
¨
sind nicht veranderliche Objekte ein Grundmerkmal der
Objektorientierung?
Antwort
Hmm, . . .
Art of the state
77 / 98
213. Funktionale Software-Architektur und Java
Motivation
Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Art of the state
78 / 98
214. Funktionale Software-Architektur und Java
Motivation
Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Art of the state
78 / 98
215. Funktionale Software-Architektur und Java
Motivation
Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Von mehreren Threads gemeinsam genutzte Daten und
¨
Ressourcen sollten unveranderlich sein, denn Synchronisation ist
¨
kompliziert und fehleranfallig.
Art of the state
78 / 98
216. Funktionale Software-Architektur und Java
Motivation
Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Von mehreren Threads gemeinsam genutzte Daten und
¨
Ressourcen sollten unveranderlich sein, denn Synchronisation ist
¨
kompliziert und fehleranfallig.
¨
¨
Losungsansatze kommen aus der funktionalen Programmierung9 .
Art of the state
78 / 98
217. Funktionale Software-Architektur und Java
Motivation
Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Von mehreren Threads gemeinsam genutzte Daten und
¨
Ressourcen sollten unveranderlich sein, denn Synchronisation ist
¨
kompliziert und fehleranfallig.
¨
¨
Losungsansatze kommen aus der funktionalen Programmierung9 .
Dieses hervorragende Buch von Venkat
¨
Subramaniam zeigt Losungen mit Java, Groovy,
Scala und Clojure.
9
Subramaniam, Venkat: Programming Concurrency on the JVM.
Art of the state
78 / 98
219. Funktionale Software-Architektur und Java
Motivation
Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose
Art of the state
79 / 98
220. Funktionale Software-Architektur und Java
Motivation
Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose
Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Art of the state
79 / 98
221. Funktionale Software-Architektur und Java
Motivation
Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose
Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Aber auch in realen Projekten finden sich oft unwartbare globale
Allzweck-Datenstrukturen.
Art of the state
79 / 98
222. Funktionale Software-Architektur und Java
Motivation
Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose
Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Aber auch in realen Projekten finden sich oft unwartbare globale
Allzweck-Datenstrukturen.
Sie sind ein Zeichen mangelnder Modellierung und fehlender oder
falscher Abstraktion.
Art of the state
79 / 98
223. Funktionale Software-Architektur und Java
Motivation
Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose
Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Aber auch in realen Projekten finden sich oft unwartbare globale
Allzweck-Datenstrukturen.
Sie sind ein Zeichen mangelnder Modellierung und fehlender oder
falscher Abstraktion.
Der Blick durch funktionale und OO Brille. . .
helfen, maßgeschneiderte Abstraktionen zu finden.
Art of the state
79 / 98
225. Funktionale Software-Architektur und Java
Motivation
Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}
Art of the state
80 / 98
226. Funktionale Software-Architektur und Java
Motivation
Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}
Diese Klasse ist threadsafe10 .
Art of the state
80 / 98
227. Funktionale Software-Architektur und Java
Motivation
Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}
Diese Klasse ist threadsafe10 .
10
Listing 4.6 aus Goetz, Brian; Bloch, Joshua; Bowbeer, Joseph; Lea, Doug;
Holmes, David; Peierls, Tim: Java Concurrency in Practice. Addison-Wesley, 2006.
Art of the state
80 / 98
228. Funktionale Software-Architektur und Java
Motivation
Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}
Diese Klasse ist threadsafe10 .
¨
Alle unveranderlichen Klassen sind threadsafe.
10
Listing 4.6 aus Goetz, Brian; Bloch, Joshua; Bowbeer, Joseph; Lea, Doug;
Holmes, David; Peierls, Tim: Java Concurrency in Practice. Addison-Wesley, 2006.
Art of the state
80 / 98
229. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Gliederung
1
Vorgeschichte
Das Entscheidungsproblem
2
Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme
3
Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures
4
Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state
81 / 98
231. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Art of the state
82 / 98
232. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.
Art of the state
82 / 98
233. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.
Der Blick durch die funktionale Brille . . .
¨
soll uns helfen, bessere und verstandlichere Programme zu schreiben.
Art of the state
82 / 98
234. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.
Der Blick durch die funktionale Brille . . .
¨
soll uns helfen, bessere und verstandlichere Programme zu schreiben.
Nach einer kurzen Einfuhrung werfen wir einen Blick auf die
¨
¨
einschlagige Literatur.
Art of the state
82 / 98
235. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.
Der Blick durch die funktionale Brille . . .
¨
soll uns helfen, bessere und verstandlichere Programme zu schreiben.
Nach einer kurzen Einfuhrung werfen wir einen Blick auf die
¨
¨
einschlagige Literatur.
Danach geht es mit Fallstudien weiter.
Art of the state
82 / 98
237. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Art of the state
83 / 98
238. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
Art of the state
83 / 98
239. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Art of the state
83 / 98
240. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Aus der architektonischen Vogelperspektive, versteht sich. An
¨
Log-Ausgaben und Exception-Handling werden wir nichts andern.
Art of the state
83 / 98
241. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Aus der architektonischen Vogelperspektive, versteht sich. An
¨
Log-Ausgaben und Exception-Handling werden wir nichts andern.
Auch aus der Vogelperspektive werden wir darauf beharren, dass
¨
unveranderliche Objekte unmittelbar nach Durchlaufen des
Konstruktors final sind.
Art of the state
83 / 98
242. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Aus der architektonischen Vogelperspektive, versteht sich. An
¨
Log-Ausgaben und Exception-Handling werden wir nichts andern.
Auch aus der Vogelperspektive werden wir darauf beharren, dass
¨
unveranderliche Objekte unmittelbar nach Durchlaufen des
Konstruktors final sind.
Sollte Ergebnis der Trennung sein, dass z.B. eine extrem
¨
veranderliche Komponente, durch einen endlichen Automaten zu
realisieren ist, dann ist auch das eine gute Abgrenzung.
Art of the state
83 / 98
245. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
Literaturempfehlungen
Effective Java ist das eine Buch, das jeder Java Entwickler immer
dabei haben sollte.
Art of the state
84 / 98
246. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
Literaturempfehlungen
Effective Java ist das eine Buch, das jeder Java Entwickler immer
dabei haben sollte.
Program Development in Java ist ein Klassiker der
Informatikausbildung, jedoch kein Buch um Java zu lernen.
Art of the state
84 / 98
247. Funktionale Software-Architektur und Java
Trennung: Schwarz und Weiß
Trennung: Schwarz und Weiß
Literaturempfehlungen
Effective Java ist das eine Buch, das jeder Java Entwickler immer
dabei haben sollte.
Program Development in Java ist ein Klassiker der
Informatikausbildung, jedoch kein Buch um Java zu lernen.
Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.
¨
11
Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,
Testen und Techniken fur sauberen Code. mitp-Verlag, 2009
¨
Art of the state
84 / 98