scala und lift

57
Scala und Lift Felix Müller 21.09.11

Upload: adesso-ag

Post on 24-Jun-2015

1.474 views

Category:

Technology


0 download

DESCRIPTION

Die Präsentation führt in die Programmiersprache Scala und das Web-Framework Lift ein.

TRANSCRIPT

Page 1: Scala und Lift

Scala und Lift Felix Müller

21.09.11

Page 2: Scala und Lift

Mein Background

►  7 Jahre Java, 2 Jahre C# und andere Sprachen

►  4 Monate Scala

►  3 Monate Lift

►  Studentischer Mitarbeiter

►  Bachelorarbeit bei adesso zum Thema: „Vergleich des Scala Web-Frameworks Lift mit dem Java EE Programmiermodell “

►  Twitter: @fmueller_bln

►  Mail: [email protected]

21.09.11 Scala und Lift 2

Page 3: Scala und Lift

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

21.09.11 Scala und Lift 3

Page 4: Scala und Lift

Agenda

Scala

Lift

Ausblick 21.09.11 Scala und Lift 4

Page 5: Scala und Lift

21.09.11

Scala Eine ausführliche Einführung

Page 6: Scala und Lift

Agenda – Scala

Was, warum und wo?

Einführung in die Sprache

Scala im Vergleich zu Java

Beispielanwendung

Tool Chain

Fazit

21.09.11 Scala und Lift 6

Page 7: Scala und Lift

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: entwickelt an École polytechnique fédérale de Lausanne

►  seit Version 2.9: Enterprise Kontext durch Typesafe (Martin Odersky, James Gosling, Doug Lea, Heiko Seeberger u.a.)

21.09.11 Scala und Lift 7

Martin Odersky, Scala Erfinder

Top Java Ambassador, JAX Innovation Awards 2011

Page 8: Scala und Lift

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.

21.09.11 Scala und Lift 8

Page 9: Scala und Lift

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

21.09.11 Scala und Lift 9

Page 10: Scala und Lift

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

21.09.11 Scala und Lift 10

Page 11: Scala und Lift

Warum Scala?

Java Scala Groovy JRuby Clojure Typisierung statisch statisch dynamisch dynamisch dynamisch Paradigma OO OO/FP OO OO FP

21.09.11 Scala und Lift 11

►  Vergleich der wichtigsten JVM-Sprachen

Page 12: Scala und Lift

Warum Scala?

Java Scala Groovy JRuby Clojure Typisierung statisch statisch dynamisch dynamisch dynamisch Paradigma OO OO/FP OO OO FP

21.09.11 Scala und Lift 12

►  Vergleich der wichtigsten JVM-Sprachen

Page 13: Scala und Lift

Warum Scala?

21.09.11 Scala und Lift 13

►  Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)

Tag Anzahl Fragen mit dem Tag java 136920 scala 4635 groovy 2388 clojure 1742 jruby 685

Page 14: Scala und Lift

Wo wird Scala eingesetzt?

21.09.11 Scala und Lift 14

Page 15: Scala und Lift

Hands on! Spracheinführung in Scala

►  Deklaration und Definition von Werten, Variablen, Methoden und Funktionen

21.09.11 Scala und Lift 15

val meaningOfLife: Int = 42 // immutable var maybeImportantNumber: Double = 3.14 // mutable // Methode def printNumber(number: Int) { println("Number: " + number) } // Funktion def incNumber(number: Int) : Int = { number + 1 // entspricht: number.+(1) } printNumber(meaningOfLife) printNumber(incNumber(meaningOfLife))

Page 16: Scala und Lift

Typinferenz

►  Viele Typangaben sind überflüssig. Der Compiler leitet sie eh selbst her!

21.09.11 Scala und Lift 16

val meaningOfLife: Int = 42 // immutable var maybeImportantNumber: Double = 3.14 // mutable // Methode def printNumber(number: Int) { println("Number: " + number) } // Funktion def incNumber(number: Int) : Int = { number + 1 // entspricht: number.+(1) } printNumber(meaningOfLife) printNumber(incNumber(meaningOfLife))

Page 17: Scala und Lift

Typinferenz

►  In der Tat: die meisten Typangaben können entfallen.

21.09.11 Scala und Lift 17

val meaningOfLife = 42 // immutable var maybeImportantNumber = 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))

Page 18: Scala und Lift

Klassen und Objekte

►  Ihr kommt nicht drumrum: ein HelloWorld-Beispiel, aber ein schönes

21.09.11 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 class HelloWorld(greeting: String) { def sayHelloTo(p: Person) = println(greeting+p.name) } // Ausgabe: Hallo Felix val felix = new Person("Felix", "Müller") new HelloWorld("Hallo ").sayHelloTo(felix)

Page 19: Scala und Lift

Klassen und Objekte

►  Zur Übersicht: Umwandlung von Klasse HelloWorld zum Objekt

