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

Scala und Lift

on

  • 2,075 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,075
Views on SlideShare
2,065
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