SlideShare ist ein Scribd-Unternehmen logo
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

Weitere ähnliche Inhalte

Andere mochten auch

Keynote change 2013
Keynote change 2013Keynote change 2013
Keynote change 2013
rbschange
 
Zahltag. Eine Auswahl.
Zahltag. Eine Auswahl.Zahltag. Eine Auswahl.
Zahltag. Eine Auswahl.
arsmedium
 
Atelier 11 - Interco et structures touristiques
Atelier 11  - Interco et structures touristiquesAtelier 11  - Interco et structures touristiques
Atelier 11 - Interco et structures touristiques
R-Evolutions Touristiques de Brive
 
Psy4090 H2013 partie 1
Psy4090 H2013 partie 1Psy4090 H2013 partie 1
Psy4090 H2013 partie 1
Martinsky Desjardins
 
Mit osli-der-schule-ein-gesicht-gegeben
Mit osli-der-schule-ein-gesicht-gegebenMit osli-der-schule-ein-gesicht-gegeben
Mit osli-der-schule-ein-gesicht-gegeben
Bürgerinitiative BAKI-Meine Schule in Bremen
 
Tome 8 : santé et social
Tome 8 : santé et socialTome 8 : santé et social
Tome 8 : santé et social
paroles d'élus
 
Wie man Negative scannt
Wie man Negative scanntWie man Negative scannt
Wie man Negative scannt
ScanCorner
 
Dmni dmg 2015 2 s03 - explorando la necesidad
Dmni dmg 2015 2 s03 - explorando la necesidadDmni dmg 2015 2 s03 - explorando la necesidad
Dmni dmg 2015 2 s03 - explorando la necesidad
CursoDMNI
 
Evolution de la prise en charge des PPC dans les apnées du sommeil
Evolution de la prise en charge des PPC dans les apnées du sommeilEvolution de la prise en charge des PPC dans les apnées du sommeil
Evolution de la prise en charge des PPC dans les apnées du sommeil
RESEAU MORPHEE
 
byMii
byMiibyMii
Präsentation dells 150708_de
Präsentation dells 150708_dePräsentation dells 150708_de
Präsentation dells 150708_de
Christian Alberto Dellsperger Wharwood
 
Conócenos - Deusto Formación
Conócenos - Deusto Formación Conócenos - Deusto Formación
Conócenos - Deusto Formación
Deusto Formación
 
Wie digitale Assistenten das Arbeitsleben erleichtern
Wie digitale Assistenten das Arbeitsleben erleichternWie digitale Assistenten das Arbeitsleben erleichtern
Wie digitale Assistenten das Arbeitsleben erleichtern
B-S-S Business Software Solutions GmbH
 
WWW: Verzeichnisstrukturen und relative Pfade
WWW: Verzeichnisstrukturen und relative PfadeWWW: Verzeichnisstrukturen und relative Pfade
WWW: Verzeichnisstrukturen und relative Pfade
lehrerfreund
 
埃及博物館
埃及博物館埃及博物館
埃及博物館
meikochen
 
Peter Drucker
Peter DruckerPeter Drucker
Peter Drucker
private
 
Recueil d'histoires bibliques
Recueil d'histoires bibliquesRecueil d'histoires bibliques
Recueil d'histoires bibliques
Joseph-eugene
 

Andere mochten auch (19)

Keynote change 2013
Keynote change 2013Keynote change 2013
Keynote change 2013
 
Zahltag. Eine Auswahl.
Zahltag. Eine Auswahl.Zahltag. Eine Auswahl.
Zahltag. Eine Auswahl.
 
Atelier 11 - Interco et structures touristiques
Atelier 11  - Interco et structures touristiquesAtelier 11  - Interco et structures touristiques
Atelier 11 - Interco et structures touristiques
 
Psy4090 H2013 partie 1
Psy4090 H2013 partie 1Psy4090 H2013 partie 1
Psy4090 H2013 partie 1
 
Mit osli-der-schule-ein-gesicht-gegeben
Mit osli-der-schule-ein-gesicht-gegebenMit osli-der-schule-ein-gesicht-gegeben
Mit osli-der-schule-ein-gesicht-gegeben
 