21.09.11 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) { def sayHelloTo(p: Person) = println(greeting+p.name) } // Ausgabe: Hallo Felix val felix = new Person("Felix", "Müller") new HelloWorld("Hallo ").sayHelloTo(felix)

Page 20: Scala und Lift

Klassen und Objekte

►  Jetzt ist HelloWorld ein Singleton Objekt à Scalas Ersatz für Java‘s Statics

21.09.11 Scala und Lift 20

// einfache Scala Klasse, ist immutable // Konstruktor und “Getter” werden automatisch generiert class Person(val name: String, val surname: String) object HelloWorld { // greeting ist public (Standard-Scope in Scala) val greeting = "Hallo " def sayHelloTo(p: Person) = println(greeting+p.name) } // Ausgabe: Hallo Felix val felix = new Person("Felix", "Müller") HelloWorld.sayHelloTo(felix)

Page 21: Scala und Lift

Companion Objekte

►  Klassen können einen Gefährten haben: Companion Objekte

21.09.11 Scala und Lift 21

// wird zu Person.apply(“Felix”, “Müller”) ergänzt val felix = Person("Felix", "Müller") class Person(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 { def apply(name: String, surname: String) = { new Person(name, surname, 18) } }

Page 22: Scala und Lift

Traits

►  Traits sind wie Java Interfaces, aber mit Implementierung

21.09.11 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 { val meaningOfLife = "5" def calculateMeaningOfLife = 2 + 3 }

Page 23: Scala und Lift

Traits

►  Traits sind Mixins und gestatten eine sichere Mehrfachvererbung

21.09.11 Scala und Lift 23

// Konstruktor-Parameter name implementiert Person.name class HappyPerson(val name: String) extends Person with HasHobby with HasFoundMeaningOfLife { // in Scala gibt es kein @Override, sondern ein // Schlüsselwort für das Überschreiben override val meaningOfLife = "42" override def calculateMeaningOfLife = 42 // hier ist override optional, da in HasHobby keine // Implementierung vorhanden ist def myHobby = "Programming in Scala" }

Page 24: Scala und Lift

Self-Type Annotationen

►  ermöglichen weitere Modularisierung und einfache Dependency Injection

21.09.11 Scala und Lift 24

// this ist in Analyzer mit Backend typisiert trait Analyzer { 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 { // ... }

Page 25: Scala und Lift

Funktionen

►  Funktionen sind in Scala First-Class Citizens

21.09.11 Scala und Lift 25

def dec(i: Int) = i – 1 // Signatur: Int => Int // dec als Funktionsliteral (i: Int) => i – 1 // der Compiler macht daraus ein Objekt new Function[Int, Int]() { def apply(i: Int) = i - 1 } // Zuweisung des Funktionsliterals zu einem Wert val decFunction = (i: Int) => i – 1 // macht beim Aufruf keinen Unterschied println(dec(2)) // Ausgabe: 1 println(decFunction(3)) // Ausgabe: 2

Page 26: Scala und Lift

Funktionen höherer Ordnung

►  Funktionen, die andere Funktionen als Parameter oder Rückgabewert haben

21.09.11 Scala und Lift 26

def dec(i: Int) = i – 1 // Signatur: Int => Int // wendet eine Funktion auf alle Listenelemente an def doWithListOfNumbers(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)

Page 27: Scala und Lift

Currying

►  Mehr ist immer besser: Scala unterstützt mehrere Parameterlisten

21.09.11 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?

Page 28: Scala und Lift

Eigene Kontrollstrukturen

►  Currying + partiell angewandte Funktionen + Syntactic Sugar

21.09.11 Scala und Lift 28

def sub(x: Int)(y: Int) = x – y def subTowWith = sub(2) _ // Ausgabe: -10 println(subTowWith { val five = 5 val seven = 7 five + seven })

Page 29: Scala und Lift

Eigene Kontrollstrukturen deluxe

►  Java 7 Auto-Closeable mit Scala nachgebaut

