Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Post on 29-Jun-2015

553 views 2 download

description

Präsentation für Java Usergruppe Hannover am 16.1.2013 behandelt: - Funktionale Programmierung, - Lambda Expressions in Java 8 - Funktionale Softwarearchitektur und Java

transcript

Art of the stateFunktionale Softwarearchitektur mit Plain Old Java

Gunter Jantzen

Capgemini

16. Januar 2013 1

1Angepasst an jdk8 lambda-8-b117 vom 21.11.2013Art of the state 1 / 98

1 VorgeschichteDas Entscheidungsproblem

2 Funktionale ProgrammierungEinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 2 / 98

Die FunctionalOWL vom Hackerspace Bielefeldhttp://hackerspace-bielefeld.de/

Verwendung mitfreundlicherGenehmigung desKunstlers JonahJoen Bethlehem.

Art of the state 3 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 4 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

ich bin die FunctionalOWL und habe ein fotografisches Gedachtnis.

Art of the state 5 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

ich bin die FunctionalOWL und habe ein fotografisches Gedachtnis.

Art of the state 5 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

Flash

Jetzt schreibt bitte mal Eure Namen auf die Liste.

Art of the state 6 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

Jetzt schreibt bitte mal Eure Namen auf die Liste.

Art of the state 6 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihrEuch ja schon mal uberlegen, wie sich das Aufschreibenparallelisieren lasst.Aber die Reihenfolge muss stimmen!!

Art of the state 7 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.

Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihrEuch ja schon mal uberlegen, wie sich das Aufschreibenparallelisieren lasst.Aber die Reihenfolge muss stimmen!!

Art of the state 7 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihrEuch ja schon mal uberlegen, wie sich das Aufschreibenparallelisieren lasst.

Aber die Reihenfolge muss stimmen!!

Art of the state 7 / 98

Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihrEuch ja schon mal uberlegen, wie sich das Aufschreibenparallelisieren lasst.Aber die Reihenfolge muss stimmen!!

Art of the state 7 / 98

Vorgeschichte

Vorgeschichte

Art of the state 8 / 98

Vorgeschichte Das Entscheidungsproblem

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 9 / 98

Vorgeschichte Das Entscheidungsproblem

Gullivers Reise nach Laputa

1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz inder Ars Combinatoria formulierte Idee, auf kombinatorische Weise allemogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htm

Art of the state 10 / 98

Vorgeschichte Das Entscheidungsproblem

Gullivers Reise nach Laputa1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz inder Ars Combinatoria formulierte Idee, auf kombinatorische Weise allemogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htm

Art of the state 10 / 98

Vorgeschichte Das Entscheidungsproblem

Gullivers Reise nach Laputa1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz inder Ars Combinatoria formulierte Idee, auf kombinatorische Weise allemogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htmArt of the state 10 / 98

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.

Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.

David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.

Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.

Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Vorgeschichte Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mitdem fur eine beliebige, im formalen System der Arithmetikformulierte Aussage entschieden werden kann, ob siemathematisch wahr ist.1936 wurden bei zwei Zeitschriften unabhangig Arbeiteneingereicht, die zeigten, dass es in der Arithmetik nichtentscheidbare Probleme gibt. Diese Arbeiten legten nebenbeiGrundlagen fur die spater entstehende Informatik.

Art of the state 13 / 98

Vorgeschichte Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mitdem fur eine beliebige, im formalen System der Arithmetikformulierte Aussage entschieden werden kann, ob siemathematisch wahr ist.

1936 wurden bei zwei Zeitschriften unabhangig Arbeiteneingereicht, die zeigten, dass es in der Arithmetik nichtentscheidbare Probleme gibt. Diese Arbeiten legten nebenbeiGrundlagen fur die spater entstehende Informatik.

Art of the state 13 / 98

Vorgeschichte Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mitdem fur eine beliebige, im formalen System der Arithmetikformulierte Aussage entschieden werden kann, ob siemathematisch wahr ist.1936 wurden bei zwei Zeitschriften unabhangig Arbeiteneingereicht, die zeigten, dass es in der Arithmetik nichtentscheidbare Probleme gibt. Diese Arbeiten legten nebenbeiGrundlagen fur die spater entstehende Informatik.

Art of the state 13 / 98

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 funktionalenProgrammierung ein.

Alan M. Turing.On computable numbers, with an application to theEntscheidungsproblem.Proceedings of the London Mathematical Society, 42:230–265,1936.Turing fuhrte die Universelle Turing-Machine ein und zeigte, dass dasHalteproblem unlosbar ist.