Tome 8 : santé et social
Tome 8 : santé et socialTome 8 : santé et social
Tome 8 : santé et social
 
Wie man Negative scannt
Wie man Negative scanntWie man Negative scannt
Wie man Negative scannt
 
Dmni dmg 2015 2 s03 - explorando la necesidad
Dmni dmg 2015 2 s03 - explorando la necesidadDmni dmg 2015 2 s03 - explorando la necesidad
Dmni dmg 2015 2 s03 - explorando la necesidad
 
Evolution de la prise en charge des PPC dans les apnées du sommeil
Evolution de la prise en charge des PPC dans les apnées du sommeilEvolution de la prise en charge des PPC dans les apnées du sommeil
Evolution de la prise en charge des PPC dans les apnées du sommeil
 
byMii
byMiibyMii
byMii
 
Präsentation dells 150708_de
Präsentation dells 150708_dePräsentation dells 150708_de
Präsentation dells 150708_de
 
Conócenos - Deusto Formación
Conócenos - Deusto Formación Conócenos - Deusto Formación
Conócenos - Deusto Formación
 
Wie digitale Assistenten das Arbeitsleben erleichtern
Wie digitale Assistenten das Arbeitsleben erleichternWie digitale Assistenten das Arbeitsleben erleichtern
Wie digitale Assistenten das Arbeitsleben erleichtern
 
2.0 webmin
2.0 webmin2.0 webmin
2.0 webmin
 
Conseil
ConseilConseil
Conseil
 
WWW: Verzeichnisstrukturen und relative Pfade
WWW: Verzeichnisstrukturen und relative PfadeWWW: Verzeichnisstrukturen und relative Pfade
WWW: Verzeichnisstrukturen und relative Pfade
 
埃及博物館
埃及博物館埃及博物館
埃及博物館
 
Peter Drucker
Peter DruckerPeter Drucker
Peter Drucker
 
Recueil d'histoires bibliques
Recueil d'histoires bibliquesRecueil d'histoires bibliques
Recueil d'histoires bibliques
 

Ähnlich wie Scala und Lift

Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
Dr. Christian Betz
 
Testing tools
Testing toolsTesting tools
Testing tools
Sebastian Springer
 
Slides
SlidesSlides
Fundamentale Muster in Java
Fundamentale Muster in JavaFundamentale Muster in Java
Fundamentale Muster in Java
tutego
 
Article - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der Entwickler
Wolfgang Weigend
 
Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework? Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework?
Michael Plöd
 
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJava Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Johannes Hohenbichler
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
openForce Information Technology GesmbH
 
Scala Workshop
Scala WorkshopScala Workshop
Scala Workshop
Andreas Neumann
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
Ulrich Krause
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
QAware GmbH
 
Java 8, mit Lambdas das hohe Lied des Functional Programming singen
Java 8, mit Lambdas das hohe Lied des Functional Programming singenJava 8, mit Lambdas das hohe Lied des Functional Programming singen
Java 8, mit Lambdas das hohe Lied des Functional Programming singen
gedoplan
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
Frank Müller
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmers
Bernhard Huemer
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael Greifeneder
Christoph Pickl
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
Sascha Koch
 
Scala 4 Enterprise
Scala 4 EnterpriseScala 4 Enterprise
Scala 4 Enterprise
adesso AG
 
react-de.pdf
react-de.pdfreact-de.pdf
react-de.pdf
ssuser65180a
 

Ähnlich wie Scala und Lift (20)

Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 
Testing tools
Testing toolsTesting tools
Testing tools
 
Slides
SlidesSlides
Slides
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Fundamentale Muster in Java
Fundamentale Muster in JavaFundamentale Muster in Java
Fundamentale Muster in Java
 
Article - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der Entwickler
 
Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework? Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework?
 
Java Magazin - Lift
Java Magazin - LiftJava Magazin - Lift
Java Magazin - Lift
 
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit LiftJava Magazin 5 / 2010 - Twitter nachgebaut mit Lift
Java Magazin 5 / 2010 - Twitter nachgebaut mit Lift
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
 
