Scala und LiftFelix Müller15.07.2011
Mein Background7 Jahre Java, 2 Jahre C# und andere Sprachen4Monate Scala3Monate LiftStudentischer MitarbeiterBachelorarbeit bei adesso zum Thema: „Vergleich des Scala Web-Frameworks Lift mit dem Java EE Programmiermodell “Twitter: @fmueller_blnMail: felix.mueller@adesso.de15.07.2011Scala und Lift2
Erwartungen und ZieleEure ErwartungenScala sehen und verstehenFeeling für Scala entwickelnIdeen für die Anwendung von Scala bekommenLift kennenlernenEinsatzszenarien für Lift erfahrenMeine Zieleeure Erwartungen erfüllen ;-)den Spaß an Scala vermittelnpraktische Einführung in Scala geben15.07.2011Scala und Lift3
Agenda15.07.2011Scala und Lift4
15.07.2011ScalaEine ausführliche Einführung
Agenda – Scala15.07.2011Scala und Lift6
Was ist Scala?eine objektfunktionale ProgrammierspracheProgrammiersprache für die JVM (und .Net)2003 in Version 1 veröffentlicht  aktuell: 2.9ursprünglich akademischer Kontext: entwickeltan École polytechnique fédérale de Lausanneseit Version 2.9: Enterprise KontextdurchTypesafe(Martin Odersky, James Gosling, Doug Lea, HeikoSeebergeru.a.)15.07.2011Scala und Lift7Martin Odersky,Scala ErfinderTop Java Ambassador,JAX Innovation Awards 2011
Was ist Scala?Scala ist…vollständig objektorientiert, funktional und imperativ.eine Skript- sowie moderne Applikationssprache.interoperabel mit Java und ein aufgeräumtes Java.ein Toolkit zum Erstellen von eigenen Sprachen (DSLs).das was Java schon lange sein sollte, aber vielleicht erst in 10 Jahren ist.15.07.2011Scala und Lift8
Was ist Scala?Was kann man mit Scala?Beliebige Problemstellungen ausdrücken und per Typsystem prüfenFür jeden Anwendungsfall einen optimalen Kontext schaffenVorhandenen Code zu jeder beliebigen Zeit flexibel und sicher erweiternDirekt auf der JVM aufsetzen und beliebige Java-Libraries nutzenEinfache Aufgaben erledigen, komplexe einfach machenMit den Aufgaben und Anforderungen wachsen  Scalable15.07.2011Scala und Lift9
Warum Scala?Entwicklersichtstatisch typisierte Sprache mit vielen Vorteilen von dynamisch typisiertenkeine Java-Krücken, aber die reiche Spielwiese von Java (Libraries)„Jedes Jahr eine neue Sprache“ (Pragmatic Programmers)(„Weil wir es können…“)Managementsichtweniger Code  weniger Fehler  weniger Aufwand„Faster Time to Market“100 % Java Kompatibilität  Integration mit bestehender CodebasisAttract smarter programmer15.07.2011Scala und Lift10
Warum Scala?15.07.2011Scala und Lift11Vergleich der wichtigsten JVM-Sprachen
Warum Scala?15.07.2011Scala und Lift12Vergleich der wichtigsten JVM-Sprachen
Warum Scala?15.07.2011Scala und Lift13Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)
Wo wird Scala eingesetzt?15.07.2011Scala und Lift14
Hands on! Spracheinführung in ScalaDeklaration und Definition von Werten, Variablen, Methoden und Funktionen15.07.2011Scala und Lift15val meaningOfLife: Int = 42              // immutablevar maybeImportantNumber: Double = 3.14  // mutable// MethodedefprintNumber(number: Int) {println("Number: " + number)}// Funktiondef incNumber(number: Int) : Int = {number + 1 // entspricht: number.+(1)}printNumber(meaningOfLife)printNumber(incNumber(meaningOfLife))
TypinferenzViele Typangaben sind überflüssig. Der Compiler leitet sie eh selbst her!15.07.2011Scala und Lift16val meaningOfLife: Int = 42              // immutablevar maybeImportantNumber: Double = 3.14  // mutable// MethodedefprintNumber(number: Int) {println("Number: " + number)}// Funktiondef incNumber(number: Int) : Int= {number + 1 // entspricht: number.+(1)}printNumber(meaningOfLife)printNumber(incNumber(meaningOfLife))
TypinferenzIn der Tat: die meisten Typangaben können entfallen.15.07.2011Scala und Lift17valmeaningOfLife = 42          // immutablevarmaybeImportantNumber = 3.14 // mutable// Methodedef printNumber(number: Int) {println("Number: " + number)}// Funktiondef incNumber(number: Int) = {number + 1 // entspricht: number.+(1)}printNumber(meaningOfLife)printNumber(incNumber(meaningOfLife))
Klassen und ObjekteIhr kommt nicht drumrum: ein HelloWorld-Beispiel, aber ein schönes15.07.2011Scala und Lift18// einfache Scala Klasse, ist immutable// Konstruktor und “Getter” werden automatisch generiertclass Person(val name: String, val surname: String)// greeting ist ein privater Wert, kein Zugriff von außenclassHelloWorld(greeting: String) {defsayHelloTo(p: Person) = println(greeting+p.name)}// Ausgabe: Hallo Felixvalfelix = new Person("Felix", "Müller")newHelloWorld("Hallo ").sayHelloTo(felix)
Klassen und ObjekteZur Übersicht: Umwandlung von Klasse HelloWorld zum Objekt15.07.2011Scala und Lift19// einfache Scala Klasse, ist immutable// Konstruktor und “Getter” werden automatisch generiertclass Person(val name: String, val surname: String)// greeting ist ein privater Wert, kein Zugriff von außenclass HelloWorld(greeting: String) {defsayHelloTo(p: Person) = println(greeting+p.name)}// Ausgabe: Hallo Felixvalfelix = new Person("Felix", "Müller")newHelloWorld("Hallo ").sayHelloTo(felix)
Klassen und ObjekteJetzt ist HelloWorld ein Singleton Objekt  Scalas Ersatz für Java‘s Statics15.07.2011Scala und Lift20// einfache Scala Klasse, ist immutable// Konstruktor und “Getter” werden automatisch generiertclass Person(val name: String, val surname: String)objectHelloWorld { // greeting ist public (Standard-Scope in Scala)val greeting = "Hallo "defsayHelloTo(p: Person) = println(greeting+p.name)}// Ausgabe: Hallo Felixvalfelix = new Person("Felix", "Müller")HelloWorld.sayHelloTo(felix)
Companion ObjekteKlassen können einen Gefährten haben: Companion Objekte15.07.2011Scala und Lift21// wird zu Person.apply(“Felix”, “Müller”) ergänztvalfelix = Person("Felix", "Müller")classPerson(val surname: String, val name: String,            age: Int) {require(age >= 18, "age must not be less than 18")}// beinhaltet alle Statics u. apply-Funktionen für Personobject Person {defapply(name: String, surname: String) = {new Person(name, surname, 18)  }}
TraitsTraits sind wie Java Interfaces, aber mit Implementierung15.07.2011Scala und Lift22// Traits ermöglichen flache u. breite Klassenhierarchien// Beispiel: Zutaten für eine glückliche Persontrait Person {val name: String}trait HasHobby {def myHobby: String}trait HasFoundMeaningOfLife { valmeaningOfLife = "5"def calculateMeaningOfLife = 2 + 3}
TraitsTraits sind Mixins und gestatten eine sichere Mehrfachvererbung15.07.2011Scala und Lift23// Konstruktor-Parameter name implementiert Person.nameclassHappyPerson(val name: String) extendsPersonwithHasHobby with HasFoundMeaningOfLife {  // in Scala gibt es kein @Override, sondern ein  // Schlüsselwort für das Überschreibenoverrideval meaningOfLife = "42"overridedef calculateMeaningOfLife = 42  // hier ist override optional, da in HasHobby keine // Implementierung vorhanden istdef myHobby = "Programming in Scala"}
Self-Type Annotationenermöglichen weitere Modularisierung und einfache Dependency Injection15.07.2011Scala und Lift24// this ist in Analyzer mit Backend typisierttraitAnalyzer { this: Backend =>// Analyzer hat Zugriff auf alle Member von Backend}// Ergebnis://     Analyzer kann Backend erweitern um Funktionen//     Analyzer definiert Abhängigkeit zu Backendtrait Backend extends Analyzer {// ...}
FunktionenFunktionen sind in Scala First-Class Citizens15.07.2011Scala und Lift25defdec(i: Int) = i – 1 // Signatur: Int => Int// dec als Funktionsliteral(i: Int) => i – 1// der Compiler macht daraus ein ObjektnewFunction[Int, Int]() { defapply(i: Int) = i - 1 }// Zuweisung des Funktionsliterals zu einem WertvaldecFunction = (i: Int) => i – 1// macht beim Aufruf keinen Unterschiedprintln(dec(2))         // Ausgabe: 1println(decFunction(3))  // Ausgabe: 2
Funktionen höherer OrdnungFunktionen, die andere Funktionen als Parameter oder Rückgabewert haben15.07.2011Scala und Lift26defdec(i: Int) = i – 1 // Signatur: Int => Int// wendet eine Funktion auf alle Listenelemente andefdoWithListOfNumbers(list: List[Int],                       function: Int => Int) = {  // map ist nur eine Funktion der reichhaltigen  // Collection API von Scalalist.map(function)}// dec kann als Wert einfach übergeben werden// List(1, 2, 3) wird zu List.apply(1, 2, 3)  Companionprintln(doWithListOfNumbers(List(1, 2, 3), dec))// Ausgabe: List(0, 1, 2)
CurryingMehr ist immer besser: Scala unterstützt  mehrere Parameterlisten15.07.2011Scala und Lift27def sub(x: Int)(y: Int) = x – yprintln(sub(2)(3))// Ausgabe: -1// Das ist keine Magie! Anders definiert werden:def sub(x: Int) = (y: Int) => x – y// Aber: Wozu?
Eigene KontrollstrukturenCurrying + partiell angewandte Funktionen + Syntactic Sugar15.07.2011Scala und Lift28def sub(x: Int)(y: Int) = x – ydefsubTowWith= sub(2) _// Ausgabe: -10println(subTowWith{valfive = 5valseven = 7five + seven})
Eigene Kontrollstrukturen deluxeJava 7 Auto-Closeable mit Scala nachgebaut15.07.2011Scala und Lift29// Java 7: close() wird automatisch aufgerufentry (InputStream is = new FileInputStream("File.txt")) {// Daten vom Stream lesen und verarbeiten // z.B. is.read();}// Wir wollen sowas auch in Scala haben!// try als Schlüsselwort ist schon besetzt,// also using wie in C#  Das Ziel:using(newFileInputStream("File.txt")) { stream =>// Daten vom Stream lesen und verarbeiten // z.B. stream.read()}
Eigene Kontrollstrukturen deluxeJava 7 Auto-Closeable mit Scala nachgebaut15.07.2011Scala und Lift30// Volle Scala Power://    Statisches Ducktyping mit strukturellen Typen//    Currying//    Funktionen höherer Ordnungdefusing[T <: { def close() }](resource: T)                              (block: T => Unit) {try{  block(resource)} finally {if(resource != null)resource.close()}}
Case KlassenAbstrakte Datentypen durch Case Klassen15.07.2011Scala und Lift31// Case Klassenhabenautomatischein Companion Objekt// mitpassender apply-Funktion// equals, hashCode und toStringwerdenebenfalls// automatischgeneriertabstractsealedclass FruchtcaseclassApfel(sauer: Boolean) extendsFruchtcaseclassBirne(sorte: String) extendsFrucht// miteinerabstrakten, versiegeltenKlassekann der// Scala Compiler sichereTypchecksmachen (z.B. beim// Pattern Matching)
Pattern MatchingSwitch auf Steroiden15.07.2011Scala und Lift32// Switch-ähnlich, abermehrMöglichkeiten://      MustervergleichnachWerten, Typen, Tupeln,//        regulärenAusdrücken//      Formulierung von Mustern, z.B: (1, _, x: Double)//  Wildcard, der Unterstrich _defwelcheFrucht(frucht: Frucht) = fruchtmatch{case Apfel(true)  => println("Saurer Apfel.")case Apfel(false) => println("Nicht saurer Apfel.")case Birne(sorte) => println("Birnensorte: " + sorte)}
Implicit Conversionsselbstdefinierte Typumwandlungen (ermöglichen das Pimp my Library Pattern)15.07.2011Scala und Lift33// List wird um headOr Funktion erweitert („gepimpt“)classListExtensions[A](list : List[A]) {def headOr(f: => A): A = list match {case h :: _ => hcase Nil => f  }}object ListExtensions {implicitdef listExtensions[A](list : List[A]) =new ListExtensions(list)}
Implicit ConversionsAnwendung der definierten Implicit Conversion15.07.2011Scala und Lift34// ImplicitConversion wird in den Scope importiertimportListExtensions._// durch ImplicitConversion kann headOr auf List// aufgerufen werden// Ausgabe: 1println(List(1,2,3).headOr(0))//  println(newListExtensions(List(1, 2, 3)).headOr(0))// Ausgabe: 0println(Nil.asInstanceOf[List[Int]].headOr(0))
Scala im Vergleich zu Java15.07.2011Scala und Lift35u.a. durch Scala Standardbibliothek implementiert: enums, break, continue
Scala im Vergleich zu JavaScala’s Typsystem ist stark und statisch.
Es sind viel mehr Ausdrücke prüfbar als in Java:
einfaches Refactoring
ermöglicht guten IDE-Support
Scala Code wirkt dynamisch
Typangaben entfallen meist
Ausnahme: Schnittstellen
Vorteil v.a. bei Typparametern (Generics)
Implizite Konvertierungen15.07.2011Scala und Lift36You've got the best of both worlds, don't you?All our strengths, none of our weaknesses.
BeispielanwendungRewrite einer Java Applikation in Scala15.07.2011
Tool ChainMavenPlugin für Scalaalle Scala Libraries lassen sich mit Maven (und Ant) integrierenScala hat eigenes Build- und Deployment Tool: SBT, Simple Build ToolSBT ist eine goldene Mischung aus Maven und Antdeklarativ und imperativ zugleich (ähnlich zu Gradle)nutzt Scala für die Konfiguration  viele Möglichkeiten für Anpassungen ohne XML-HölleScala Plugins für Eclipse, IDEA und Netbeans:15.07.2011Scala und Lift38
FazitProScala unterstützt FP ohne dabei mit der OOP zu brechen.Scala ermöglicht verständlicheren Code als Java.Scala ist weniger komplex als Java.Scala ist besonders gut geeignet für:DatenverarbeitungNebenläufige ProgrammierungDomain SpecificLanguagesContraTool Chain(schlechte) Integration mit Java Toolingim Vergleich zu Java schlechter IDE-Supportjedoch positiver Trend zu erkennenviele Sprachfeatures sind für Library-Designer gedacht  seltene Verwendung in Applikationsentwicklung15.07.2011Scala und Lift39
15.07.2011LiftVorstellung des funktionalen Scala Full-StackWeb-Frameworks
Agenda – Lift15.07.2011Scala und Lift41
Was ist Lift?funktionales Web-Framework für Scalaseit 2007 in Entwicklung, aktuell: Version 2.4-M1Full-Stack: deckt Frontend- und Backend-Belange abunterstützte als eines der ersten Frameworks Comet (Ajax-Push, in HTML5: WebSocket)15.07.2011Scala und Lift42David Pollak,Lift Initiator und Maintainer
Was ist Lift?15.07.2011Scala und Lift43Full-Stack  Web-Framework
Warum Lift?Standard für Web-Entwicklung mit Scalasetzt auf der Java EE Plattform aufinteressante Konzeptevereint viele Ideen anderer Frameworkswird in „richtigen“ Projekte eingesetzt  läuft produktiv und skaliert gut15.07.2011Scala und Lift44
Wo wird Lift eingesetzt?15.07.2011Scala und Lift45
View-First-KonzeptSeitenbeschreibungen in Standard XHTML-TagsZiel:Designer friendly Templateskeine Logik im Viewkein MVC, eigenes Entwurfsmuster: View-ViewModel-Model15.07.2011Scala und Lift46
SnippetsSnippets sind das ViewModelSnippets sind Funktionen, die XML-Knoten transformieren:NodeSeq => NodeSeqXML-Prozessoren, die das Markup direkt verändernSnippets sorgen für dynamische Seiteninhalte und Anbindung des BackendsSnippets können zustandsbehaftet sein15.07.2011Scala und Lift47
Persistenz15.07.2011Scala und Lift482 Persistenz-Bibliotheken: Mapper und RecordMapper baut auf JDBC auf und ist Quasi-Standard in LiftRecord ist Abstraktionsschicht für andere ORM-Frameworks
BeispielanwendungTwitter nachgebaut mit Lift von Heiko Seeberger15.07.2011