Art of the state 14 / 98

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 15 / 98

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.

Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Funktionale Programmierung

Funktionale Programmierung

Art of the state 17 / 98

Funktionale Programmierung Einfuhrung

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 18 / 98

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

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

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

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

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

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

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

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.

Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamischEinfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.Art of the state 21 / 98

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().

Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.

Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Funktionale Programmierung Fraktales SQL

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 23 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLObfuscated Query contest

Selects konnenuberall Selectsenthalten und essind nur Einzeilermoglich.

Doch werdenkeine Werteverandert.Und Funktionenhaben keineSeiteneffekte.

In den Nesseln eines fraktalen Ungeheuers?

WITH LatestOrders (ID) AS (SELECT MAX(ID)FROM dbo.Orders GROUP BY CustomerID)

SELECTCustomers.∗,Orders.OrderTime AS LatestOrderTime,(SELECT COUNT(∗) FROM dbo.OrderItems

WHERE OrderID IN(SELECT ID FROM dbo.Orders WHERE

CustomerID = Customers.ID))AS TotalItemsPurchased

FROMdbo.Customers INNER JOIN dbo.Orders

ON Customers.ID = Orders.CustomerIDWHERE

Orders.ID IN (SELECT ID FROM LatestOrders)

www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspxArt of the state 24 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLObfuscated Query contest

Selects konnenuberall Selectsenthalten und essind nur Einzeilermoglich.

Doch werdenkeine Werteverandert.

Und Funktionenhaben keineSeiteneffekte.

In den Nesseln eines fraktalen Ungeheuers?

WITH LatestOrders (ID) AS (SELECT MAX(ID)FROM dbo.Orders GROUP BY CustomerID)

SELECTCustomers.∗,Orders.OrderTime AS LatestOrderTime,(SELECT COUNT(∗) FROM dbo.OrderItems

WHERE OrderID IN(SELECT ID FROM dbo.Orders WHERE

CustomerID = Customers.ID))AS TotalItemsPurchased

FROMdbo.Customers INNER JOIN dbo.Orders

ON Customers.ID = Orders.CustomerIDWHERE

Orders.ID IN (SELECT ID FROM LatestOrders)

www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspxArt of the state 24 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLObfuscated Query contest

Selects konnenuberall Selectsenthalten und essind nur Einzeilermoglich.

Doch werdenkeine Werteverandert.Und Funktionenhaben keineSeiteneffekte.

In den Nesseln eines fraktalen Ungeheuers?

WITH LatestOrders (ID) AS (SELECT MAX(ID)FROM dbo.Orders GROUP BY CustomerID)

SELECTCustomers.∗,Orders.OrderTime AS LatestOrderTime,(SELECT COUNT(∗) FROM dbo.OrderItems

WHERE OrderID IN(SELECT ID FROM dbo.Orders WHERE

CustomerID = Customers.ID))AS TotalItemsPurchased

FROMdbo.Customers INNER JOIN dbo.Orders

ON Customers.ID = Orders.CustomerIDWHERE

Orders.ID IN (SELECT ID FROM LatestOrders)

www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspxArt of the state 24 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLNicht das schrecklichste Ungeheuer der Meere

http://commons.wikimedia.org/wiki/File:Millepora_fire_coral.JPG

Art of the state 25 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.

Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.

Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.

Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in InsertsArt of the state 26 / 98

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

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; }

}4Figure 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

Funktionale Programmierung Eine funktionale Berechnung

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 29 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale Berechnungd’hondtsches Hochstzahlverfahren

Das Verfahren nach d’Hondt ist bei den Landtagswahlen inNiedersachsen, im Saarland, in Sachsen und Schleswig-Holsteinmaßgeblich fur die Sitzzuteilung (Zweitstimmen).

Die Stimmen der Parteien werden durch eine Folge von Divisorengeteilt. Die Sitze werden in der Reihenfolge der großten sichergebenen Hochstzahlen zugeteilt.5

Den Sonderfall Stimmengleichheit beim letzten Sitzvernachlassigen wir.

5Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/de/glossar/texte/d_Hondtsche_Sitzverteilung.html

Art of the state 30 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale Berechnungd’hondtsches Hochstzahlverfahren

Das Verfahren nach d’Hondt ist bei den Landtagswahlen inNiedersachsen, im Saarland, in Sachsen und Schleswig-Holsteinmaßgeblich fur die Sitzzuteilung (Zweitstimmen).