21.09.11 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(new FileInputStream("File.txt")) { stream => // Daten vom Stream lesen und verarbeiten // z.B. stream.read() }

Page 30: Scala und Lift

Eigene Kontrollstrukturen deluxe

►  Java 7 Auto-Closeable mit Scala nachgebaut

21.09.11 Scala und Lift 30

// Volle Scala Power: // à Statisches Ducktyping mit strukturellen Typen // à Currying // à Funktionen höherer Ordnung def using[T <: { def close() }](resource: T) (block: T => Unit) { try { block(resource) } finally { if (resource != null) resource.close() } }

Page 31: Scala und Lift

Case Klassen

►  Abstrakte Datentypen durch Case Klassen

21.09.11 Scala und Lift 31

// Case Klassen haben automatisch ein Companion Objekt // mit passender apply-Funktion // equals, hashCode und toString werden ebenfalls // automatisch generiert abstract sealed class Frucht case class Apfel(sauer: Boolean) extends Frucht case class Birne(sorte: String) extends Frucht // mit einer abstrakten, versiegelten Klasse kann der // Scala Compiler sichere Typchecks machen (z.B. beim // Pattern Matching)

Page 32: Scala und Lift

Pattern Matching

►  Switch auf Steroiden

21.09.11 Scala und Lift 32

// Switch-ähnlich, aber mehr Möglichkeiten: // à Mustervergleich nach Werten, Typen, Tupeln, // regulären Ausdrücken // à Formulierung von Mustern, z.B: (1, _, x: Double) // à Wildcard, der Unterstrich _ def welcheFrucht(frucht: Frucht) = frucht match { case Apfel(true) => println("Saurer Apfel.") case Apfel(false) => println("Nicht saurer Apfel.") case Birne(sorte) => println("Birnensorte: " + sorte) }

Page 33: Scala und Lift

Implicit Conversions

►  selbstdefinierte Typumwandlungen (ermöglichen das Pimp my Library Pattern)

21.09.11 Scala und Lift 33

// List wird um headOr Funktion erweitert („gepimpt“) class ListExtensions[A](list : List[A]) { def headOr(f: => A): A = list match { case h :: _ => h case Nil => f } } object ListExtensions { implicit def listExtensions[A](list : List[A]) = new ListExtensions(list) }

Page 34: Scala und Lift

Implicit Conversions

►  Anwendung der definierten Implicit Conversion

21.09.11 Scala und Lift 34

// Implicit Conversion wird in den Scope importiert import ListExtensions._ // durch Implicit Conversion kann headOr auf List // aufgerufen werden // Ausgabe: 1 println(List(1,2,3).headOr(0)) // à println(new ListExtensions(List(1, 2, 3)).headOr(0)) // Ausgabe: 0 println(Nil.asInstanceOf[List[Int]].headOr(0))

Page 35: Scala und Lift

Scala im Vergleich zu Java

Scala fügt hinzu… Scala entfernt… Vollständige Objektorientierung Statics Operator-Überladung Primitive Typen Funktionen höherer Ordnung Kontrollstrukturen: switch, break,

continue, do-while, ternärer Operator Mixin Komposition durch Traits Wildcards Abstrakte Datentypen Raw Typs Pattern Matching Enums

21.09.11 Scala und Lift 35

►  u.a. durch Scala Standardbibliothek implementiert: enums, break, continue

Page 36: Scala und Lift

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

21.09.11 Scala und Lift 36

You've got the best of both worlds, don't you?

All our strengths, none of our weaknesses.

Page 37: Scala und Lift

Beispielanwendung

Rewrite einer Java Applikation in Scala

21.09.11

Page 38: Scala und Lift

Tool Chain

►  Maven Plugin 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:

21.09.11 Scala und Lift 38

Scala Eclipse IDEA Netbeans 2.8 2.9 ?

Page 39: Scala und Lift

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 Specific Languages

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

21.09.11 Scala und Lift 39

Page 40: Scala und Lift

21.09.11

Lift Vorstellung des funktionalen Scala Full-Stack Web-Frameworks

Page 41: Scala und Lift

Agenda – Lift

Was, warum und wo?

View-First-Konzept

Snippets

Persistenz

Beispielanwendung

Fazit

21.09.11 Scala und Lift 41

Page 42: Scala und Lift

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)

21.09.11 Scala und Lift 42

David Pollak, Lift Initiator und Maintainer

Page 43: Scala und Lift

Was ist Lift?

21.09.11 Scala und Lift 43

Full-

Stac

k W

eb-F

ram

ewor

k

Page 44: Scala und Lift

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

21.09.11 Scala und Lift 44

Page 45: Scala und Lift

Wo wird Lift eingesetzt?

21.09.11 Scala und Lift 45

Page 46: Scala und Lift

View-First-Konzept

►  Seitenbeschreibungen in Standard XHTML-Tags

►  Ziel: >  Designer friendly Templates >  keine Logik im View

►  kein MVC, eigenes Entwurfsmuster: View-ViewModel-Model

21.09.11 Scala und Lift 46

Page 47: Scala und Lift

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

21.09.11 Scala und Lift 47

Page 48: Scala und Lift

Persistenz

21.09.11 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

Page 49: Scala und Lift

Beispielanwendung

Twitter nachgebaut mit Lift von Heiko Seeberger

21.09.11

Page 50: Scala und Lift

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

21.09.11 Scala und Lift 50

Page 51: Scala und Lift

21.09.11

Ausblick Weitere interessante Themen

Page 52: Scala und Lift

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

21.09.11 Scala und Lift 52

Page 53: Scala und Lift

Ausblick – Buchtipps

Scala Lift

21.09.11 Scala und Lift 53

Page 54: Scala und Lift

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

21.09.11 Scala und Lift 54

Page 55: Scala und Lift

21.09.11

Vielen Dank für eure Aufmerksamkeit. Fragen?

Page 56: Scala und Lift

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

21.09.11 Scala und Lift 56

Page 57: Scala und Lift

Go and start coding Scala!

www.adesso.de

[email protected]