Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gang of Many – Funktionale Entwurfsmuster in Scala

Lars Hupel
September 04, 2012

Gang of Many – Funktionale Entwurfsmuster in Scala

Lars Hupel

September 04, 2012
Tweet

More Decks by Lars Hupel

Other Decks in Programming

Transcript

  1. Scala OO-Muster Funktionale Entwurfsmuster Ent·wurfs·mus·ter, das: bewährte Lösungsschablone für wiederkehrende

    Probleme in der Softwarearchitektur und Softwareentwicklung Lars Hupel Gang of Many 4. September 2012 2 / 58
  2. Scala OO-Muster Funktionale Entwurfsmuster Fahrplan Scala, eine hybride Sprache Objektorientierte

    Entwurfsmuster Factory Prototype Adapter Iterator Funktionale Entwurfsmuster Dependency Injection Tail-Rekursion Lars Hupel Gang of Many 4. September 2012 3 / 58
  3. Scala OO-Muster Funktionale Entwurfsmuster Scalas Typsystem Javas Objektorientierung + erweiterte

    Typinferenz Singletons implizite Konversionen und Parameter ... OO-Muster können übernommen werden Lars Hupel Gang of Many 4. September 2012 5 / 58
  4. Scala OO-Muster Funktionale Entwurfsmuster Scalas Typsystem Javas Objektorientierung + erweiterte

    Typinferenz Singletons implizite Konversionen und Parameter ... OO-Muster können übernommen werden Lars Hupel Gang of Many 4. September 2012 5 / 58
  5. Scala OO-Muster Funktionale Entwurfsmuster Summierung à la Scala var total

    = 0 for (doc <- docs) { total += doc.length } total Lars Hupel Gang of Many 4. September 2012 6 / 58
  6. Scala OO-Muster Funktionale Entwurfsmuster Summierung à la Scala var total

    = 0 docs.foreach(doc => total += doc.length) total Lars Hupel Gang of Many 4. September 2012 6 / 58
  7. Scala OO-Muster Funktionale Entwurfsmuster Summierung à la Scala docs.foldLeft(0)((accum, current)

    => accum + current.length ) Lars Hupel Gang of Many 4. September 2012 6 / 58
  8. Scala OO-Muster Funktionale Entwurfsmuster Summierung à la Scala docs.foldLeft(0)(_ +

    _.length) Lars Hupel Gang of Many 4. September 2012 6 / 58
  9. Scala OO-Muster Funktionale Entwurfsmuster Summierung à la Scala (0 /:

    docs)(_ + _.length) Lars Hupel Gang of Many 4. September 2012 6 / 58
  10. Scala OO-Muster Funktionale Entwurfsmuster Summierung à la Scala docs.map(_.length).sum SELECT

    SUM(docs.length) FROM docs Lars Hupel Gang of Many 4. September 2012 6 / 58
  11. Scala OO-Muster Funktionale Entwurfsmuster “Good mathematicians see analogies. Great mathematicians

    see analogies between analogies.” – Stefan Banach Lars Hupel Gang of Many 4. September 2012 7 / 58
  12. Scala OO-Muster Funktionale Entwurfsmuster Factory Problem Abstrakte Objekterzeugung Eigentliches Problem

    Abstraktion über Konstruktoren unmöglich OO-Lösung Interface mit entsprechenden Signaturen Lars Hupel Gang of Many 4. September 2012 8 / 58
  13. Scala OO-Muster Funktionale Entwurfsmuster Factory Problem Abstrakte Objekterzeugung Eigentliches Problem

    Abstraktion über Konstruktoren unmöglich OO-Lösung Interface mit entsprechenden Signaturen Lars Hupel Gang of Many 4. September 2012 8 / 58
  14. Scala OO-Muster Funktionale Entwurfsmuster Factory Problem Abstrakte Objekterzeugung Eigentliches Problem

    Abstraktion über Konstruktoren unmöglich OO-Lösung Interface mit entsprechenden Signaturen Lars Hupel Gang of Many 4. September 2012 8 / 58
  15. Scala OO-Muster Funktionale Entwurfsmuster Factory in Scala type FictionFactory[T <:

    Fiction] = (Int, String) => T val sciFi: FictionFactory[SciFi] = new SciFi(true, _, _) Lars Hupel Gang of Many 4. September 2012 10 / 58
  16. Scala OO-Muster Funktionale Entwurfsmuster Factory in Scala Problem Wie organisiert

    man die Factories? Lösungsidee Als Implicits. Aber wo? Zentrales Objekt? Lars Hupel Gang of Many 4. September 2012 11 / 58
  17. Scala OO-Muster Funktionale Entwurfsmuster Factory in Scala Problem Wie organisiert

    man die Factories? Lösungsidee Als Implicits. Aber wo? Zentrales Objekt? Lars Hupel Gang of Many 4. September 2012 11 / 58
  18. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Implicit Scope oder: Wo sucht

    der Compiler nach Implicits? Scala Language Specification §7.2 1. importierte Bezeichner 2. aus den Companions von: bei einem Typen T[A, B, C, ...]: T, A, B, ... bei einem Typen A with B with ...: A, B, ... Lars Hupel Gang of Many 4. September 2012 12 / 58
  19. Scala OO-Muster Funktionale Entwurfsmuster Factory in Scala Problem Wie organisiert

    man die Factories? Lösung Als Implicits in Companions. object SciFi { implicit def factory: FictionFactory[SciFi] = // ... } implicitly[FictionFactory[SciFi]] Lars Hupel Gang of Many 4. September 2012 13 / 58
  20. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Context Bounds Scala vor 2.8

    def apply[T](implicit ev: Ordering[T]) = // ... Scala seit 2.8 def apply[T : Ordering] = // ... Lars Hupel Gang of Many 4. September 2012 14 / 58
  21. Scala OO-Muster Funktionale Entwurfsmuster Factory in Scala Verwendung Java <T>

    String doSomething( Factory<T> factory, int nTimes ); Scala def doSomething[T : Factory](nTimes: Int) Lars Hupel Gang of Many 4. September 2012 15 / 58
  22. Scala OO-Muster Funktionale Entwurfsmuster Factory in Scala Evaluation Vorteile Factory

    = Funktion beliebig zusammensetzbar weniger Boilerplate Lars Hupel Gang of Many 4. September 2012 16 / 58
  23. Scala OO-Muster Funktionale Entwurfsmuster Prototype Problem Erzeugung von gleichartigen Objekten

    OO-Lösung Object clone(); Lars Hupel Gang of Many 4. September 2012 17 / 58
  24. Scala OO-Muster Funktionale Entwurfsmuster Prototype Problem Erzeugung von gleichartigen Objekten

    OO-Lösung Object clone(); Lars Hupel Gang of Many 4. September 2012 17 / 58
  25. Scala OO-Muster Funktionale Entwurfsmuster Prototype clone hat in klassischer OOP-Modellierung

    mehrere Probleme: “self type” mutable state Lars Hupel Gang of Many 4. September 2012 18 / 58
  26. Scala OO-Muster Funktionale Entwurfsmuster Prototype clone hat in klassischer OOP-Modellierung

    mehrere Probleme: “self type” mutable state Lars Hupel Gang of Many 4. September 2012 18 / 58
  27. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types Naive Lösung trait

    Item { def copy: Item } class FluxCapacitor extends Item { def copy = new FluxCapacitor } def mkCopy[T <: Item](item: T) = item.copy mkCopy hat Typ Item Lars Hupel Gang of Many 4. September 2012 19 / 58
  28. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types Naive Lösung trait

    Item { def copy: Item } class FluxCapacitor extends Item { def copy = new FluxCapacitor } def mkCopy[T <: Item](item: T) = item.copy mkCopy hat Typ Item Lars Hupel Gang of Many 4. September 2012 19 / 58
  29. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types Lösung mit Dependent

    Types trait Item { def copy: this.type } class FluxCapacitor extends Item { def copy = new FluxCapacitor } def mkCopy[T <: Item](item: T) = item.copy kompiliert nicht Lars Hupel Gang of Many 4. September 2012 19 / 58
  30. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types Lösung mit Dependent

    Types trait Item { def copy: this.type } class FluxCapacitor extends Item { def copy = new FluxCapacitor } def mkCopy[T <: Item](item: T) = item.copy kompiliert nicht Lars Hupel Gang of Many 4. September 2012 19 / 58
  31. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types Gängige Lösung trait

    Item { type Self <: Item def copy: Self } class FluxCapacitor extends Item { type Self = FluxCapacitor def copy = new FluxCapacitor } def mkCopy[T <: Item](item: T) = item.copy besser, aber immer noch Boilerplate Lars Hupel Gang of Many 4. September 2012 19 / 58
  32. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types Gängige Lösung trait

    Item { type Self <: Item def copy: Self } class FluxCapacitor extends Item { type Self = FluxCapacitor def copy = new FluxCapacitor } def mkCopy[T <: Item](item: T) = item.copy besser, aber immer noch Boilerplate Lars Hupel Gang of Many 4. September 2012 19 / 58
  33. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types trait GenSeqViewLike[ +A,

    +Coll, +This <: GenSeqView[A, Coll] with GenSeqViewLike[A, Coll, This] ] extends GenSeq[A] with GenSeqLike[A, This] with GenIterableView[A, Coll] with GenIterableViewLike[A, Coll, This] Lars Hupel Gang of Many 4. September 2012 20 / 58
  34. Scala OO-Muster Funktionale Entwurfsmuster Exkurs: Self types trait GenSeqViewLike[ +A,

    +Coll, +This <: GenSeqView[A, Coll] with GenSeqViewLike[A, Coll, This] ] extends GenSeq[A] with GenSeqLike[A, This] with GenIterableView[A, Coll] with GenIterableViewLike[A, Coll, This] Lars Hupel Gang of Many 4. September 2012 20 / 58
  35. Scala OO-Muster Funktionale Entwurfsmuster Prototype clone hat in klassischer OOP-Modellierung

    mehrere Probleme: “self type” mutable state Lars Hupel Gang of Many 4. September 2012 21 / 58
  36. Scala OO-Muster Funktionale Entwurfsmuster Prototype clone hat in klassischer OOP-Modellierung

    mehrere Probleme: “self type” mutable state Lars Hupel Gang of Many 4. September 2012 21 / 58
  37. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Was ist

    eine Kopie? Kopiertes Objekt ... referenziert die selben Objekte? referenziert Kopien auf die Objekte? ist unabhängig? hat noch den gleichen State? Lars Hupel Gang of Many 4. September 2012 22 / 58
  38. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Was ist

    eine Kopie? Kopiertes Objekt ... referenziert die selben Objekte? referenziert Kopien auf die Objekte? ist unabhängig? hat noch den gleichen State? Lars Hupel Gang of Many 4. September 2012 22 / 58
  39. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Was ist

    eine Kopie? Kopiertes Objekt ... referenziert die selben Objekte? referenziert Kopien auf die Objekte? ist unabhängig? hat noch den gleichen State? Lars Hupel Gang of Many 4. September 2012 22 / 58
  40. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Was ist

    eine Kopie? Kopiertes Objekt ... referenziert die selben Objekte? referenziert Kopien auf die Objekte? ist unabhängig? hat noch den gleichen State? Lars Hupel Gang of Many 4. September 2012 22 / 58
  41. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Was ist

    eine Kopie? Kopiertes Objekt ... referenziert die selben Objekte? referenziert Kopien auf die Objekte? ist unabhängig? hat noch den gleichen State? Lars Hupel Gang of Many 4. September 2012 22 / 58
  42. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Workflow 1.

    Objekt kopieren 2. State ändern Warum nicht beides kombinieren? Lars Hupel Gang of Many 4. September 2012 23 / 58
  43. Scala OO-Muster Funktionale Entwurfsmuster Cloning mit Mutable State Workflow 1.

    Objekt kopieren 2. State ändern Warum nicht beides kombinieren? Lars Hupel Gang of Many 4. September 2012 23 / 58
  44. Scala OO-Muster Funktionale Entwurfsmuster Prototype in Scala Daten als Case

    Classes case class Person( name: String, address: String, age: Int ) val lars = Person("Lars", "Munich", 21) lars.copy(age = 22) Lars Hupel Gang of Many 4. September 2012 24 / 58
  45. Scala OO-Muster Funktionale Entwurfsmuster Prototype in Scala Vorteile Immutable Syntaxzucker

    Nachteile nicht zusammensetzbar für verschachtelte Strukturen skaliert nicht Lars Hupel Gang of Many 4. September 2012 25 / 58
  46. Scala OO-Muster Funktionale Entwurfsmuster Prototype in Scala Vorteile Immutable Syntaxzucker

    Nachteile nicht zusammensetzbar für verschachtelte Strukturen skaliert nicht Lars Hupel Gang of Many 4. September 2012 25 / 58
  47. Scala OO-Muster Funktionale Entwurfsmuster Prototype in Scala Verallgemeinerung des Problems

    gegeben: eine Klasse R (“Record”) Ziel: ein Wert F (“Field”), der in R enthalten ist Operationen def get(object: R): F def set(object: R, newValue: F): R Lars Hupel Gang of Many 4. September 2012 26 / 58
  48. Scala OO-Muster Funktionale Entwurfsmuster Prototype in Scala Verallgemeinerung des Problems

    gegeben: eine Klasse R (“Record”) Ziel: ein Wert F (“Field”), der in R enthalten ist Operationen def get(object: R): F def set(object: R, newValue: F): R Lars Hupel Gang of Many 4. September 2012 26 / 58
  49. Scala OO-Muster Funktionale Entwurfsmuster Prototype in Scala Verallgemeinerung des Problems

    gegeben: eine Klasse R (“Record”) Ziel: ein Wert F (“Field”), der in R enthalten ist Operationen def get(object: R): F def set(object: R, newValue: F): R Lars Hupel Gang of Many 4. September 2012 26 / 58
  50. Scala OO-Muster Funktionale Entwurfsmuster Lenses in Scala case class Lens[R,

    F]( get: R => F, set: (R, F) => F ) Lars Hupel Gang of Many 4. September 2012 27 / 58
  51. Scala OO-Muster Funktionale Entwurfsmuster Lenses in Scala case class Lens[R,

    F]( get: R => F, set: (R, F) => F ) Benutzung object Person { val name: Lens[Person, Name] = // ... val age: Lens[Person, Int] = // ... } Person.age.set(lars, 22) Lars Hupel Gang of Many 4. September 2012 27 / 58
  52. Scala OO-Muster Funktionale Entwurfsmuster Lenses in Scala case class Lens[R,

    F]( get: R => F, set: (R, F) => F ) Erzeugung Deklaration im Companion aber: immer noch Boilerplate automatische Generierung? Lars Hupel Gang of Many 4. September 2012 27 / 58
  53. Scala OO-Muster Funktionale Entwurfsmuster Lenses in Scala Literatur Tony Morris:

    Asymmetric Lenses in Scala, http://days2012.scala-lang.org/sites/days2012/ files/morris_lenses.pdf Lars Hupel Gang of Many 4. September 2012 29 / 58
  54. Scala OO-Muster Funktionale Entwurfsmuster Adapter Problem Integration und Zusammenarbeit von

    verschiedenen Bibliotheken Eigentliches Problem Nachrüsten von Operationen auf Klassen schwierig OO-Lösung(en) Composition (Wrapping) (Inheritance) Lars Hupel Gang of Many 4. September 2012 30 / 58
  55. Scala OO-Muster Funktionale Entwurfsmuster Adapter Problem Integration und Zusammenarbeit von

    verschiedenen Bibliotheken Eigentliches Problem Nachrüsten von Operationen auf Klassen schwierig OO-Lösung(en) Composition (Wrapping) (Inheritance) Lars Hupel Gang of Many 4. September 2012 30 / 58
  56. Scala OO-Muster Funktionale Entwurfsmuster Adapter Problem Integration und Zusammenarbeit von

    verschiedenen Bibliotheken Eigentliches Problem Nachrüsten von Operationen auf Klassen schwierig OO-Lösung(en) Composition (Wrapping) (Inheritance) Lars Hupel Gang of Many 4. September 2012 30 / 58
  57. Scala OO-Muster Funktionale Entwurfsmuster Adapter in Scala leichtgewichtige Wrapper mit

    Case Classes case class JavaList[T]( underlying: java.util.LinkedList[T] ) extends Seq[A] { // ... } automatisches Wrapping mit Implicit Conversions Lars Hupel Gang of Many 4. September 2012 31 / 58
  58. Scala OO-Muster Funktionale Entwurfsmuster Type Classes Andere Möglichkeit: über die

    Operationen abstrahieren Typklassen hat nichts mit „Klasse“ im Java-Sinne zu tun „Familie“ von Typen, die gemeinsame Operationen anbieten Lars Hupel Gang of Many 4. September 2012 32 / 58
  59. Scala OO-Muster Funktionale Entwurfsmuster Type Classes Andere Möglichkeit: über die

    Operationen abstrahieren Typklassen hat nichts mit „Klasse“ im Java-Sinne zu tun „Familie“ von Typen, die gemeinsame Operationen anbieten Lars Hupel Gang of Many 4. September 2012 32 / 58
  60. Scala OO-Muster Funktionale Entwurfsmuster Type Classes Andere Möglichkeit: über die

    Operationen abstrahieren Typklassen hat nichts mit „Klasse“ im Java-Sinne zu tun „Familie“ von Typen, die gemeinsame Operationen anbieten Lars Hupel Gang of Many 4. September 2012 32 / 58
  61. Scala OO-Muster Funktionale Entwurfsmuster Type Classes Andere Möglichkeit: über die

    Operationen abstrahieren Typklassen hat nichts mit „Klasse“ im Java-Sinne zu tun „Familie“ von Typen, die gemeinsame Operationen anbieten “Polymorphism captures similar structure over different values, while type classes capture similar operations over different structures.” – Paul Hudak Lars Hupel Gang of Many 4. September 2012 32 / 58
  62. Scala OO-Muster Funktionale Entwurfsmuster Type Classes in Scala Beispiel: Numeric

    trait Numeric[A] { def add(a1: A, a2: A): A def neg(a: A): A val zero: A } Lars Hupel Gang of Many 4. September 2012 33 / 58
  63. Scala OO-Muster Funktionale Entwurfsmuster Type Classes in Scala Beispiel: Numeric

    val floatNumeric = new Numeric[Float] { def add(a1: Float, a2: Float) = a1 + a2 def neg(a: Float) = -a val zero: Float = 0.0f } Lars Hupel Gang of Many 4. September 2012 34 / 58
  64. Scala OO-Muster Funktionale Entwurfsmuster Type Classes in Scala Beispiel: Numeric

    def solveEquations[T : Numeric]( system: Array[Array[T]] ): Option[Array[T]] = // ... Lars Hupel Gang of Many 4. September 2012 35 / 58
  65. Scala OO-Muster Funktionale Entwurfsmuster Type Classes in Scala Vorteile verringert

    Boilerplate Decoupling nachträgliche Integration kein “self type”-Problem Nachteile Runtime-Overhead Lars Hupel Gang of Many 4. September 2012 36 / 58
  66. Scala OO-Muster Funktionale Entwurfsmuster Iterator Problem Sequentieller Zugriff auf Container-artige

    Objekte OO-Lösung Iterator-Objekt mit den Operationen next get prev ... Lars Hupel Gang of Many 4. September 2012 37 / 58
  67. Scala OO-Muster Funktionale Entwurfsmuster Iterator in Scala Iterator kann ersetzt

    werden durch: map foldLeft/foldRight flatMap ... Lars Hupel Gang of Many 4. September 2012 38 / 58
  68. Scala OO-Muster Funktionale Entwurfsmuster Applicative Gängige Situation: „annotierter“ Wert Future

    Callable Wert oder null Wert oder Exception nichtdeterministisches Ergebnis Wert mit Kontext Lars Hupel Gang of Many 4. September 2012 41 / 58
  69. Scala OO-Muster Funktionale Entwurfsmuster Applicative Gängige Situation: „annotierter“ Wert Future

    Callable Option Wert oder Exception nichtdeterministisches Ergebnis Wert mit Kontext Lars Hupel Gang of Many 4. September 2012 41 / 58
  70. Scala OO-Muster Funktionale Entwurfsmuster Applicative Gängige Situation: „annotierter“ Wert Future

    Callable Option Either/Validation/Try nichtdeterministisches Ergebnis Wert mit Kontext Lars Hupel Gang of Many 4. September 2012 41 / 58
  71. Scala OO-Muster Funktionale Entwurfsmuster Applicative Gängige Situation: „annotierter“ Wert Future

    Callable Option Either/Validation/Try List Wert mit Kontext Lars Hupel Gang of Many 4. September 2012 41 / 58
  72. Scala OO-Muster Funktionale Entwurfsmuster Applicative Gängige Situation: „annotierter“ Wert Future

    Callable Option Either/Validation/Try List Wert mit Kontext Lars Hupel Gang of Many 4. September 2012 41 / 58
  73. Scala OO-Muster Funktionale Entwurfsmuster Applicative Funktionsanwendung x y f z

    = Lars Hupel Gang of Many 4. September 2012 42 / 58
  74. Scala OO-Muster Funktionale Entwurfsmuster Applicative Funktionsanwendung x y f z

    = Option Option Option Lars Hupel Gang of Many 4. September 2012 42 / 58
  75. Scala OO-Muster Funktionale Entwurfsmuster Traverse Aufgabe Eingabe: Liste von Werten,

    die null sein können Ausgabe: Liste der gleichen Werte, falls alle nicht-null sind Lars Hupel Gang of Many 4. September 2012 43 / 58
  76. Scala OO-Muster Funktionale Entwurfsmuster Traverse Aufgabe Eingabe: Liste von Werten,

    die null sein können Ausgabe: Liste der gleichen Werte, falls alle nicht-null sind Lösung list.traverse(Option(_)) Lars Hupel Gang of Many 4. September 2012 43 / 58
  77. Scala OO-Muster Funktionale Entwurfsmuster Traverse Literator Eric Torreborre: The Essence

    of the Iterator Pattern, http://etorreborre.blogspot.de/2011/06/ essence-of-iterator-pattern.html Jeremy Gibbons, Bruno C.d.S. Oliveira: The Essence of the Iterator Pattern, http://www.comlab.ox.ac.uk/jeremy.gibbons/ publications/iterator.pdf Lars Hupel Gang of Many 4. September 2012 45 / 58
  78. Scala OO-Muster Funktionale Entwurfsmuster Dependency Injection CDI, Spring, Guice, ...

    ... verlassen den Sprachumfang Lars Hupel Gang of Many 4. September 2012 46 / 58
  79. Scala OO-Muster Funktionale Entwurfsmuster Dependency Injection CDI, Spring, Guice, ...

    ... verlassen den Sprachumfang Lars Hupel Gang of Many 4. September 2012 46 / 58
  80. Scala OO-Muster Funktionale Entwurfsmuster Dependency Injection in Scala 1. Cake

    Pattern 2. Reader Monad Lars Hupel Gang of Many 4. September 2012 47 / 58
  81. Scala OO-Muster Funktionale Entwurfsmuster Dependency Injection in Scala 1. Cake

    Pattern 2. Reader Monad Lars Hupel Gang of Many 4. September 2012 47 / 58
  82. Scala OO-Muster Funktionale Entwurfsmuster Cake Pattern Grundidee Aufteilung des Codes

    in mehrere Komponenten jede Komponente hat Abhängigkeiten zu anderen Komponenten zyklische Abhängigkeiten erlaubt Lars Hupel Gang of Many 4. September 2012 48 / 58
  83. Scala OO-Muster Funktionale Entwurfsmuster Cake Pattern Beispiel trait Configurations {

    val configuration: Configuration class Configuration(file: String) { def jdbcSource: String = // ... // ... } } Lars Hupel Gang of Many 4. September 2012 49 / 58
  84. Scala OO-Muster Funktionale Entwurfsmuster Cake Pattern Beispiel trait Connections {

    this: Configurations => val connection: Connection class Connection(cacheSize: Int) { open(configuration.jdbcSource) // ... } } Lars Hupel Gang of Many 4. September 2012 49 / 58
  85. Scala OO-Muster Funktionale Entwurfsmuster Cake Pattern Beispiel object Production extends

    Configurations with Connections { val configuration = new Configuration("conf.prod") val connection = new Connection(1024) } Lars Hupel Gang of Many 4. September 2012 49 / 58
  86. Scala OO-Muster Funktionale Entwurfsmuster Cake Pattern Beispiel object Testing extends

    Configurations with Connections { val configuration = new Configuration("conf.test") val connection = new Connection(0) } Lars Hupel Gang of Many 4. September 2012 49 / 58
  87. Scala OO-Muster Funktionale Entwurfsmuster Cake Pattern Vorteile läuft innerhalb der

    Sprache ab Compiler prüft Dependencies keine externe Konfiguration sehr flexibel, weil voller Sprachumfang verfügbar Nachteile erfordert Dependent Types kompiliert u.U. langsam Lars Hupel Gang of Many 4. September 2012 50 / 58
  88. Scala OO-Muster Funktionale Entwurfsmuster Dependency Injection in Scala 1. Cake

    Pattern 2. Reader Monad Lars Hupel Gang of Many 4. September 2012 51 / 58
  89. Scala OO-Muster Funktionale Entwurfsmuster Dependency Injection in Scala 1. Cake

    Pattern 2. Reader Monad Lars Hupel Gang of Many 4. September 2012 51 / 58
  90. Scala OO-Muster Funktionale Entwurfsmuster Reader Monad Problem Konfiguration muss bis

    in die untersten Layer durchgereicht werden Lösungsansatz Funktion, die Konfiguration erwartet Lars Hupel Gang of Many 4. September 2012 52 / 58
  91. Scala OO-Muster Funktionale Entwurfsmuster Currying def computeTotal (items: List[Item]) (t:

    Tariff): Currency Lars Hupel Gang of Many 4. September 2012 53 / 58
  92. Scala OO-Muster Funktionale Entwurfsmuster Currying type TariffReader[A] = Tariff =>

    A def computeTotal(items: List[Item]) : TariffReader[Currency] = { t => // ... } Lars Hupel Gang of Many 4. September 2012 53 / 58
  93. Scala OO-Muster Funktionale Entwurfsmuster Reader Monad Verwendung for { total

    <- computeTotal(items) discounted <- applyDiscount(total, cust) } yield eligiblePayments(discounted, cust) Lars Hupel Gang of Many 4. September 2012 54 / 58
  94. Scala OO-Muster Funktionale Entwurfsmuster Reader Monad TariffReader verhält sich monadisch

    zusammensetzbar Struktur des Programms ist unabhängig vom Kontext “dead simple” Lars Hupel Gang of Many 4. September 2012 55 / 58
  95. Scala OO-Muster Funktionale Entwurfsmuster Rekursion def sum(n: Int): Int =

    if (n > 0) n + sum(n - 1) else 0 Lars Hupel Gang of Many 4. September 2012 57 / 58
  96. Scala OO-Muster Funktionale Entwurfsmuster Rekursion def sum(n: Int): Int =

    if (n > 0) n + sum(n - 1) else 0 Lars Hupel Gang of Many 4. September 2012 57 / 58
  97. Scala OO-Muster Funktionale Entwurfsmuster Rekursion def sum(n: Int) = {

    def aux(curr: Int, acc: Int): Int = if (curr > 0) aux(curr - 1, acc + curr) else 0 aux(n, 0) } Lars Hupel Gang of Many 4. September 2012 57 / 58