0
Jenseits von Fakultät und Fibonacci:Architektur Funktionaler ProgrammeDr. Klaus AlfertDr. Bernd Löchner                   ...
Warum istFunktionale Programmierungin vieler Munde?                             Folie 3                             Januar...
Sun T 2 »Niagara 2« 2007, 8 Cores × 8 Threads
Intel i7 »Nehalem« 2008, 4 Cores × 2 Threads
IBM POWER 7, 2010, 8 Cores × 4 Threads
Oracle T 3 »Rainbow Falls« 2010, 16 Cores × 8 Threads
Intel Cloud Computing on a Chip 2009, 48 Cores (Prototyp)
Warum ist Nebenläufigkeitmit Objekten schwierig?                            Folie 9                            Januar 2011...
Objekte haben eine Identität           :2                  :3                         :1
Objekte haben einen (lokalen) Zustand           :2                           :3                        :1
Objekte haben Verhalten           :2                  :3                          :1
Multithreading erfordert Locks           :2                    :3                         :1
Ein hoher Grad an Nebenläufigkeit wirdleicht unübersichtlich
Ein hoher Grad an Nebenläufigkeit wirdleicht unübersichtlich
Wie kann funktionaleProgrammierung hier helfen?
Was unterscheidet FPvon OOP?                       Folie 17                       Januar 2011                       Dr. Kl...
Zu den Programmbeispielen               Beispiele in Haskell & Erlang               •   Haskell ist puristisch elegant    ...
A LISP programmer knowsthe value of everything, but        the cost of nothing.             –Alan J. Perlis Epigrams of Pr...
Werte, Variablen, VeränderlicheWas sind imperative Variablen?•   Namen für Adressen von Speicherzellen•   Abstraktionsnive...
Objekte versus Werte              :1   42                      :1     42                               CopyGleich, aber   ...
© Zühlke 2011
Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Fakultät ist für Kinder – Hyper-Fakultät...
Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Imperativ: Zuweisungsorientiert   Rekurs...
Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Imperativ: Zuweisungsorientiert   Berech...
Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Imperativ: Zuweisungsorientiert   Rekurs...
Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Berechnung: hfac(3)                   10...
Komplexe Werte sind oft baumartig                                   A       B          C          D{    vorname : „Martin“...
Wie ändert man komplexe Werte?                                   24               15                                  28  ...
Update: Ersetze 41 durch 42                 Alter Baum                              Neuer Baum                            ...
Pattern Matchingsum ([])       -> 0;sum ([X | Xs]) -> X + sum (Xs).abs (N) when N >= 0 -> N;abs (N)             -> -N.leng...
Higher-order Funktionen, Polymorphieund Lambda-Ausdrückemap :: (a -> b) -> [a] -> [b]map f []     = []map f (x:xs) = f x :...
Algebraische Datenstrukturendata Tree a = Empty            | Node (Tree a) a (Tree a)mapTree :: (a -> b) -> Tree a -> Tree...
Erlang hat Closures – und Clojure auch(und Scala, F#, …)mk_mul_abs (M) ->  fun (N) when N > 0 -> M * N;           mk_mul_a...
Haskell erlaubt Partial Applicationparabola a b c x = a*x^2 + b*x + cfun a   b    c   x            fun a                  ...
Programmierung im GroßenVerantwortlichkeiten bündeln                                                           Werteorient...
Funktionale Programmierung =  Werteorientierung &  Higher-order Funktionen
Welche Auswirkungen hatFunktionale Programmierung aufArchitektur und Design?
Eoin Wood: Softwarearchitecture is the set ofdesign decisions which, ifmade incorrectly, may causeyour project to be cance...
Grady Booch: Architecture representsthe significant design decisions thatshape a system, where significant ismeasured by c...
ANSI/IEEE 1471-2000The fundamental organization of asystem, embodied in its components,their relationships to each other a...
ANSI/IEEE 1471-2000The fundamental organization of asystem, embodied in its components,their relationships to each other a...
High-LevelArchitektur
Architektur auf Marketing-Niveau:Ein typisches „Marchitecture“-Diagramm                                                CRM...
Enterprise Architektur: Funktionalität bleibt lokal,Kommunikation über Werte                                      System i...
High Level Architektur:Grobzerlegung bleibt bestehenTreiber:•   Primär fachliche Zerlegung in Aufgaben- und    Verantwortl...
Mittlere Architektur
Mittlere Architektur:Geprägt von nicht-funktionalen Systemanforderungen                  Funktionalität   Bedienbarkeit   ...
Enterprise Java
Ein Blick auf Enterprise JavaHistorisch:•   Transaktionsmonitor für verteilte Objekte•   Anbindung an (Legacy)-Datenbanken...
Struktur: N-Tier-Schichtenarchitektur                                        http://download.oracle.com/javaee/6/tutorial/...
Einfluss von JavaEverything is an Object•   Auch für Dinge, die eigentlich keine Objekte sind    (Stateless Session Beans,...
Erlang/OTP             To Iterate is Human, to Recurse Divine                                 – L. Peter Deutsch
Ein Blick auf Erlang/OTPHistorisch:•   Soft-Realtime Systeme, PBX, TelcoAusgelegt für•   (sehr hohe) Zuverlässigkeit und F...
OTP besteht aus lose gekoppelten „Anwendungen“ …  Anwendung          Web Server                                   crypto  ...
… und aus Supervisor-Prozesshierarchien                   Anwendung                   Supervisor        Worker            ...
Einfluss von Erlang auf OTPErlang stellt die Basismechanismen bereit•   Pure Funktionen, Datenstrukturen sind immer Werte•...
Mittlere Architektur:Domäne der Blue-Print-ArchitekturenStandardarchitektur für eine bestimmte Systemklasse•   Anwendungsd...
KleinteiligeArchitektur
© Zühlke 2011
Peter Norvig:Design Patterns in Dynamic Languages(1998)Analyse der Design Patterns aus Lisp/Dylan-Sicht•   GoF verwendet C...
GoF Command Pattern© Zühlke 2011                http://en.wikipedia.org/wiki/Command_pattern
Ein Command ist eine Closureshutdown_command(Receiver) ->  fun() -> Receiver ! {shutdown, now} end.@Client:MyMachine = …,C...
Commands mit Undo sind Closures mitPattern Matchingstart_command(Receiver) ->  fun(do)   -> Receiver ! {start, now};     (...
GoF Visitor Pattern       “Languages that support double- or multiple                      dispatch lessen the need for th...
Composite = Algebraischer DatentypVisitor = Durchlauf der Strukturdata CarElement =   Car [CarElement]          Die Java I...
Charakteristik der GoF Patterns (1)Creational Patterns•   Factories und Builder lösen allgemeine Probleme,    unabhängig v...
Charakteristik der GoF Patterns (2)Behavioral Patterns• Können  durch Lambdas, Pattern Matching, …  anders realisiert werd...
Funktionale Patterns                                                     Folie 69                                         ...
Standardisierte RekursionListenfunktionen in Haskell:sum      []     = 0                sum     = foldList 0 (+)sum      (...
Standardisierte RekursionMit foldList können viele Listenfunktionen implementiert werdenlength []     = 0length (x:xs) = 1...
Standardisierte Rekursion fürAlgebraische Datentypen Generalisiere für andere Datenstrukturendata Tree a = Empty         ...
Auch im Visitor findet sich strukturierteRekursiondata CarElement =   Car [CarElement]                |   Wheel String    ...
Recursion is the goto offunctional programming.            –Erik Meijer                   © Zühlke 2011
Leichtgewichtige ThreadsErlang Prozesse sind nebenläufige, meist rekursive FunktionenCalcProc = spawn(fun() -> calc_loop(0...
Nebenläufige Endliche Automaten durch Prozesse,Funktionen und Messaging statt State-Patternidle() ->  receive    {Number, ...
Lazy Evaluation undunendliche DatenstrukturenLazy Evaluation:(Teil-)Ausdrücke werden nur ausgewertet, wenn siebenötigt wer...
Lazy Evaluation undunendliche DatenstrukturenMit Lazy Evaluation werden (potentiell) unendlicheDatenstrukturen möglichnats...
Pipes and FiltersDie Mächtigkeit der Unix-Shell kommt durch Pipes&Filters Konstruktionencat *.txt | tr –sc A-Za-z n | tr a...
Map/Reduce                                      f(x1)                      x1                                      f(x2)  ...
Was es sonst noch gibtEine Reihe weiterer Themen müssen wir auslassen•   Memoization•   Kombinatoren•   Monaden•   Macros•...
Fazit
Funktionale ProgrammierungAndersartiger Programmierstil•   Neue Abstraktionen und Kombinationsmöglichkeiten•   Andere Zerl...
Auswirkungen auf ArchitekturVieles bleibt gleich•   Architekturtreiber sind weiterhin die Qualitätsattribute•   Patterns w...
Oop2011 jenseits von fakultät und_fibunacci_alfert_loechner
Oop2011 jenseits von fakultät und_fibunacci_alfert_loechner
Upcoming SlideShare
Loading in...5
×

Oop2011 jenseits von fakultät und_fibunacci_alfert_loechner

424

Published on

Funktionale Programmierung bietet viele Möglichkeiten, die Herausforderungen moderner Multi-Core-Rechner einfacher als mit klassischer OO-Programmierung zu bewältigen. Dadurch verlieren Objekte ihre dominante Rolle und damit die klassische Design- und Architekturmuster einen Teil ihrer Basis. Wir zeigen, welche Muster nicht mehr benötigt werden, welche in abgewandelter Form weiterhin bestehen und welche neuen Muster und Konstruktionsprinzipien wichtig und hilfreich sind. Die Grundideen können auch in der OO-Welt profitabel eingesetzt werden.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
424
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Oop2011 jenseits von fakultät und_fibunacci_alfert_loechner"

  1. 1. Jenseits von Fakultät und Fibonacci:Architektur Funktionaler ProgrammeDr. Klaus AlfertDr. Bernd Löchner Folie 1 Januar 2011 Dr. Klaus Alfert Dr. Bernd Löchner © Zühlke 2011
  2. 2. Warum istFunktionale Programmierungin vieler Munde? Folie 3 Januar 2011 Dr. Klaus Alfert Dr. Bernd Löchner © Zühlke 2011
  3. 3. Sun T 2 »Niagara 2« 2007, 8 Cores × 8 Threads
  4. 4. Intel i7 »Nehalem« 2008, 4 Cores × 2 Threads
  5. 5. IBM POWER 7, 2010, 8 Cores × 4 Threads
  6. 6. Oracle T 3 »Rainbow Falls« 2010, 16 Cores × 8 Threads
  7. 7. Intel Cloud Computing on a Chip 2009, 48 Cores (Prototyp)
  8. 8. Warum ist Nebenläufigkeitmit Objekten schwierig? Folie 9 Januar 2011 Dr. Klaus Alfert Dr. Bernd Löchner © Zühlke 2011
  9. 9. Objekte haben eine Identität :2 :3 :1
  10. 10. Objekte haben einen (lokalen) Zustand :2 :3 :1
  11. 11. Objekte haben Verhalten :2 :3 :1
  12. 12. Multithreading erfordert Locks :2 :3 :1
  13. 13. Ein hoher Grad an Nebenläufigkeit wirdleicht unübersichtlich
  14. 14. Ein hoher Grad an Nebenläufigkeit wirdleicht unübersichtlich
  15. 15. Wie kann funktionaleProgrammierung hier helfen?
  16. 16. Was unterscheidet FPvon OOP? Folie 17 Januar 2011 Dr. Klaus Alfert Dr. Bernd Löchner © Zühlke 2011
  17. 17. Zu den Programmbeispielen Beispiele in Haskell & Erlang • Haskell ist puristisch elegant • Erlang hat Industrial-Strength Die Beispiele sind aber alle übertragbar in andere funktionaleF# Programmiersprachen. © Zühlke 2011
  18. 18. A LISP programmer knowsthe value of everything, but the cost of nothing. –Alan J. Perlis Epigrams of Programming © Zühlke 2011
  19. 19. Werte, Variablen, VeränderlicheWas sind imperative Variablen?• Namen für Adressen von Speicherzellen• Abstraktionsniveau: Assembler x 42• Objekte haben eine Identität: Entspricht einer Adresse von SpeicherzellenWas sind funktionale Variablen?• Namen für Werte: „Sei x beliebig, aber fest“• Variablen werden an Werte „gebunden“ x• Abstraktionsniveau: Mathematik 42• Notwendig: Effiziente Abbildung auf Speicherzellen durch Laufzeitsystem © Zühlke 2011
  20. 20. Objekte versus Werte :1 42 :1 42 CopyGleich, aber Gleich undnicht identisch identisch :2 42 42 Funktionen erzeugen aus alten Werte neue!
  21. 21. © Zühlke 2011
  22. 22. Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Fakultät ist für Kinder – Hyper-Fakultät ist für Erwachsene n H (n)   k k k 1H(n) = 1, 1, 4, 108, 27648, 86400000, 4031078400000,3319766398771200000, 55696437941726556979200000,21577941222941856209168026828800000,215779412229418562091680268288000000000000000,61564384586635053951550731889313964883968000000000000000, … © Zühlke 2011
  23. 23. Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Imperativ: Zuweisungsorientiert Rekursiv: Werteorientierthfac(n): hfac(n)-> r := 1; if n == 0 while n > 0 do then 1 r := r * n^n; else n^n * hfac(n-1) n := n – 1; od return r; © Zühlke 2011
  24. 24. Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Imperativ: Zuweisungsorientiert Berechnung: hfac(3)hfac(n): r := 1; while n > 0 do n 1 0 3 2 r := r * n^n; n := n – 1; od r ? 108 27 1 return r; © Zühlke 2011
  25. 25. Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Imperativ: Zuweisungsorientiert Rekursiv: Werteorientierthfac(n): hfac(n)-> r := 1; if n == 0 while n > 0 do then 1 r := r * n^n; else n^n * hfac(n-1) n := n – 1; od return r; © Zühlke 2011
  26. 26. Rekursion statt Iteration: Hyper-Fakultät(Sloane: A Handbook of Integer Sequences)Berechnung: hfac(3) 108 Rekursiv: Werteorientiert 3 hfac(n)-> n fun if n == 0 if n == 0 then 1 then 1 else n^n * hfac(n-1) hfac(2) else n^n * hfac(n-1) 2 4 fun n if n == 0 then 1 1 else n^n * hfac(n-1) hfac(1) 1 0 fun n fun n if n == 0 1 if n == 0 then 1 then 1 else n^n * hfac(n-1) hfac(0) else n^n * hfac(n-1) © Zühlke 2011
  27. 27. Komplexe Werte sind oft baumartig A B C D{ vorname : „Martin“, nachname : „Mustermann“, anschrift : { strasse : „Hauptstrasse 23“, C1 C2 D1 ort : { plz : „76541“, stadt : „Neustadt“ } }, C21 C22 D11 D12 kurse : [ { id : „Mo1“, title: „Tutorial C#“ }, { id : „Ndo4“, title: „Architektur“ } ]} D111 D112 D121 D122
  28. 28. Wie ändert man komplexe Werte? 24 15 28 5 20 26 35 3 8 18 21 25 27 33 41 update (Tree, Value)  Tree
  29. 29. Update: Ersetze 41 durch 42 Alter Baum Neuer Baum 24 24 15 28 28 5 20 26 35 35 3 8 18 21 25 27 33 41 42 Beide Bäume existieren gleichzeitig!
  30. 30. Pattern Matchingsum ([]) -> 0;sum ([X | Xs]) -> X + sum (Xs).abs (N) when N >= 0 -> N;abs (N) -> -N.length [] = 0length (x:xs) = 1 + length xszip [] _ = []zip _ [] = []zip (x:xs) (y:ys) = (x,y) : zip xs ys © Zühlke 2011
  31. 31. Higher-order Funktionen, Polymorphieund Lambda-Ausdrückemap :: (a -> b) -> [a] -> [b]map f [] = []map f (x:xs) = f x : map f xsmap abs [-2 .. 2]>> [2, 1, 0, 1, 2]map (x -> x*x) [-2 .. 2]>> [4, 1, 0, 1, 4] © Zühlke 2011
  32. 32. Algebraische Datenstrukturendata Tree a = Empty | Node (Tree a) a (Tree a)mapTree :: (a -> b) -> Tree a -> Tree bmapTree f Empty = EmptymapTree f (Node l x r) = Node (mapTree f l) (f x) (mapTree f r)data Color = Green | Red | ...autumn t = mapTree change t where change Green = Red change c = c © Zühlke 2011
  33. 33. Erlang hat Closures – und Clojure auch(und Scala, F#, …)mk_mul_abs (M) -> fun (N) when N > 0 -> M * N; mk_mul_abs M 3 (N) -> M * (-N) fun N end. Ma3 when N > 0 -> M * N;Ma3 = mk_mul_abs (3). M * (-N)lists:map(Ma3, [-2, -1, 0, 1, 2]).>> [6, 3, 0, 3, 6] © Zühlke 2011
  34. 34. Haskell erlaubt Partial Applicationparabola a b c x = a*x^2 + b*x + cfun a b c x fun a 4.2 a*x^2 + b*x + c p1 fun b -2.0 fun c fun x 3.5p1 :: Double -> Double a*x^2 + b*x + cp1 = parabola 4.2 -2.0 3.5y = p1 1.0linear = parabola 0.0l1 = linear 3.0 2.1 © Zühlke 2011
  35. 35. Programmierung im GroßenVerantwortlichkeiten bündeln Werteorientierung und• Module, APIs und Interfaces Higher-order Funktionen• Kontrakte: Daten, Funktionen, Eigenschaften ermöglichen andere Schnittstellen und KontrakteInformation Hiding• Sichtbarkeiten, Namespaces• Implementierungsinterna verbergen Wie in OOP: Benötigt Augenmaß und Disziplin Beispiel: Pattern Matching © Zühlke 2011
  36. 36. Funktionale Programmierung = Werteorientierung & Higher-order Funktionen
  37. 37. Welche Auswirkungen hatFunktionale Programmierung aufArchitektur und Design?
  38. 38. Eoin Wood: Softwarearchitecture is the set ofdesign decisions which, ifmade incorrectly, may causeyour project to be canceled.
  39. 39. Grady Booch: Architecture representsthe significant design decisions thatshape a system, where significant ismeasured by cost of change.
  40. 40. ANSI/IEEE 1471-2000The fundamental organization of asystem, embodied in its components,their relationships to each other andthe environment, and the principlesgoverning its design and evolution.
  41. 41. ANSI/IEEE 1471-2000The fundamental organization of asystem, embodied in its components,their relationships to each other andthe environment, and the principlesgoverning its design and evolution.
  42. 42. High-LevelArchitektur
  43. 43. Architektur auf Marketing-Niveau:Ein typisches „Marchitecture“-Diagramm CRM System Server im Fokus Pricing Logistik DWH Auftrags- verwaltung DB Kunden- verwaltung
  44. 44. Enterprise Architektur: Funktionalität bleibt lokal,Kommunikation über Werte System im Fokus Pricing HTML Logistik Auftrags- verwaltung Kunden- JSON/REST Portal verwaltung Server SOAP SOAP Service Bus AMQP DWH MQ SOAP QuerySet CRM Host DB Server
  45. 45. High Level Architektur:Grobzerlegung bleibt bestehenTreiber:• Primär fachliche Zerlegung in Aufgaben- und Verantwortlichkeitsgebiete• Reflektiert auch die Organisation (Conway’s Law)Konsequenzen• Architektur auf dieser Ebene ist unabhängig von der Implementierungstechnologie• Interna der Komponenten/Subsysteme sind irrelevant• Kommunikation erfolgt über Werte, Funktionen bleiben lokal und werden nicht transportiert © Zühlke 2011
  46. 46. Mittlere Architektur
  47. 47. Mittlere Architektur:Geprägt von nicht-funktionalen Systemanforderungen Funktionalität Bedienbarkeit Zuverlässig- Dokumentation keit Effizienz Machbarkeit Wartbarkeit Portabilität Gliederung gemäß ISO/IEC 9126
  48. 48. Enterprise Java
  49. 49. Ein Blick auf Enterprise JavaHistorisch:• Transaktionsmonitor für verteilte Objekte• Anbindung an (Legacy)-DatenbankenAusgelegt für• Informationssysteme Funktionalität Bedienbarkeit• Hohen Durchsatz Doku-• Skalierbarkeit Zuverläs- mentation sigkeit Machbarkeit Effizienz Wartbarkeit Portabilität © Zühlke 2011
  50. 50. Struktur: N-Tier-Schichtenarchitektur http://download.oracle.com/javaee/6/tutorial/doc/bnaay.html © Zühlke 2011
  51. 51. Einfluss von JavaEverything is an Object• Auch für Dinge, die eigentlich keine Objekte sind (Stateless Session Beans, MDB, Backing Beans, Servlets, Transaktionen)Transparente Remote-Aufrufe (RMI)Thread-Management nur im Container• Das Lock-Model von Java erlaubt keine Komposition von Concurrent LibrariesInterfaces anstatt abstrakter Klassen © Zühlke 2011
  52. 52. Erlang/OTP To Iterate is Human, to Recurse Divine – L. Peter Deutsch
  53. 53. Ein Blick auf Erlang/OTPHistorisch:• Soft-Realtime Systeme, PBX, TelcoAusgelegt für• (sehr hohe) Zuverlässigkeit und Fehlertoleranz• Skalierbarkeit mit massiver Parallelität• Kommunikationssysteme Funktionalität Bedienbarkeit Doku-Anwendungsbeispiele Zuverläs- mentation Effizienz sigkeit Machbarkeit• Diverse Telco-Systeme von Ericsson Wartbarkeit Portabilität• Ejabberd, RabbitMQ, CouchDB © Zühlke 2011
  54. 54. OTP besteht aus lose gekoppelten „Anwendungen“ … Anwendung Web Server crypto odbc gen_tcp uses
  55. 55. … und aus Supervisor-Prozesshierarchien Anwendung Supervisor Worker Supervisor Worker Workerüberwacht
  56. 56. Einfluss von Erlang auf OTPErlang stellt die Basismechanismen bereit• Pure Funktionen, Datenstrukturen sind immer Werte• Nebenläufigkeit durch Prozesse – Prozesse sind referenzierbar  Entitäten im Sinne von Domain Driven Design – Halten lokalen State, teilen sich aber keinen State!• Massive Parallelität durch leichtgewichtige Prozesse und asynchrones Messaging• Monitoring von Prozessen über VM-Grenzen hinaus• Hot-Code Swapping: Updates im laufenden SystemNachbau in Scala: Akka (www.akka.io) © Zühlke 2011
  57. 57. Mittlere Architektur:Domäne der Blue-Print-ArchitekturenStandardarchitektur für eine bestimmte Systemklasse• Anwendungsdomäne und -typ sind relevant• Abgestimmt auf Hardware und InfrastrukturGeprägt von den nicht-funktionalen Anforderungen• Priorisierung und Balancierung der Qualitätsattribute Funktionalität BedienbarkeitDas technisch Machbare bestimmt den Lösungsraum Zuverlässig- Dokumentation• Programmiersprachen keit Machbarkeit Effizienz• Laufzeitsysteme Wartbarkeit Portabilität• Bibliotheken © Zühlke 2011
  58. 58. KleinteiligeArchitektur
  59. 59. © Zühlke 2011
  60. 60. Peter Norvig:Design Patterns in Dynamic Languages(1998)Analyse der Design Patterns aus Lisp/Dylan-Sicht• GoF verwendet C++ und SmalltalkUnterscheidung von Implementierungsebenen• Unsichtbar: Wird von der Sprache abgedeckt• Informell: Wird jedes mal neu implementiert• Formell: Implementierung mit Template oder MacroNorvigs Fazit für die 23 GoF Patterns:• 16 werden deutlich einfacher oder unsichtbar © Zühlke 2011
  61. 61. GoF Command Pattern© Zühlke 2011 http://en.wikipedia.org/wiki/Command_pattern
  62. 62. Ein Command ist eine Closureshutdown_command(Receiver) -> fun() -> Receiver ! {shutdown, now} end.@Client:MyMachine = …,Cmd = shutdown_command(MyMachine),add_action(Cmd, Target), MyMachine@Target: fun Receiver...Cmd(). fun () Receiver ! {shutdown, now} Cmd © Zühlke 2011
  63. 63. Commands mit Undo sind Closures mitPattern Matchingstart_command(Receiver) -> fun(do) -> Receiver ! {start, now}; (undo) -> Receiver ! {shutdown, now} end.@Client MyMachineMyMachine = …, fun ReceiverCmd = start_command(MyMachine), fun (do) Receiver !@Target {start, now}... Cmd (undo)Cmd(do),... Receiver ! {shutdown, now}Cmd(undo). © Zühlke 2011
  64. 64. GoF Visitor Pattern “Languages that support double- or multiple dispatch lessen the need for the Visitor pattern. (CLOS actually supports multiple dispatch).” [GoF: p.339]Ein Composite http://en.wikipedia.org/wiki/Visitor_pattern
  65. 65. Composite = Algebraischer DatentypVisitor = Durchlauf der Strukturdata CarElement = Car [CarElement] Die Java Implementierung bei Wikipedia | Wheel String braucht dafür ca. 100 Zeilen | Body | EnginetoString Body = ["Visit Body"]toString Engine = ["Visit Engine"]toString (Wheel s) = ["Visit Wheel " ++ s]toString (Car es) = concat (map toString es) ++ ["Visit Car"]doCar Body = ["Moving my Body"]doCar Engine = ["Starting my Engine"]doCar (Wheel s) = ["Kicking Wheel " ++ s]doCar (Car es) = concat (map doCar es) ++ ["Starting my Car"]
  66. 66. Charakteristik der GoF Patterns (1)Creational Patterns• Factories und Builder lösen allgemeine Probleme, unabhängig von OO, auch in C, Modula2, Haskell, Erlang• Prototypen und Singletons verschwindenStructural Patterns• Interface-Probleme und -Lösungen sind sprachunabhängig (Facade, Bridge, Adapter, Proxy)• Composite und Decorator werden unsichtbar © Zühlke 2011
  67. 67. Charakteristik der GoF Patterns (2)Behavioral Patterns• Können durch Lambdas, Pattern Matching, … anders realisiert werden.• Einige werden unsichtbar, andere sind nicht immer offensichtlich umzusetzen.Generelle Beobachtung:• Patterns, die auf Objektidentitäten basieren, müssen ganz anders umgesetzt werden. © Zühlke 2011
  68. 68. Funktionale Patterns Folie 69 Januar 2011 Dr. Klaus Alfert Dr. Bernd Löchner http://www.flickr.com/photos/robbie73/ © Zühlke 2011
  69. 69. Standardisierte RekursionListenfunktionen in Haskell:sum [] = 0 sum = foldList 0 (+)sum (x:xs) = x + sum xsproduct [] = 1 product = foldList 1 (*)product (x:xs) = x * product xsallTrue [] = True allTrue = foldList True (&&)allTrue (x:xs) = x && allTrue xsExtrahiere das RekursionsschemafoldList startVal combFct [] = startValfoldList startVal combFct (x:xs) = combFct x (foldList startVal combFct xs) © Zühlke 2011
  70. 70. Standardisierte RekursionMit foldList können viele Listenfunktionen implementiert werdenlength [] = 0length (x:xs) = 1 + length xs length = foldList 0 cFct where cFct x len = 1 + lenmap f [] = []map f (x:xs) = f x : map f xs map f = foldList [] cFct where cFct x ys = f x : ys © Zühlke 2011
  71. 71. Standardisierte Rekursion fürAlgebraische Datentypen Generalisiere für andere Datenstrukturendata Tree a = Empty | Node (Tree a) a (Tree a)foldTree eVal cFct Empty = eValfoldTree eVal cFct (Node l x r) = cFct (foldTree eVal cFct l) x (foldTree eVal cFct r)sumTree = foldTree 0 cFct where cFct sl x sr = sl + x + srmapTree f = foldTree Empty cFct where cFct ml x mr = Node ml (f x) mrheightTree = foldTree 0 cFct where cFct hl x hr = 1 + max hl hr © Zühlke 2011
  72. 72. Auch im Visitor findet sich strukturierteRekursiondata CarElement = Car [CarElement] | Wheel String | Body | Enginevisit :: (CarElement -> a) -> CarElement -> [a]visit f (Car es) = concat (map (visit f) es) ++ [f (Car es)]visit f x = [f x]printCar car = visit toString car where toString Body = "Visit Body" toString Engine = "Visit Engine" toString Wheel s = "Visit Wheel " ++ s toString Car es = "Visit Car" Separation of Concerns © Zühlke 2011
  73. 73. Recursion is the goto offunctional programming. –Erik Meijer © Zühlke 2011
  74. 74. Leichtgewichtige ThreadsErlang Prozesse sind nebenläufige, meist rekursive FunktionenCalcProc = spawn(fun() -> calc_loop(0))calc_loop(Acc) -> NewAcc = receive {mul, X} -> Acc * X; {add, X} -> Acc + X; Auswahl der Nachrichten clear -> 0; durch Pattern Matching {get, Pid} -> Pid ! {result, Acc}, Acc; _IgnoredMsg -> Acc end, calc_loop(NewAcc). Funktioniert dank Tail Call Optimization © Zühlke 2011
  75. 75. Nebenläufige Endliche Automaten durch Prozesse,Funktionen und Messaging statt State-Patternidle() -> receive {Number, incoming} -> incoming off_hook start_ringing(), Idle ringing(Number); off_hook -> start_tone(), dial() end. Ringing other_ Dialringing(Number) -> receive on_hook {Number, off_hook} -> stop_ringing(), on_hook connected(Number); {Number, other_on_hook} -> stop_ringing(), idle() Connected off_hook end. Cesarini/Thompson: Erlang Programming 2009
  76. 76. Lazy Evaluation undunendliche DatenstrukturenLazy Evaluation:(Teil-)Ausdrücke werden nur ausgewertet, wenn siebenötigt werdenhead (x:xs) = xMit Lazy Evaluation gilt:head [42.0, 1.0/0] == 42.0Essentiell, um eigene Kontrollstrukturen zu definierenunless cond x y = if !cond then x else y  Ideal für DSLs © Zühlke 2011
  77. 77. Lazy Evaluation undunendliche DatenstrukturenMit Lazy Evaluation werden (potentiell) unendlicheDatenstrukturen möglichnats = [0 ..]take 5 nats == [0, 1, 2, 3, 4] iterate f n =Wurzel-Berechnung nach Newton-Raphson: [n,f(n),f2(n),f3(n), …]sqrtSequence n = iterate (next n) n where next n x = (x + n/x)/2.0 http://www.flickr.com/photos/robbie73/sqrtSequence 2>> [2.0, 1.5, 1.4166666666666665,1.4142156862745097, 1.4142135623746899,1.414213562373095, 1.414213562373095,1.414213562373095, 1.414213562373095, … © Zühlke 2011
  78. 78. Pipes and FiltersDie Mächtigkeit der Unix-Shell kommt durch Pipes&Filters Konstruktionencat *.txt | tr –sc A-Za-z n | tr a-z A-Z | sort | uniq –c | sort –nr | headAllgemeinprg1 –p1 <arg | prg2 –p2 | prg3 –p3 | prg4 –p4Dies geht auch mit lazy Lists und Funktionskompositionfct4 p4 . fct3 p3 . fct2 p2 . fct1 p1 $ arg Listen als Funktions- Funktions- Partial Transfer- komposition applikation Application Container enspricht Pipe enspricht < Idiomatisch in Haskell © Zühlke 2011
  79. 79. Map/Reduce f(x1) x1 f(x2) x2 reduce  . map f . y = f(x1)  …  f(xn) . . . . f(xn) xn Zusammenfassung Berechnung der (unabhängigen) zum Endergebnis ZwischenergebnisseInspiration für s Map-Reduce-Framework (C++)
  80. 80. Was es sonst noch gibtEine Reihe weiterer Themen müssen wir auslassen• Memoization• Kombinatoren• Monaden• Macros• Typeful Programming• Continuations• Co-Algebraische Konstruktionen• … © Zühlke 2011
  81. 81. Fazit
  82. 82. Funktionale ProgrammierungAndersartiger Programmierstil• Neue Abstraktionen und Kombinationsmöglichkeiten• Andere Zerlegung von Problemen• Andere Denkweisen und IdiomeEinfachere Strukturen machen das Leben leichter• Keine (kaum) Seiteneffekte• Pure Functions• Testen und Parallelität werden sehr viel einfacher © Zühlke 2011
  83. 83. Auswirkungen auf ArchitekturVieles bleibt gleich• Architekturtreiber sind weiterhin die Qualitätsattribute• Patterns werden zur Kommunikation für die Entwickler benötigtKreativität und Augenmaß bleiben zwei wichtigeEigenschaften der Architekten• Gutes Design• Klare Verantwortlichkeiten © Zühlke 2011
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×