Die Stimmen der Parteien werden durch eine Folge von Divisorengeteilt. Die Sitze werden in der Reihenfolge der großten sichergebenen Hochstzahlen zugeteilt.5

Den Sonderfall Stimmengleichheit beim letzten Sitzvernachlassigen wir.

5Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/de/glossar/texte/d_Hondtsche_Sitzverteilung.html

Art of the state 30 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale Berechnungd’hondtsches Hochstzahlverfahren

Das Verfahren nach d’Hondt ist bei den Landtagswahlen inNiedersachsen, im Saarland, in Sachsen und Schleswig-Holsteinmaßgeblich fur die Sitzzuteilung (Zweitstimmen).

Die Stimmen der Parteien werden durch eine Folge von Divisorengeteilt. Die Sitze werden in der Reihenfolge der großten sichergebenen Hochstzahlen zugeteilt.5

Den Sonderfall Stimmengleichheit beim letzten Sitzvernachlassigen wir.

5Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/de/glossar/texte/d_Hondtsche_Sitzverteilung.html

Art of the state 30 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1

1.

10000

2.

6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1

1.

10000

2.

6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000

2.

6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000

5.

3000 7503 4. 3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333

8.

2000 5004 6. 2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333

8.

2000 5004 6. 2500 1500 3755 7. 2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333 8. 2000 5004 6. 2500 1500 3755 7. 2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000

1500

2 3. 5000 5. 3000

750

3 4. 3333 8. 2000

500

4 6. 2500

1500 375

5 7. 2000

1200 300

6

1667 1000 250

7

1429 857 214

8

1250 750 188

Sitze 5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000

1500

2 3. 5000 5. 3000

750

3 4. 3333 8. 2000

500

4 6. 2500

1500 375

5 7. 2000

1200 300

6

1667 1000 250

7

1429 857 214

8

1250 750 188

Sitze 5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.

Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].

Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Funktionale Programmierung Konzepte und Programme

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 33 / 98

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,

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

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen alsArgumente erhalt oder Funktionen als Ergebnis liefert.

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur noch

die Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen alsArgumente erhalt oder Funktionen als Ergebnis liefert.

compose f ◦ g ist die Funktion, mit x 7→ f(g(x) fur alle x.

map map(f, seq) erstellt eine neue Sequenz durch Anwendungder Funktion f auf alle Elemente von seq.

filter filter(test, seq) erstellt eine neue Sequenz, die nur nochdie Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen alsArgumente erhalt oder Funktionen als Ergebnis liefert.

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur nochdie Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen alsArgumente erhalt oder Funktionen als Ergebnis liefert.

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur noch

die Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen alsArgumente erhalt oder Funktionen als Ergebnis liefert.

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur noch

die Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsWeitere BeispieleIn 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

6Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.1. Aufl.. No Starch Press, 2011.

Art of the state 36 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsWeitere BeispieleIn 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

6Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.1. Aufl.. No Starch Press, 2011.

Art of the state 36 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsWeitere BeispieleIn 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

6Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.1. Aufl.. No Starch Press, 2011.

Art of the state 36 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order Functionsim 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 prueftfunction 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] = 5for each (var p in [’A’, ’B’, ’C’]) {

document.write(p + ’:’ + sitzliste (p). length+ ’ ’)}

Art of the state 37 / 98

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsComprehensions

Statt map und filter werden gerne List Comprehensions genommen.Als Bonus erhalt man noch ein ein einfaches Pattern Matching.

list-comprehension.jsvar 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

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

Funktionale Programmierung Konzepte und Programme

Lazy EvaluationGenerator Expressions in JavaScript 1.8 erlauben Lazy Evaluation.

/∗∗ script type =”application / javascript ;version=1.8 ∗∗/

// ALLE natuerlichen Zahlenfunction nat() {

var i = 0;while (true) {

yield i ;i+=1;

}}

// ALLE Zahlen , deren Quadrate groesser als 1000 sindvar q1000 = (i for each (i in nat() ) if ( i∗ i > 1000));

// Die erste Zahl, deren Quadrat groesser als 1000 ist, ist 32document.write(q1000.next())

Art of the state 40 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonSeiltanzer Pierre

Dieses Beispiel kommt aus dem Buch Learn you a Haskell for GreatGood von Miran Lipovaca7 und ist auch online verfugbar.http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line

Das Buch ist unbedingt empfehlenswert.

7Lipovaca, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.Aufl.. No Starch Press, 2011.

Art of the state 41 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonSeiltanzer Pierre