Scala und Lift

  • 1.
    Scala und LiftFelixMüller15.07.2011
  • 2.
    Mein Background7 JahreJava, 2 Jahre C# und andere Sprachen4Monate Scala3Monate LiftStudentischer MitarbeiterBachelorarbeit bei adesso zum Thema: „Vergleich des Scala Web-Frameworks Lift mit dem Java EE Programmiermodell “Twitter: @fmueller_blnMail: felix.mueller@adesso.de15.07.2011Scala und Lift2
  • 3.
    Erwartungen und ZieleEureErwartungenScala sehen und verstehenFeeling für Scala entwickelnIdeen für die Anwendung von Scala bekommenLift kennenlernenEinsatzszenarien für Lift erfahrenMeine Zieleeure Erwartungen erfüllen ;-)den Spaß an Scala vermittelnpraktische Einführung in Scala geben15.07.2011Scala und Lift3
  • 4.
  • 5.
  • 6.
  • 7.
    Was ist Scala?eineobjektfunktionale ProgrammierspracheProgrammiersprache für die JVM (und .Net)2003 in Version 1 veröffentlicht  aktuell: 2.9ursprünglich akademischer Kontext: entwickeltan École polytechnique fédérale de Lausanneseit Version 2.9: Enterprise KontextdurchTypesafe(Martin Odersky, James Gosling, Doug Lea, HeikoSeebergeru.a.)15.07.2011Scala und Lift7Martin Odersky,Scala ErfinderTop Java Ambassador,JAX Innovation Awards 2011
  • 8.
    Was ist Scala?Scalaist…vollständig objektorientiert, funktional und imperativ.eine Skript- sowie moderne Applikationssprache.interoperabel mit Java und ein aufgeräumtes Java.ein Toolkit zum Erstellen von eigenen Sprachen (DSLs).das was Java schon lange sein sollte, aber vielleicht erst in 10 Jahren ist.15.07.2011Scala und Lift8
  • 9.
    Was ist Scala?Waskann man mit Scala?Beliebige Problemstellungen ausdrücken und per Typsystem prüfenFür jeden Anwendungsfall einen optimalen Kontext schaffenVorhandenen Code zu jeder beliebigen Zeit flexibel und sicher erweiternDirekt auf der JVM aufsetzen und beliebige Java-Libraries nutzenEinfache Aufgaben erledigen, komplexe einfach machenMit den Aufgaben und Anforderungen wachsen  Scalable15.07.2011Scala und Lift9
  • 10.
    Warum Scala?Entwicklersichtstatisch typisierteSprache mit vielen Vorteilen von dynamisch typisiertenkeine Java-Krücken, aber die reiche Spielwiese von Java (Libraries)„Jedes Jahr eine neue Sprache“ (Pragmatic Programmers)(„Weil wir es können…“)Managementsichtweniger Code  weniger Fehler  weniger Aufwand„Faster Time to Market“100 % Java Kompatibilität  Integration mit bestehender CodebasisAttract smarter programmer15.07.2011Scala und Lift10
  • 11.
    Warum Scala?15.07.2011Scala undLift11Vergleich der wichtigsten JVM-Sprachen
  • 12.
    Warum Scala?15.07.2011Scala undLift12Vergleich der wichtigsten JVM-Sprachen
  • 13.
    Warum Scala?15.07.2011Scala undLift13Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)
  • 14.
    Wo wird Scalaeingesetzt?15.07.2011Scala und Lift14
  • 15.
    Hands on! Spracheinführungin ScalaDeklaration und Definition von Werten, Variablen, Methoden und Funktionen15.07.2011Scala und Lift15val meaningOfLife: Int = 42 // immutablevar maybeImportantNumber: Double = 3.14 // mutable// MethodedefprintNumber(number: Int) {println("Number: " + number)}// Funktiondef incNumber(number: Int) : Int = {number + 1 // entspricht: number.+(1)}printNumber(meaningOfLife)printNumber(incNumber(meaningOfLife))
  • 16.
    TypinferenzViele Typangaben sindüberflüssig. Der Compiler leitet sie eh selbst her!15.07.2011Scala und Lift16val meaningOfLife: Int = 42 // immutablevar maybeImportantNumber: Double = 3.14 // mutable// MethodedefprintNumber(number: Int) {println("Number: " + number)}// Funktiondef incNumber(number: Int) : Int= {number + 1 // entspricht: number.+(1)}printNumber(meaningOfLife)printNumber(incNumber(meaningOfLife))
  • 17.
    TypinferenzIn der Tat:die meisten Typangaben können entfallen.15.07.2011Scala und Lift17valmeaningOfLife = 42 // immutablevarmaybeImportantNumber = 3.14 // mutable// Methodedef printNumber(number: Int) {println("Number: " + number)}// Funktiondef incNumber(number: Int) = {number + 1 // entspricht: number.+(1)}printNumber(meaningOfLife)printNumber(incNumber(meaningOfLife))
  • 18.
    Klassen und ObjekteIhrkommt nicht drumrum: ein HelloWorld-Beispiel, aber ein schönes15.07.2011Scala und Lift18// einfache Scala Klasse, ist immutable// Konstruktor und “Getter” werden automatisch generiertclass Person(val name: String, val surname: String)// greeting ist ein privater Wert, kein Zugriff von außenclassHelloWorld(greeting: String) {defsayHelloTo(p: Person) = println(greeting+p.name)}// Ausgabe: Hallo Felixvalfelix = new Person("Felix", "Müller")newHelloWorld("Hallo ").sayHelloTo(felix)
  • 19.
    Klassen und ObjekteZurÜbersicht: Umwandlung von Klasse HelloWorld zum Objekt15.07.2011Scala und Lift19// einfache Scala Klasse, ist immutable// Konstruktor und “Getter” werden automatisch generiertclass Person(val name: String, val surname: String)// greeting ist ein privater Wert, kein Zugriff von außenclass HelloWorld(greeting: String) {defsayHelloTo(p: Person) = println(greeting+p.name)}// Ausgabe: Hallo Felixvalfelix = new Person("Felix", "Müller")newHelloWorld("Hallo ").sayHelloTo(felix)
  • 20.
    Klassen und ObjekteJetztist HelloWorld ein Singleton Objekt  Scalas Ersatz für Java‘s Statics15.07.2011Scala und Lift20// einfache Scala Klasse, ist immutable// Konstruktor und “Getter” werden automatisch generiertclass Person(val name: String, val surname: String)objectHelloWorld { // greeting ist public (Standard-Scope in Scala)val greeting = "Hallo "defsayHelloTo(p: Person) = println(greeting+p.name)}// Ausgabe: Hallo Felixvalfelix = new Person("Felix", "Müller")HelloWorld.sayHelloTo(felix)
  • 21.
    Companion ObjekteKlassen könneneinen Gefährten haben: Companion Objekte15.07.2011Scala und Lift21// wird zu Person.apply(“Felix”, “Müller”) ergänztvalfelix = Person("Felix", "Müller")classPerson(val surname: String, val name: String, age: Int) {require(age >= 18, "age must not be less than 18")}// beinhaltet alle Statics u. apply-Funktionen für Personobject Person {defapply(name: String, surname: String) = {new Person(name, surname, 18) }}
  • 22.
    TraitsTraits sind wieJava Interfaces, aber mit Implementierung15.07.2011Scala und Lift22// Traits ermöglichen flache u. breite Klassenhierarchien// Beispiel: Zutaten für eine glückliche Persontrait Person {val name: String}trait HasHobby {def myHobby: String}trait HasFoundMeaningOfLife { valmeaningOfLife = "5"def calculateMeaningOfLife = 2 + 3}
  • 23.
    TraitsTraits sind Mixinsund gestatten eine sichere Mehrfachvererbung15.07.2011Scala und Lift23// Konstruktor-Parameter name implementiert Person.nameclassHappyPerson(val name: String) extendsPersonwithHasHobby with HasFoundMeaningOfLife { // in Scala gibt es kein @Override, sondern ein // Schlüsselwort für das Überschreibenoverrideval meaningOfLife = "42"overridedef calculateMeaningOfLife = 42 // hier ist override optional, da in HasHobby keine // Implementierung vorhanden istdef myHobby = "Programming in Scala"}
  • 24.
    Self-Type Annotationenermöglichen weitereModularisierung und einfache Dependency Injection15.07.2011Scala und Lift24// this ist in Analyzer mit Backend typisierttraitAnalyzer { this: Backend =>// Analyzer hat Zugriff auf alle Member von Backend}// Ergebnis://  Analyzer kann Backend erweitern um Funktionen//  Analyzer definiert Abhängigkeit zu Backendtrait Backend extends Analyzer {// ...}
  • 25.
    FunktionenFunktionen sind inScala First-Class Citizens15.07.2011Scala und Lift25defdec(i: Int) = i – 1 // Signatur: Int => Int// dec als Funktionsliteral(i: Int) => i – 1// der Compiler macht daraus ein ObjektnewFunction[Int, Int]() { defapply(i: Int) = i - 1 }// Zuweisung des Funktionsliterals zu einem WertvaldecFunction = (i: Int) => i – 1// macht beim Aufruf keinen Unterschiedprintln(dec(2)) // Ausgabe: 1println(decFunction(3)) // Ausgabe: 2
  • 26.
    Funktionen höherer OrdnungFunktionen,die andere Funktionen als Parameter oder Rückgabewert haben15.07.2011Scala und Lift26defdec(i: Int) = i – 1 // Signatur: Int => Int// wendet eine Funktion auf alle Listenelemente andefdoWithListOfNumbers(list: List[Int], function: Int => Int) = { // map ist nur eine Funktion der reichhaltigen // Collection API von Scalalist.map(function)}// dec kann als Wert einfach übergeben werden// List(1, 2, 3) wird zu List.apply(1, 2, 3)  Companionprintln(doWithListOfNumbers(List(1, 2, 3), dec))// Ausgabe: List(0, 1, 2)
  • 27.
    CurryingMehr ist immerbesser: Scala unterstützt mehrere Parameterlisten15.07.2011Scala und Lift27def sub(x: Int)(y: Int) = x – yprintln(sub(2)(3))// Ausgabe: -1// Das ist keine Magie! Anders definiert werden:def sub(x: Int) = (y: Int) => x – y// Aber: Wozu?
  • 28.
    Eigene KontrollstrukturenCurrying +partiell angewandte Funktionen + Syntactic Sugar15.07.2011Scala und Lift28def sub(x: Int)(y: Int) = x – ydefsubTowWith= sub(2) _// Ausgabe: -10println(subTowWith{valfive = 5valseven = 7five + seven})
  • 29.
    Eigene Kontrollstrukturen deluxeJava7 Auto-Closeable mit Scala nachgebaut15.07.2011Scala und Lift29// Java 7: close() wird automatisch aufgerufentry (InputStream is = new FileInputStream("File.txt")) {// Daten vom Stream lesen und verarbeiten // z.B. is.read();}// Wir wollen sowas auch in Scala haben!// try als Schlüsselwort ist schon besetzt,// also using wie in C#  Das Ziel:using(newFileInputStream("File.txt")) { stream =>// Daten vom Stream lesen und verarbeiten // z.B. stream.read()}
  • 30.
    Eigene Kontrollstrukturen deluxeJava7 Auto-Closeable mit Scala nachgebaut15.07.2011Scala und Lift30// Volle Scala Power://  Statisches Ducktyping mit strukturellen Typen//  Currying//  Funktionen höherer Ordnungdefusing[T <: { def close() }](resource: T) (block: T => Unit) {try{ block(resource)} finally {if(resource != null)resource.close()}}
  • 31.
    Case KlassenAbstrakte Datentypendurch Case Klassen15.07.2011Scala und Lift31// Case Klassenhabenautomatischein Companion Objekt// mitpassender apply-Funktion// equals, hashCode und toStringwerdenebenfalls// automatischgeneriertabstractsealedclass FruchtcaseclassApfel(sauer: Boolean) extendsFruchtcaseclassBirne(sorte: String) extendsFrucht// miteinerabstrakten, versiegeltenKlassekann der// Scala Compiler sichereTypchecksmachen (z.B. beim// Pattern Matching)
  • 32.
    Pattern MatchingSwitch aufSteroiden15.07.2011Scala und Lift32// Switch-ähnlich, abermehrMöglichkeiten://  MustervergleichnachWerten, Typen, Tupeln,// regulärenAusdrücken//  Formulierung von Mustern, z.B: (1, _, x: Double)//  Wildcard, der Unterstrich _defwelcheFrucht(frucht: Frucht) = fruchtmatch{case Apfel(true) => println("Saurer Apfel.")case Apfel(false) => println("Nicht saurer Apfel.")case Birne(sorte) => println("Birnensorte: " + sorte)}
  • 33.
    Implicit Conversionsselbstdefinierte Typumwandlungen(ermöglichen das Pimp my Library Pattern)15.07.2011Scala und Lift33// List wird um headOr Funktion erweitert („gepimpt“)classListExtensions[A](list : List[A]) {def headOr(f: => A): A = list match {case h :: _ => hcase Nil => f }}object ListExtensions {implicitdef listExtensions[A](list : List[A]) =new ListExtensions(list)}
  • 34.
    Implicit ConversionsAnwendung derdefinierten Implicit Conversion15.07.2011Scala und Lift34// ImplicitConversion wird in den Scope importiertimportListExtensions._// durch ImplicitConversion kann headOr auf List// aufgerufen werden// Ausgabe: 1println(List(1,2,3).headOr(0))//  println(newListExtensions(List(1, 2, 3)).headOr(0))// Ausgabe: 0println(Nil.asInstanceOf[List[Int]].headOr(0))
  • 35.
    Scala im Vergleichzu Java15.07.2011Scala und Lift35u.a. durch Scala Standardbibliothek implementiert: enums, break, continue
  • 36.
    Scala im Vergleichzu JavaScala’s Typsystem ist stark und statisch.
  • 37.
    Es sind vielmehr Ausdrücke prüfbar als in Java:
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
    Vorteil v.a. beiTypparametern (Generics)
  • 44.
    Implizite Konvertierungen15.07.2011Scala undLift36You've got the best of both worlds, don't you?All our strengths, none of our weaknesses.
  • 45.
    BeispielanwendungRewrite einer JavaApplikation in Scala15.07.2011
  • 46.
    Tool ChainMavenPlugin fürScalaalle Scala Libraries lassen sich mit Maven (und Ant) integrierenScala hat eigenes Build- und Deployment Tool: SBT, Simple Build ToolSBT ist eine goldene Mischung aus Maven und Antdeklarativ und imperativ zugleich (ähnlich zu Gradle)nutzt Scala für die Konfiguration  viele Möglichkeiten für Anpassungen ohne XML-HölleScala Plugins für Eclipse, IDEA und Netbeans:15.07.2011Scala und Lift38
  • 47.
    FazitProScala unterstützt FPohne dabei mit der OOP zu brechen.Scala ermöglicht verständlicheren Code als Java.Scala ist weniger komplex als Java.Scala ist besonders gut geeignet für:DatenverarbeitungNebenläufige ProgrammierungDomain SpecificLanguagesContraTool Chain(schlechte) Integration mit Java Toolingim Vergleich zu Java schlechter IDE-Supportjedoch positiver Trend zu erkennenviele Sprachfeatures sind für Library-Designer gedacht  seltene Verwendung in Applikationsentwicklung15.07.2011Scala und Lift39
  • 48.
    15.07.2011LiftVorstellung des funktionalenScala Full-StackWeb-Frameworks
  • 49.
  • 50.
    Was ist Lift?funktionalesWeb-Framework für Scalaseit 2007 in Entwicklung, aktuell: Version 2.4-M1Full-Stack: deckt Frontend- und Backend-Belange abunterstützte als eines der ersten Frameworks Comet (Ajax-Push, in HTML5: WebSocket)15.07.2011Scala und Lift42David Pollak,Lift Initiator und Maintainer
  • 51.
    Was ist Lift?15.07.2011Scalaund Lift43Full-Stack Web-Framework
  • 52.
    Warum Lift?Standard fürWeb-Entwicklung mit Scalasetzt auf der Java EE Plattform aufinteressante Konzeptevereint viele Ideen anderer Frameworkswird in „richtigen“ Projekte eingesetzt  läuft produktiv und skaliert gut15.07.2011Scala und Lift44
  • 53.
    Wo wird Lifteingesetzt?15.07.2011Scala und Lift45
  • 54.
    View-First-KonzeptSeitenbeschreibungen in StandardXHTML-TagsZiel:Designer friendly Templateskeine Logik im Viewkein MVC, eigenes Entwurfsmuster: View-ViewModel-Model15.07.2011Scala und Lift46
  • 55.
    SnippetsSnippets sind dasViewModelSnippets sind Funktionen, die XML-Knoten transformieren:NodeSeq => NodeSeqXML-Prozessoren, die das Markup direkt verändernSnippets sorgen für dynamische Seiteninhalte und Anbindung des BackendsSnippets können zustandsbehaftet sein15.07.2011Scala und Lift47
  • 56.
    Persistenz15.07.2011Scala und Lift482Persistenz-Bibliotheken: Mapper und RecordMapper baut auf JDBC auf und ist Quasi-Standard in LiftRecord ist Abstraktionsschicht für andere ORM-Frameworks
  • 57.
    BeispielanwendungTwitter nachgebaut mitLift von Heiko Seeberger15.07.2011