Scala Workshop
Scala WorkshopScala Workshop
Scala Workshop
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code Cookbook
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 
Java 8, mit Lambdas das hohe Lied des Functional Programming singen
Java 8, mit Lambdas das hohe Lied des Functional Programming singenJava 8, mit Lambdas das hohe Lied des Functional Programming singen
Java 8, mit Lambdas das hohe Lied des Functional Programming singen
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmers
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael Greifeneder
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
Scala 4 Enterprise
Scala 4 EnterpriseScala 4 Enterprise
Scala 4 Enterprise
 
react-de.pdf
react-de.pdfreact-de.pdf
react-de.pdf
 

Scala und Lift

  • 1. Scala und LiftFelix Müller15.07.2011
  • 2. 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
  • 3. 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
  • 7. 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
  • 8. 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
  • 9. 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
  • 10. 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
  • 11. Warum Scala?15.07.2011Scala und Lift11Vergleich der wichtigsten JVM-Sprachen
  • 12. Warum Scala?15.07.2011Scala und Lift12Vergleich der wichtigsten JVM-Sprachen
  • 13. Warum Scala?15.07.2011Scala und Lift13Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)
  • 14. Wo wird Scala eingesetzt?15.07.2011Scala und Lift14
  • 15. 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))
  • 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 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)
  • 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 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)
  • 21. 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) }}
  • 22. 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}
  • 23. 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"}
  • 24. 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 {// ...}
  • 25. 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
  • 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 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?
  • 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 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()}
  • 30. 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()}}
  • 31. 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)
  • 32. 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)}
  • 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 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))
  • 35. Scala im Vergleich zu Java15.07.2011Scala und Lift35u.a. durch Scala Standardbibliothek implementiert: enums, break, continue
  • 36. Scala im Vergleich zu JavaScala’s Typsystem ist stark und statisch.
  • 37. Es sind viel mehr Ausdrücke prüfbar als in Java:
  • 40. Scala Code wirkt dynamisch
  • 43. Vorteil v.a. bei Typparametern (Generics)
  • 44. Implizite Konvertierungen15.07.2011Scala und Lift36You've got the best of both worlds, don't you?All our strengths, none of our weaknesses.
  • 45. BeispielanwendungRewrite einer Java Applikation in Scala15.07.2011
  • 46. 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
  • 47. 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
  • 48. 15.07.2011LiftVorstellung des funktionalen Scala Full-StackWeb-Frameworks
  • 50. 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
  • 51. Was ist Lift?15.07.2011Scala und Lift43Full-Stack Web-Framework
  • 52. 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
  • 53. Wo wird Lift eingesetzt?15.07.2011Scala und Lift45
  • 54. View-First-KonzeptSeitenbeschreibungen in Standard XHTML-TagsZiel:Designer friendly Templateskeine Logik im Viewkein MVC, eigenes Entwurfsmuster: View-ViewModel-Model15.07.2011Scala und Lift46
  • 55. 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
  • 56. 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
  • 57. BeispielanwendungTwitter nachgebaut mit Lift von Heiko Seeberger15.07.2011
  • 58. FazitProAlleinstellungsmerkmale:Comet SupportJavaScript und Ajax Abstraktionherausragende Communitygut geeignet für:Echtzeit Web-Appstypische Web 2.0 AppsSocial NetworksContraVermischung von Schichtenenge Kopplung zwischen Komponentenkeine Komponentenbibliothek (nur einige Widgets)kein Mehrwert für typische Enterprise-Anwendungen15.07.2011Scala und Lift50
  • 60. Ausblick – What‘s next?Scala(Advanced) Sprachfeatures:implizite Argumente und vieles mehrDSLs erstellenAkka als Middleware FrameworkSpring Integration Scala DSLPlay Web-Framework mit Scala ModulCloudFoundry IntegrationLiftWeb-Services mit LiftBigTop als Lift ExtensionKomponentenbibliothekSqueryl Anbindung15.07.2011Scala und Lift52
  • 62. Ausblick – Scala vs. JavaUnd wo ist jetzt der Java Rant?!Hier, aber in zivilisierter Form:https://www.adesso.de/wiki/index.php/Datei:Scala%C3%9Cbersicht.pdf15.07.2011Scala und Lift54
  • 63. 15.07.2011Vielen Dank für eure Aufmerksamkeit.Fragen?
  • 65. Go and start coding Scala!felix.mueller@adesso.dewww.adesso.de