Scala und Lift
Upcoming SlideShare
Loading in...5
×
 

Scala und Lift

on

  • 2,104 views

Slides of my first Tech Talk at adesso AG, Berlin.

Slides of my first Tech Talk at adesso AG, Berlin.

Statistics

Views

Total Views
2,104
Views on SlideShare
2,094
Embed Views
10

Actions

Likes
0
Downloads
26
Comments
0

2 Embeds 10

http://coderwall.com 9
http://techno-sphere.blogspot.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Scala und Lift Scala und Lift Presentation Transcript

  • Scala und Lift
    Felix Müller
    15.07.2011
  • Mein Background
    7 Jahre Java, 2 Jahre C# und andere Sprachen
    4Monate Scala
    3Monate Lift
    Studentischer Mitarbeiter
    Bachelorarbeit bei adesso zum Thema: „Vergleich des Scala Web-Frameworks Lift mit dem Java EE Programmiermodell “
    Twitter: @fmueller_bln
    Mail: felix.mueller@adesso.de
    15.07.2011
    Scala und Lift
    2
  • Erwartungen und Ziele
    Eure Erwartungen
    Scala sehen und verstehen
    Feeling für Scala entwickeln
    Ideen für die Anwendung von Scala bekommen
    Lift kennenlernen
    Einsatzszenarien für Lift erfahren
    Meine Ziele
    eure Erwartungen erfüllen ;-)
    den Spaß an Scala vermitteln
    praktische Einführung in Scala geben
    15.07.2011
    Scala und Lift
    3
  • Agenda
    15.07.2011
    Scala und Lift
    4
  • 15.07.2011
    Scala
    Eine ausführliche Einführung
  • Agenda – Scala
    15.07.2011
    Scala und Lift
    6
  • Was ist Scala?
    eine objektfunktionale Programmiersprache
    Programmiersprache für die JVM (und .Net)
    2003 in Version 1 veröffentlicht  aktuell: 2.9
    ursprünglich akademischer Kontext: entwickeltan École polytechnique fédérale de Lausanne
    seit Version 2.9: Enterprise KontextdurchTypesafe(Martin Odersky, James Gosling, Doug Lea, HeikoSeebergeru.a.)
    15.07.2011
    Scala und Lift
    7
    Martin Odersky,
    Scala Erfinder
    Top 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.2011
    Scala und Lift
    8
  • Was ist Scala?
    Was kann man mit Scala?
    Beliebige Problemstellungen ausdrücken und per Typsystem prüfen
    Für jeden Anwendungsfall einen optimalen Kontext schaffen
    Vorhandenen Code zu jeder beliebigen Zeit flexibel und sicher erweitern
    Direkt auf der JVM aufsetzen und beliebige Java-Libraries nutzen
    Einfache Aufgaben erledigen, komplexe einfach machen
    Mit den Aufgaben und Anforderungen wachsen  Scalable
    15.07.2011
    Scala und Lift
    9
  • Warum Scala?
    Entwicklersicht
    statisch typisierte Sprache mit vielen Vorteilen von dynamisch typisierten
    keine Java-Krücken, aber die reiche Spielwiese von Java (Libraries)
    „Jedes Jahr eine neue Sprache“ (Pragmatic Programmers)
    („Weil wir es können…“)
    Managementsicht
    weniger Code  weniger Fehler  weniger Aufwand
    „Faster Time to Market“
    100 % Java Kompatibilität  Integration mit bestehender Codebasis
    Attract smarter programmer
    15.07.2011
    Scala und Lift
    10
  • Warum Scala?
    15.07.2011
    Scala und Lift
    11
    Vergleich der wichtigsten JVM-Sprachen
  • Warum Scala?
    15.07.2011
    Scala und Lift
    12
    Vergleich der wichtigsten JVM-Sprachen
  • Warum Scala?
    15.07.2011
    Scala und Lift
    13
    Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)
  • Wo wird Scala eingesetzt?
    15.07.2011
    Scala und Lift
    14
  • Hands on! Spracheinführung in Scala
    Deklaration und Definition von Werten, Variablen, Methoden und Funktionen
    15.07.2011
    Scala und Lift
    15
    val meaningOfLife: Int = 42 // immutable
    var maybeImportantNumber: Double = 3.14 // mutable
    // Methode
    defprintNumber(number: Int) {
    println("Number: " + number)
    }
    // Funktion
    def incNumber(number: Int) : Int = {
    number + 1 // entspricht: number.+(1)
    }
    printNumber(meaningOfLife)
    printNumber(incNumber(meaningOfLife))
  • Typinferenz
    Viele Typangaben sind überflüssig. Der Compiler leitet sie eh selbst her!
    15.07.2011
    Scala und Lift
    16
    val meaningOfLife: Int = 42 // immutable
    var maybeImportantNumber: Double = 3.14 // mutable
    // Methode
    defprintNumber(number: Int) {
    println("Number: " + number)
    }
    // Funktion
    def incNumber(number: Int) : Int= {
    number + 1 // entspricht: number.+(1)
    }
    printNumber(meaningOfLife)
    printNumber(incNumber(meaningOfLife))
  • Typinferenz
    In der Tat: die meisten Typangaben können entfallen.
    15.07.2011
    Scala und Lift
    17
    valmeaningOfLife = 42 // immutable
    varmaybeImportantNumber = 3.14 // mutable
    // Methode
    def printNumber(number: Int) {
    println("Number: " + number)
    }
    // Funktion
    def incNumber(number: Int) = {
    number + 1 // entspricht: number.+(1)
    }
    printNumber(meaningOfLife)
    printNumber(incNumber(meaningOfLife))
  • Klassen und Objekte
    Ihr kommt nicht drumrum: ein HelloWorld-Beispiel, aber ein schönes
    15.07.2011
    Scala und Lift
    18
    // einfache Scala Klasse, ist immutable
    // Konstruktor und “Getter” werden automatisch generiert
    class Person(val name: String, val surname: String)
    // greeting ist ein privater Wert, kein Zugriff von außen
    classHelloWorld(greeting: String) {
    defsayHelloTo(p: Person) = println(greeting+p.name)
    }
    // Ausgabe: Hallo Felix
    valfelix = new Person("Felix", "Müller")
    newHelloWorld("Hallo ").sayHelloTo(felix)
  • Klassen und Objekte
    Zur Übersicht: Umwandlung von Klasse HelloWorld zum Objekt
    15.07.2011
    Scala und Lift
    19
    // einfache Scala Klasse, ist immutable
    // Konstruktor und “Getter” werden automatisch generiert
    class Person(val name: String, val surname: String)
    // greeting ist ein privater Wert, kein Zugriff von außen
    class HelloWorld(greeting: String) {
    defsayHelloTo(p: Person) = println(greeting+p.name)
    }
    // Ausgabe: Hallo Felix
    valfelix = new Person("Felix", "Müller")
    newHelloWorld("Hallo ").sayHelloTo(felix)
  • Klassen und Objekte
    Jetzt ist HelloWorld ein Singleton Objekt  Scalas Ersatz für Java‘s Statics
    15.07.2011
    Scala und Lift
    20
    // einfache Scala Klasse, ist immutable
    // Konstruktor und “Getter” werden automatisch generiert
    class 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 Felix
    valfelix = new Person("Felix", "Müller")
    HelloWorld.sayHelloTo(felix)
  • Companion Objekte
    Klassen können einen Gefährten haben: Companion Objekte
    15.07.2011
    Scala und Lift
    21
    // wird zu Person.apply(“Felix”, “Müller”) ergänzt
    valfelix = 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 Person
    object Person {
    defapply(name: String, surname: String) = {
    new Person(name, surname, 18)
    }
    }
  • Traits
    Traits sind wie Java Interfaces, aber mit Implementierung
    15.07.2011
    Scala und Lift
    22
    // Traits ermöglichen flache u. breite Klassenhierarchien
    // Beispiel: Zutaten für eine glückliche Person
    trait Person {
    val name: String
    }
    trait HasHobby {
    def myHobby: String
    }
    trait HasFoundMeaningOfLife {
    valmeaningOfLife = "5"
    def calculateMeaningOfLife = 2 + 3
    }
  • Traits
    Traits sind Mixins und gestatten eine sichere Mehrfachvererbung
    15.07.2011
    Scala und Lift
    23
    // Konstruktor-Parameter name implementiert Person.name
    classHappyPerson(val name: String) extendsPerson
    withHasHobby with HasFoundMeaningOfLife {
    // in Scala gibt es kein @Override, sondern ein
    // Schlüsselwort für das Überschreiben
    overrideval meaningOfLife = "42"
    overridedef calculateMeaningOfLife = 42
    // hier ist override optional, da in HasHobby keine
    // Implementierung vorhanden ist
    def myHobby = "Programming in Scala"
    }
  • Self-Type Annotationen
    ermöglichen weitere Modularisierung und einfache Dependency Injection
    15.07.2011
    Scala und Lift
    24
    // this ist in Analyzer mit Backend typisiert
    traitAnalyzer { this: Backend =>
    // Analyzer hat Zugriff auf alle Member von Backend
    }
    // Ergebnis:
    //  Analyzer kann Backend erweitern um Funktionen
    //  Analyzer definiert Abhängigkeit zu Backend
    trait Backend extends Analyzer {
    // ...
    }
  • Funktionen
    Funktionen sind in Scala First-Class Citizens
    15.07.2011
    Scala und Lift
    25
    defdec(i: Int) = i – 1 // Signatur: Int => Int
    // dec als Funktionsliteral
    (i: Int) => i – 1
    // der Compiler macht daraus ein Objekt
    newFunction[Int, Int]() { defapply(i: Int) = i - 1 }
    // Zuweisung des Funktionsliterals zu einem Wert
    valdecFunction = (i: Int) => i – 1
    // macht beim Aufruf keinen Unterschied
    println(dec(2)) // Ausgabe: 1
    println(decFunction(3)) // Ausgabe: 2
  • Funktionen höherer Ordnung
    Funktionen, die andere Funktionen als Parameter oder Rückgabewert haben
    15.07.2011
    Scala und Lift
    26
    defdec(i: Int) = i – 1 // Signatur: Int => Int
    // wendet eine Funktion auf alle Listenelemente an
    defdoWithListOfNumbers(list: List[Int],
    function: Int => Int) = {
    // map ist nur eine Funktion der reichhaltigen
    // Collection API von Scala
    list.map(function)
    }
    // dec kann als Wert einfach übergeben werden
    // List(1, 2, 3) wird zu List.apply(1, 2, 3)  Companion
    println(doWithListOfNumbers(List(1, 2, 3), dec))
    // Ausgabe: List(0, 1, 2)
  • Currying
    Mehr ist immer besser: Scala unterstützt mehrere Parameterlisten
    15.07.2011
    Scala und Lift
    27
    def sub(x: Int)(y: Int) = x – y
    println(sub(2)(3))// Ausgabe: -1
    // Das ist keine Magie! Anders definiert werden:
    def sub(x: Int) = (y: Int) => x – y
    // Aber: Wozu?
  • Eigene Kontrollstrukturen
    Currying + partiell angewandte Funktionen + Syntactic Sugar
    15.07.2011
    Scala und Lift
    28
    def sub(x: Int)(y: Int) = x – y
    defsubTowWith= sub(2) _
    // Ausgabe: -10
    println(subTowWith{
    valfive = 5
    valseven = 7
    five + seven
    })
  • Eigene Kontrollstrukturen deluxe
    Java 7 Auto-Closeable mit Scala nachgebaut
    15.07.2011
    Scala und Lift
    29
    // Java 7: close() wird automatisch aufgerufen
    try (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 deluxe
    Java 7 Auto-Closeable mit Scala nachgebaut
    15.07.2011
    Scala und Lift
    30
    // Volle Scala Power:
    //  Statisches Ducktyping mit strukturellen Typen
    //  Currying
    //  Funktionen höherer Ordnung
    defusing[T <: { def close() }](resource: T)
    (block: T => Unit) {
    try{
    block(resource)
    } finally {
    if(resource != null)
    resource.close()
    }
    }
  • Case Klassen
    Abstrakte Datentypen durch Case Klassen
    15.07.2011
    Scala und Lift
    31
    // Case Klassenhabenautomatischein Companion Objekt
    // mitpassender apply-Funktion
    // equals, hashCode und toStringwerdenebenfalls
    // automatischgeneriert
    abstractsealedclass Frucht
    caseclassApfel(sauer: Boolean) extendsFrucht
    caseclassBirne(sorte: String) extendsFrucht
    // miteinerabstrakten, versiegeltenKlassekann der
    // Scala Compiler sichereTypchecksmachen (z.B. beim
    // Pattern Matching)
  • Pattern Matching
    Switch auf Steroiden
    15.07.2011
    Scala und Lift
    32
    // 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 Conversions
    selbstdefinierte Typumwandlungen (ermöglichen das Pimp my Library Pattern)
    15.07.2011
    Scala und Lift
    33
    // List wird um headOr Funktion erweitert („gepimpt“)
    classListExtensions[A](list : List[A]) {
    def headOr(f: => A): A = list match {
    case h :: _ => h
    case Nil => f
    }
    }
    object ListExtensions {
    implicitdef listExtensions[A](list : List[A]) =
    new ListExtensions(list)
    }
  • Implicit Conversions
    Anwendung der definierten Implicit Conversion
    15.07.2011
    Scala und Lift
    34
    // ImplicitConversion wird in den Scope importiert
    importListExtensions._
    // durch ImplicitConversion kann headOr auf List
    // aufgerufen werden
    // Ausgabe: 1
    println(List(1,2,3).headOr(0))
    //  println(newListExtensions(List(1, 2, 3)).headOr(0))
    // Ausgabe: 0
    println(Nil.asInstanceOf[List[Int]].headOr(0))
  • Scala im Vergleich zu Java
    15.07.2011
    Scala und Lift
    35
    u.a. durch Scala Standardbibliothek implementiert: enums, break, continue
  • Scala im Vergleich zu Java
    • Scala’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 Konvertierungen
    15.07.2011
    Scala und Lift
    36
    You've got the best of both worlds, don't you?
    All our strengths, none of our weaknesses.
  • Beispielanwendung
    Rewrite einer Java Applikation in Scala
    15.07.2011
  • Tool Chain
    MavenPlugin für Scala
    alle Scala Libraries lassen sich mit Maven (und Ant) integrieren
    Scala hat eigenes Build- und Deployment Tool: SBT, Simple Build Tool
    SBT ist eine goldene Mischung aus Maven und Ant
    deklarativ und imperativ zugleich (ähnlich zu Gradle)
    nutzt Scala für die Konfiguration  viele Möglichkeiten für Anpassungen ohne XML-Hölle
    Scala Plugins für Eclipse, IDEA und Netbeans:
    15.07.2011
    Scala und Lift
    38
  • Fazit
    Pro
    Scala 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:
    Datenverarbeitung
    Nebenläufige Programmierung
    Domain SpecificLanguages
    Contra
    Tool Chain
    (schlechte) Integration mit Java Tooling
    im Vergleich zu Java schlechter IDE-Support
    jedoch positiver Trend zu erkennen
    viele Sprachfeatures sind für Library-Designer gedacht  seltene Verwendung in Applikationsentwicklung
    15.07.2011
    Scala und Lift
    39
  • 15.07.2011
    Lift
    Vorstellung des funktionalen Scala Full-Stack
    Web-Frameworks
  • Agenda – Lift
    15.07.2011
    Scala und Lift
    41
  • Was ist Lift?
    funktionales Web-Framework für Scala
    seit 2007 in Entwicklung, aktuell: Version 2.4-M1
    Full-Stack: deckt Frontend- und Backend-Belange ab
    unterstützte als eines der ersten Frameworks Comet (Ajax-Push, in HTML5: WebSocket)
    15.07.2011
    Scala und Lift
    42
    David Pollak,
    Lift Initiator und Maintainer
  • Was ist Lift?
    15.07.2011
    Scala und Lift
    43
    Full-Stack Web-Framework
  • Warum Lift?
    Standard für Web-Entwicklung mit Scala
    setzt auf der Java EE Plattform auf
    interessante Konzepte
    vereint viele Ideen anderer Frameworks
    wird in „richtigen“ Projekte eingesetzt  läuft produktiv und skaliert gut
    15.07.2011
    Scala und Lift
    44
  • Wo wird Lift eingesetzt?
    15.07.2011
    Scala und Lift
    45
  • View-First-Konzept
    Seitenbeschreibungen in Standard XHTML-Tags
    Ziel:
    Designer friendly Templates
    keine Logik im View
    kein MVC, eigenes Entwurfsmuster: View-ViewModel-Model
    15.07.2011
    Scala und Lift
    46
  • Snippets
    Snippets sind das ViewModel
    Snippets sind Funktionen, die XML-Knoten transformieren:
    NodeSeq => NodeSeq
    XML-Prozessoren, die das Markup direkt verändern
    Snippets sorgen für dynamische Seiteninhalte und Anbindung des Backends
    Snippets können zustandsbehaftet sein
    15.07.2011
    Scala und Lift
    47
  • Persistenz
    15.07.2011
    Scala und Lift
    48
    2 Persistenz-Bibliotheken: Mapper und Record
    Mapper baut auf JDBC auf und ist Quasi-Standard in Lift
    Record ist Abstraktionsschicht für andere ORM-Frameworks
  • Beispielanwendung
    Twitter nachgebaut mit Lift von Heiko Seeberger
    15.07.2011
  • Fazit
    Pro
    Alleinstellungsmerkmale:
    Comet Support
    JavaScript und Ajax Abstraktion
    herausragende Community
    gut geeignet für:
    Echtzeit Web-Apps
    typische Web 2.0 Apps
    Social Networks
    Contra
    Vermischung von Schichten
    enge Kopplung zwischen Komponenten
    keine Komponentenbibliothek (nur einige Widgets)
    kein Mehrwert für typische Enterprise-Anwendungen
    15.07.2011
    Scala und Lift
    50
  • 15.07.2011
    Ausblick
    Weitere interessante Themen
  • Ausblick – What‘s next?
    Scala
    (Advanced) Sprachfeatures:
    implizite Argumente und vieles mehr
    DSLs erstellen
    Akka als Middleware Framework
    Spring Integration Scala DSL
    Play Web-Framework mit Scala Modul
    CloudFoundry Integration
    Lift
    Web-Services mit Lift
    BigTop als Lift Extension
    Komponentenbibliothek
    Squeryl Anbindung
    15.07.2011
    Scala und Lift
    52
  • Ausblick – Buchtipps
    Scala
    Lift
    15.07.2011
    Scala und Lift
    53
  • Ausblick – Scala vs. Java
    Und wo ist jetzt der Java Rant?!
    Hier, aber in zivilisierter Form:
    https://www.adesso.de/wiki/index.php/Datei:Scala%C3%9Cbersicht.pdf
    15.07.2011
    Scala und Lift
    54
  • 15.07.2011
    Vielen Dank für eure Aufmerksamkeit.
    Fragen?
  • Quellen
    http://scala-boss.heroku.com
    http://www.slideshare.net/Odersky/fosdem-2009-1013261
    http://www.mate.it/en/component/content/article/84-perche-scala
    https://www.adesso.de/wiki/index.php/Datei:Scala_Pr%C3%A4sentation_Nightsession.ppt
    http://www.scala-lang.org/node/1658
    http://scala.sygneca.com/patterns/pimp-my-library
    15.07.2011
    Scala und Lift
    56
  • Go and start coding Scala!
    felix.mueller@adesso.de
    www.adesso.de