SlideShare ist ein Scribd-Unternehmen logo
1 von 57
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 ,[object Object]
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.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

Weitere ähnliche Inhalte

Andere mochten auch

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 ClojureDr. Christian Betz
 
Fundamentale Muster in Java
Fundamentale Muster in JavaFundamentale Muster in Java
Fundamentale Muster in Javatutego
 
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 EntwicklerWolfgang 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 LiftJohannes Hohenbichler
 
The Lotus Code Cookbook
The Lotus Code CookbookThe Lotus Code Cookbook
The Lotus Code CookbookUlrich Krause
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im VergleichQAware 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 singengedoplan
 
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 SystemeFrank Müller
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmersBernhard Huemer
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederChristoph 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 ClojureSascha Koch
 
Scala 4 Enterprise
Scala 4 EnterpriseScala 4 Enterprise
Scala 4 Enterpriseadesso AG
 

Ä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 Lift Felix Müller 15.07.2011
  • 2. 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
  • 3. 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
  • 5. 15.07.2011 Scala Eine ausführliche Einführung
  • 6. Agenda – Scala 15.07.2011 Scala und Lift 6
  • 7. 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
  • 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.2011 Scala und Lift 8
  • 9. 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
  • 10. 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
  • 11. Warum Scala? 15.07.2011 Scala und Lift 11 Vergleich der wichtigsten JVM-Sprachen
  • 12. Warum Scala? 15.07.2011 Scala und Lift 12 Vergleich der wichtigsten JVM-Sprachen
  • 13. Warum Scala? 15.07.2011 Scala und Lift 13 Stackoverflow Rankings als Relevanzindikator (Stand: 5. Juli 2011)
  • 14. Wo wird Scala eingesetzt? 15.07.2011 Scala und Lift 14
  • 15. 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))
  • 16. 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))
  • 17. 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))
  • 18. 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)
  • 19. 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)
  • 20. 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)
  • 21. 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) } }
  • 22. 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 }
  • 23. 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" }
  • 24. 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 { // ... }
  • 25. 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
  • 26. 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)
  • 27. 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?
  • 28. 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 })
  • 29. 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() }
  • 30. 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() } }
  • 31. 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)
  • 32. 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) }
  • 33. 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) }
  • 34. 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))
  • 35. Scala im Vergleich zu Java 15.07.2011 Scala und Lift 35 u.a. durch Scala Standardbibliothek implementiert: enums, break, continue
  • 36.
  • 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.2011 Scala und Lift 36 You've got the best of both worlds, don't you? All our strengths, none of our weaknesses.
  • 45. Beispielanwendung Rewrite einer Java Applikation in Scala 15.07.2011
  • 46. 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
  • 47. 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
  • 48. 15.07.2011 Lift Vorstellung des funktionalen Scala Full-Stack Web-Frameworks
  • 49. Agenda – Lift 15.07.2011 Scala und Lift 41
  • 50. 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
  • 51. Was ist Lift? 15.07.2011 Scala und Lift 43 Full-Stack Web-Framework
  • 52. 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
  • 53. Wo wird Lift eingesetzt? 15.07.2011 Scala und Lift 45
  • 54. 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
  • 55. 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
  • 56. 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
  • 57. Beispielanwendung Twitter nachgebaut mit Lift von Heiko Seeberger 15.07.2011
  • 58. 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
  • 59. 15.07.2011 Ausblick Weitere interessante Themen
  • 60. 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
  • 61. Ausblick – Buchtipps Scala Lift 15.07.2011 Scala und Lift 53
  • 62. 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
  • 63. 15.07.2011 Vielen Dank für eure Aufmerksamkeit. Fragen?
  • 64. 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
  • 65. Go and start coding Scala! felix.mueller@adesso.de www.adesso.de