Scala und Lift<br />Felix Müller<br />15.07.2011<br />
Mein Background<br />7 Jahre Java, 2 Jahre C# und andere Sprachen<br />4Monate Scala<br />3Monate Lift<br />Studentischer ...
Erwartungen und Ziele<br />Eure Erwartungen<br />Scala sehen und verstehen<br />Feeling für Scala entwickeln<br />Ideen fü...
Agenda<br />15.07.2011<br />Scala und Lift<br />4<br />
15.07.2011<br />Scala<br />Eine ausführliche Einführung<br />
Agenda – Scala<br />15.07.2011<br />Scala und Lift<br />6<br />
Was ist Scala?<br />eine objektfunktionale Programmiersprache<br />Programmiersprache für die JVM (und .Net)<br />2003 in ...
Was ist Scala?<br />Scala ist…<br />vollständig objektorientiert, funktional und imperativ.<br />eine Skript- sowie modern...
Was ist Scala?<br />Was kann man mit Scala?<br />Beliebige Problemstellungen ausdrücken und per Typsystem prüfen<br />Für ...
Warum Scala?<br />Entwicklersicht<br />statisch typisierte Sprache mit vielen Vorteilen von dynamisch typisierten<br />kei...
Warum Scala?<br />15.07.2011<br />Scala und Lift<br />11<br />Vergleich der wichtigsten JVM-Sprachen<br />
Warum Scala?<br />15.07.2011<br />Scala und Lift<br />12<br />Vergleich der wichtigsten JVM-Sprachen<br />
Warum Scala?<br />15.07.2011<br />Scala und Lift<br />13<br />Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli...
Wo wird Scala eingesetzt?<br />15.07.2011<br />Scala und Lift<br />14<br />
Hands on! Spracheinführung in Scala<br />Deklaration und Definition von Werten, Variablen, Methoden und Funktionen<br />15...
Typinferenz<br />Viele Typangaben sind überflüssig. Der Compiler leitet sie eh selbst her!<br />15.07.2011<br />Scala und ...
Typinferenz<br />In der Tat: die meisten Typangaben können entfallen.<br />15.07.2011<br />Scala und Lift<br />17<br />val...
Klassen und Objekte<br />Ihr kommt nicht drumrum: ein HelloWorld-Beispiel, aber ein schönes<br />15.07.2011<br />Scala und...
Klassen und Objekte<br />Zur Übersicht: Umwandlung von Klasse HelloWorld zum Objekt<br />15.07.2011<br />Scala und Lift<br...
Klassen und Objekte<br />Jetzt ist HelloWorld ein Singleton Objekt  Scalas Ersatz für Java‘s Statics<br />15.07.2011<br /...
Companion Objekte<br />Klassen können einen Gefährten haben: Companion Objekte<br />15.07.2011<br />Scala und Lift<br />21...
Traits<br />Traits sind wie Java Interfaces, aber mit Implementierung<br />15.07.2011<br />Scala und Lift<br />22<br />// ...
Traits<br />Traits sind Mixins und gestatten eine sichere Mehrfachvererbung<br />15.07.2011<br />Scala und Lift<br />23<br...
Self-Type Annotationen<br />ermöglichen weitere Modularisierung und einfache Dependency Injection<br />15.07.2011<br />Sca...
Funktionen<br />Funktionen sind in Scala First-Class Citizens<br />15.07.2011<br />Scala und Lift<br />25<br />defdec(i: I...
Funktionen höherer Ordnung<br />Funktionen, die andere Funktionen als Parameter oder Rückgabewert haben<br />15.07.2011<br...
Currying<br />Mehr ist immer besser: Scala unterstützt  mehrere Parameterlisten<br />15.07.2011<br />Scala und Lift<br />2...
Eigene Kontrollstrukturen<br />Currying + partiell angewandte Funktionen + Syntactic Sugar<br />15.07.2011<br />Scala und ...
Eigene Kontrollstrukturen deluxe<br />Java 7 Auto-Closeable mit Scala nachgebaut<br />15.07.2011<br />Scala und Lift<br />...
Eigene Kontrollstrukturen deluxe<br />Java 7 Auto-Closeable mit Scala nachgebaut<br />15.07.2011<br />Scala und Lift<br />...
Case Klassen<br />Abstrakte Datentypen durch Case Klassen<br />15.07.2011<br />Scala und Lift<br />31<br />// Case Klassen...
Pattern Matching<br />Switch auf Steroiden<br />15.07.2011<br />Scala und Lift<br />32<br />// Switch-ähnlich, abermehrMög...
Implicit Conversions<br />selbstdefinierte Typumwandlungen (ermöglichen das Pimp my Library Pattern)<br />15.07.2011<br />...
Implicit Conversions<br />Anwendung der definierten Implicit Conversion<br />15.07.2011<br />Scala und Lift<br />34<br />/...
Scala im Vergleich zu Java<br />15.07.2011<br />Scala und Lift<br />35<br />u.a. durch Scala Standardbibliothek implementi...
Scala im Vergleich zu Java<br /><ul><li>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</li></ul>15.07.2011<br />Scala und Lift<br />36<br />You've got the best of both worlds, don't y...
Beispielanwendung<br />Rewrite einer Java Applikation in Scala<br />15.07.2011<br />
Tool Chain<br />MavenPlugin für Scala<br />alle Scala Libraries lassen sich mit Maven (und Ant) integrieren<br />Scala hat...
Fazit<br />Pro<br />Scala unterstützt FP ohne dabei mit der OOP zu brechen.<br />Scala ermöglicht verständlicheren Code al...
15.07.2011<br />Lift<br />Vorstellung des funktionalen Scala Full-Stack<br />Web-Frameworks<br />
Agenda – Lift<br />15.07.2011<br />Scala und Lift<br />41<br />
Was ist Lift?<br />funktionales Web-Framework für Scala<br />seit 2007 in Entwicklung, aktuell: Version 2.4-M1<br />Full-S...
Was ist Lift?<br />15.07.2011<br />Scala und Lift<br />43<br />Full-Stack  Web-Framework<br />
Warum Lift?<br />Standard für Web-Entwicklung mit Scala<br />setzt auf der Java EE Plattform auf<br />interessante Konzept...
Wo wird Lift eingesetzt?<br />15.07.2011<br />Scala und Lift<br />45<br />
View-First-Konzept<br />Seitenbeschreibungen in Standard XHTML-Tags<br />Ziel:<br />Designer friendly Templates<br />keine...
Snippets<br />Snippets sind das ViewModel<br />Snippets sind Funktionen, die XML-Knoten transformieren:<br />NodeSeq => No...
Persistenz<br />15.07.2011<br />Scala und Lift<br />48<br />2 Persistenz-Bibliotheken: Mapper und Record<br />Mapper baut ...
Beispielanwendung<br />Twitter nachgebaut mit Lift von Heiko Seeberger<br />15.07.2011<br />
Upcoming SlideShare
Loading in...5
×

Scala und Lift

1,992

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,992
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
30
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Scala und Lift

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

    Clipping is a handy way to collect important slides you want to go back to later.

×