Dieses Beispiel kommt aus dem Buch Learn you a Haskell for GreatGood von Miran Lipovaca7 und ist auch online verfugbar.http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line

Das Buch ist unbedingt empfehlenswert.

7Lipovaca, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.Aufl.. No Starch Press, 2011.

Art of the state 41 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.

Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nichtdurch Seiteneffekte aus der Ruhe bringen lassen.

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nichtdurch Seiteneffekte aus der Ruhe bringen lassen.

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nichtdurch Seiteneffekte aus der Ruhe bringen lassen.

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nichtdurch Seiteneffekte aus der Ruhe bringen lassen.

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nichtdurch Seiteneffekte aus der Ruhe bringen lassen.

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonKontrollierter Umgang mit Seiteneffekten in Haskell

Weder Haskell noch Pierre lassen sich aus der Ruhe bringen.

Pierre2.hsroutine2 :: Maybe Poleroutine2 = do

start <− return (0, 0)pole0 <− landLeft 1 startpole1 <− landRight 4 pole0pole2 <− landLeft 2 pole1landLeft 1 pole2

Pierre3.hsroutine3 = return (0,0) >>= landLeft 1 >>= landRight 4 >>= landLeft 2

>>= landLeft 1

Art of the state 44 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonKontrollierter Umgang mit Seiteneffekten in HaskellWeder Haskell noch Pierre lassen sich aus der Ruhe bringen.

Pierre2.hsroutine2 :: Maybe Poleroutine2 = do

start <− return (0, 0)pole0 <− landLeft 1 startpole1 <− landRight 4 pole0pole2 <− landLeft 2 pole1landLeft 1 pole2

Pierre3.hsroutine3 = return (0,0) >>= landLeft 1 >>= landRight 4 >>= landLeft 2

>>= landLeft 1

Art of the state 44 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonKontrollierter Umgang mit Seiteneffekten in HaskellWeder Haskell noch Pierre lassen sich aus der Ruhe bringen.

Pierre2.hsroutine2 :: Maybe Poleroutine2 = do

start <− return (0, 0)pole0 <− landLeft 1 startpole1 <− landRight 4 pole0pole2 <− landLeft 2 pole1landLeft 1 pole2

Pierre3.hsroutine3 = return (0,0) >>= landLeft 1 >>= landRight 4 >>= landLeft 2

>>= landLeft 1

Art of the state 44 / 98

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonWas war jetzt der Trick mit der Banane?

type Birds = Inttype Pole = (Birds, Birds)

landLeft :: Birds −> Pole −> Maybe PolelandLeft n ( left , right )| abs (( left + n) − right ) < 4 = Just ( left + n, right )| otherwise = Nothing

landRight :: Birds −> Pole −> Maybe PolelandRight n ( left , right )| abs ( left − ( right + n)) < 4 = Just ( left , right + n)| otherwise = Nothing

banana :: Pole −> Maybe Polebanana = Nothing

Art of the state 45 / 98

Funktionale Programmierung Konzepte und Programme

Die Antwort auf eine andere offene Frage

FrageWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

AntwortDas geht nicht, aber die funktionale Programmierung verfugt uberMittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state 46 / 98

Funktionale Programmierung Konzepte und Programme

Die Antwort auf eine andere offene Frage

FrageWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

AntwortDas geht nicht, aber die funktionale Programmierung verfugt uberMittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state 46 / 98

Funktionale Programmierung Konzepte und Programme

Die Antwort auf eine andere offene Frage

FrageWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

AntwortDas geht nicht, aber die funktionale Programmierung verfugt uberMittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state 46 / 98

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 47 / 98

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

Na, habt ihrs rausgefunden?

Richtig, jede Reihe kann einen eigenen Zettel ausfullen.Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolgezusammenheften.Nachstes Mal!

Art of the state 48 / 98

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

Na, habt ihrs rausgefunden?Richtig, jede Reihe kann einen eigenen Zettel ausfullen.

Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolgezusammenheften.Nachstes Mal!

Art of the state 48 / 98

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

Na, habt ihrs rausgefunden?Richtig, jede Reihe kann einen eigenen Zettel ausfullen.Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolgezusammenheften.

Nachstes Mal!

Art of the state 48 / 98

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

Na, habt ihrs rausgefunden?Richtig, jede Reihe kann einen eigenen Zettel ausfullen.Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolgezusammenheften.Nachstes Mal!

Art of the state 48 / 98

Lambda Expressions in Java 8

Lambda Expressions in Java 8

Art of the state 49 / 98

Lambda Expressions in Java 8 Motivation

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 50 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Interne IterationSELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Interne IterationSELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Interne IterationSELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Interne IterationSELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Collections sind ein idealer Kandidat fur parallele Verarbeitung.

Logik gehort in die Library (vgl. SQL)

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Collections sind ein idealer Kandidat fur parallele Verarbeitung.Logik gehort in die Library (vgl. SQL)

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Collections sind ein idealer Kandidat fur parallele Verarbeitung.Logik gehort in die Library (vgl. SQL)

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Collections sind ein idealer Kandidat fur parallele Verarbeitung.Logik gehort in die Library (vgl. SQL)

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Collections sind ein idealer Kandidat fur parallele Verarbeitung.Logik gehort in die Library (vgl. SQL)

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 53 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Disclaimer

Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zuklaren, andere konnen das besser. Insbesondere verweise ich aufMaurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen vonBrian 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

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Disclaimer

Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zuklaren, andere konnen das besser. Insbesondere verweise ich aufMaurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen vonBrian 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

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream in Action

Parametrisierung mit anonymen Klassenint 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();}

8Cannot refer to a non-final variable partei inside an inner class defined in adifferent method

Art of the state 56 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream in Action

Parametrisierung mit anonymen Klassenint 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();}

8Cannot refer to a non-final variable partei inside an inner class defined in adifferent method

Art of the state 56 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream in Action

Parametrisierung mit anonymen Klassenint 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();}

8Cannot refer to a non-final variable partei inside an inner class defined in adifferent method

Art of the state 56 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.

Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.

Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.

Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.

Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.

Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.

Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).

Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Lambda Expressions in Java 8 Closures

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 59 / 98

Lambda Expressions in Java 8 Closures

ClosuresDefinition

Anonyme Funktionen wurden 1936 von Alonzo Church mit demΛ-Kalkul eingefuhrt. Eine anonyme Funktion kanndefiniert und aufgerufen werden, ohne an einen Identifiergebunden zu sein.

Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closureist eine anonyme Funktion, die nicht nur Zugriff auf ihrenunmittelbaren lexical scope hat, sondern auch auf daslexical environment, aus dem sie aufgerufen wird. Ihrefreien Variablen werden in dem aufrufenden Kontextgebunden (closed). Daher der Name Closure.

Art of the state 60 / 98

Lambda Expressions in Java 8 Closures

ClosuresDefinition

Anonyme Funktionen wurden 1936 von Alonzo Church mit demΛ-Kalkul eingefuhrt. Eine anonyme Funktion kanndefiniert und aufgerufen werden, ohne an einen Identifiergebunden zu sein.

Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closureist eine anonyme Funktion, die nicht nur Zugriff auf ihrenunmittelbaren lexical scope hat, sondern auch auf daslexical environment, aus dem sie aufgerufen wird. Ihrefreien Variablen werden in dem aufrufenden Kontextgebunden (closed). Daher der Name Closure.

Art of the state 60 / 98

Lambda Expressions in Java 8 Closures

ClosuresDefinition

Anonyme Funktionen wurden 1936 von Alonzo Church mit demΛ-Kalkul eingefuhrt. Eine anonyme Funktion kanndefiniert und aufgerufen werden, ohne an einen Identifiergebunden zu sein.

Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closureist eine anonyme Funktion, die nicht nur Zugriff auf ihrenunmittelbaren lexical scope hat, sondern auch auf daslexical environment, aus dem sie aufgerufen wird. Ihrefreien Variablen werden in dem aufrufenden Kontextgebunden (closed). Daher der Name Closure.

Art of the state 60 / 98

Lambda Expressions in Java 8 Closures

Closuresin Programmiersprachen

Die ersten Programmiersprachen mit Closures

Name Jahr Autor Typisierung Paradigma

Smalltalk 1972Alan Kay, Dan Ingalls

dynamischobjekt-

und Adele Goldberg orientiert

Scheme 1975Guy L. Steele und

dynamisch funktionalGerald Jay Sussman

Und seitdem in vielen, vielen anderen Sprachen . . .

Art of the state 61 / 98

Lambda Expressions in Java 8 Closures

Closuresin Programmiersprachen

Die ersten Programmiersprachen mit Closures

Name Jahr Autor Typisierung Paradigma

Smalltalk 1972Alan Kay, Dan Ingalls

dynamischobjekt-

und Adele Goldberg orientiert

Scheme 1975Guy L. Steele und

dynamisch funktionalGerald Jay Sussman

Und seitdem in vielen, vielen anderen Sprachen . . .

Art of the state 61 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8

Java: Closures mit anonymen KlassenPredicate<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 Funktionenint sum = wahlkreise.stream()

. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();

Art of the state 62 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Java: 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 Funktionenint sum = wahlkreise.stream()

. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();

Art of the state 62 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Java: 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 Funktionenint sum = wahlkreise.stream()

. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();

Art of the state 62 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Funktionale Interfaces

Was haben diese Interfaces gemeinsam?java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing.event.ChangeListener

Art of the state 63 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme 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. DerJava-Compiler lernt zunehmend Typ-Inferenz.

Art of the state 64 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme 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. DerJava-Compiler lernt zunehmend Typ-Inferenz.

Art of the state 64 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme 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. DerJava-Compiler lernt zunehmend Typ-Inferenz.

Art of the state 64 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme Funktionen sind dunnhautige Chamaleons

Anonyme Funktionen und anonyme Klassen haben Zugriff aufeffectively final Variablen des lexical environments.Im Gegensatz zu anonymen Klassen haben anonyme Funktionenkeine eigene Identitat. Sie stehen in keiner Vererbungshierarchie,sie bringen keinen eigenen Scope mit. Selbst das Schlusselwortthis ist das this ihres lexical environments.

Art of the state 65 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme Funktionen sind dunnhautige Chamaleons

Anonyme Funktionen und anonyme Klassen haben Zugriff aufeffectively final Variablen des lexical environments.

Im Gegensatz zu anonymen Klassen haben anonyme Funktionenkeine eigene Identitat. Sie stehen in keiner Vererbungshierarchie,sie bringen keinen eigenen Scope mit. Selbst das Schlusselwortthis ist das this ihres lexical environments.

Art of the state 65 / 98

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme Funktionen sind dunnhautige Chamaleons

Anonyme Funktionen und anonyme Klassen haben Zugriff aufeffectively final Variablen des lexical environments.Im Gegensatz zu anonymen Klassen haben anonyme Funktionenkeine eigene Identitat. Sie stehen in keiner Vererbungshierarchie,sie bringen keinen eigenen Scope mit. Selbst das Schlusselwortthis ist das this ihres lexical environments.

Art of the state 65 / 98

Lambda Expressions in Java 8 Closures

Zum Aufwarmenlambda-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(); // closureFunction<String, Integer> f2 = String :: length; // method referenceshow(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

Lambda Expressions in Java 8 Closures

Spielraum fur Parallelisierung

Interne Iteration mit SQLSELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Interne Iteration mit Java 8int sum =wahlkreise.parallelStream(). filter (wk−>"A".equals(wk.partei)). mapToInt (wk−>wk.stimmen). sum();

Art of the state 67 / 98

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

Lambda Expressions in Java 8 Closures

Abfragen zur Wahl im LINQ Stillambda-8-b117 vom 21.11.2013

import java. util .∗;import java. util . function .∗;import java. util .stream.Collectors;import 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

Lambda Expressions in Java 8 Closures

Codeblock in Actionlambda-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

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 71 / 98

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

Art of the state 72 / 98

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace Bielefeld

HuHuHu

Art of the state 73 / 98

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Funktionale Software-Architektur und Java

FunktionaleSoftware-Architektur und Java

Art of the state 75 / 98

Funktionale Software-Architektur und Java Motivation

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 76 / 98

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .

Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,

Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,

mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.

Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.

Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.

Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.Art of the state 78 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state 79 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state 79 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.

Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state 79 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.

Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state 79 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state 79 / 98

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state 79 / 98

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 81 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.

Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.

Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten Monolithen

Wir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.

Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.

Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.

Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.

Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.

Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.

Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective Java

Effective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.

Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,

weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).

Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.

Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.

Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.

Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.

Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln?

Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.

Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.

Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.

Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.

Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.

Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.

Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).

Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.

Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494

http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494

http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494

http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?

Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.

Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.

Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.

Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 91 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.

In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.

Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.

Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.

Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.

Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.

Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.

Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.

Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.

Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.

In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Am Lambdagate

Muta

bor

Art of the state 95 / 98

Am Lambdagate

Mu

tabor

Art of the state 95 / 98

Am Lambdagate

Muta

bor

Art of the state 95 / 98

Am Lambdagate

Muta

bor

Art of the state 95 / 98

Am Lambdagate

Art of the state 96 / 98

Am Lambdagate

Art of the state 97 / 98

Am Lambdagate

Art of the state 98 / 98