2. Scala Nightsession - Agenda
► Part I - Spracheinführung
> Intro
> Scala Basics
► Part II - Scripting
> Scripting mit Scala
> Livecoding
► Part III – Application Development
> Funktionale Programmierung
> Objektorientierung
> Livecoding
2 Scala
3. I – Spracheinführung
► Imperativ
> Echte Variablen
> Kontrollstrukturen (if, while, try-catch)
⇒ Skripting
► Objektorientiert
> Gemeinsame Basistypen für alle „Objekte“
> Komposition durch Kombination von Klassen/traits
⇒ Modulare Anwendungsentwicklung
► Funktional
> Jeder Ausdruck hat einen Rückgabewert
> Zustandslos: Immutable Werte und Collections
> Closures, Tupel, Algebraische Datentypen, ….
⇒ Datenverarbeitung
3 Scala
4. I – Spracheinführung
Was ist Scala?
Eine Skriptsprache
►
Eine Applikationssprache
►
Ein Toolkit zum Erstellen von eigenen Sprachen (DSLs)
►
Ein aufgeräumtes Java
►
Was kann man mit Scala?
Beliebige Problemstellungen ausdrücken und per Typsystem prüfen
►
Für jeden Anwendungsfall einen optimalen Kontext schaffen (DSLs)
►
Einfache Aufgaben erledigen, Komplexe einfach machen
►
Vorhandenen Code zu jeder beliebigen Zeit flexibel und sicher erweitern
►
Direkt auf der JVM aufsetzen und beliebige Java-Libraries nutzen
►
Mit den Aufgaben und Anforderungen wachsen
►
4 Unternehmenspräsentation
5. I – Spracheinführung: DasTypsystem
You've got the best of both worlds, don't you?
All our strengths, none of our weaknesses.
► Scalas Typsystem ist stark und statisch
► Einfaches Refactoring
► Ermöglicht guten IDE-Support
► Es sind viel mehr Ausdrücke prüfbar als in Java
► Der Code wirkt dynamisch
> Typangaben entfallen meist
– Ausnahme: Schnittstellen
– Vorteil v.a. bei Typparametern (Generics)
> Statisches Ducktyping
> Implizite Konvertierungen
5 Scala
6. I – Spracheinführung
Eine Einführung von Martin Odersky
A
Scalable
Language
Martin Odersky
FOSDEM 2009
Martin Odersky, FOSDEM 2009
6 Unternehmenspräsentation
8. II – Scripting-Einführung (IKEA-Style)
Scripting mit Scala - Have it your way!
Beim Skripten geht es darum, Aufgaben zu erledigen
►
> Die Sprache soll dich unterstützen und nicht mit Typen und Objekten nerven
Wenn du eine Library oft in deinen Skripten verwendest…
►
> Gönn ihr ein paar Extra-Methoden und Operatoren!
> Impliziten Konvertierungen machen es möglich
Mach es dir einfach!
►
> Funktionen auf Package-Ebene statt XXXUtils, XYZHelper, …
> Closures und Collections sind deine besten Freunde!
> Objekte… Klassen? Typen?? => Überbewertet!
Durch den Einsatz als Skriptsprache lässt sich Scala am besten erlernen!
8 Unternehmenspräsentation
9. II – Scripting-Basiskomponenten
Scala‘s Collections:
Here be Arrays
► Vollständiges Neudesign
> Ersetzen die JDK-Collections
> Einfache Zusammenarbeit mit diesen durch Implizite Konvertierungen
► Jede Collection gibt es in Mutable und Immutable-Varianten
Eine Übersicht: http://www.scala-lang.org/docu/files/collections-api/collections.html
►
9 Unternehmenspräsentation
10. II – Scripting-Basiskomponenten
Collections: Sequenzen und Maps
Seq (~ java.util.List)
val a = Seq(1,2,4,7)
println(a(3)) // gibt 7 aus
val b = a +: 5 // Seq(1,2,4,7,5)
val c = a :+ 10 // Seq(10,1,2,4,7)
var d = Array(1,2,9) ++ a // Array (1,2,9,1,2,4,7)
d = d.filter { i => i > 3 } // Array(9,4,7)
d = d.map { i = > (i + 1).toString }
// Array(„10“,“5“,“8“)
Map (~ java.util.Map)
val m = Map(„a“ -> 4, „b“ -> 5, „d“ -> 6)
val ma = m(„a“) // 4
val m2 = m + („f“ -> 6) // Map(a->4, b->5, d->6, f->6)
val m3 = m – “b“ // Map(a->4, d->6, f->6)
10 Unternehmenspräsentation
11. II – Scripting-Basiskomponenten
Implizite Konvertierungen
► Selbstdefinierte automatische Typumwandlungen
► Scala‘s Panzerklebeband
Schnittstellen ändern
implicit def asFileFilter(fn: File => Boolean) = new FileFilter{
def matches(f: File) = fn(f)
}
val files = new File(“foobar.xml“).listFiles { f => f.isFile }
Neue Methoden hinzufügen
implicit def xstring(s: String) = new Object{
def asFile = new File(s)
}
val dirs = “foobar.xml“.asFile.listFiles {f => f.isDirectory }
11 Unternehmenspräsentation
12. II – Scripting-Basiskomponenten
Implizite Konvertierungen: Nutzen
> Natives Einbinden von fremden Libraries
– Kitten z.B. zwischen Scala‘s und Java‘s Collections
– Automatisches Ersetzen von Interfaces durch closures (s.o.)
– Bestehende Objekte (lokal) um neue Methoden erweitern
> Sicherer Ersatz für dynamische Metaklassen
– Werden nur angewendet wenn sie im Scope (importiert) sind
– Überschreiben keine vorhandenen Methoden und stacken nicht
– Können keine globalen Änderungen bewirken
> Implicits sind vor allem für das Skripting interessant
– Code wird kürzer, besser lesbar
– Java-Utilities können einfacher verwendet werden
12 Unternehmenspräsentation
13. I – Scripting mit Scala
Live Coding Session
Themen
► Die Eclipse-IDE
► Package-Objekte und App
► Var, Val und Def
► Implizite Konvertierungen
► Collections
13 Unternehmenspräsentation
14. III - Application Development
► Application Development
14 Unternehmenspräsentation
15. III – Application Development
Scala im „Programming in the Large“
Je größer ein Projekt ist, je mehr Mitarbeiter es hat und je länger es läuft, umso
►
wichtiger sind
> Statische Typisierung
– Einfaches Refactoring und reduzierte Testaufwände
– Typangaben dokumentieren den Code
> Erweiterbarkeit
– Vorhandener Code muss an neue Anforderungen
– Leichte Wiederverwendbarkeit
> Stabilität
– Keine Seiteneffekte
> Modularisierung
– Aufgaben auf Teams auspalten
– Kontrakte definieren
Jeder dieser Punkte kann auf Spracheebene adressiert werden
►
15 Unternehmenspräsentation
16. III – Application Development
► Scalas Schlüsselkomponenten dazu
> Funktionale Programmierung (FP)
– Datenverarbeitung
> Objektorientierung (OO)
– Modularisierung
– Modellierung von Workflows
> Das Typsystem
– Die 3 Sprachebenen: Statements, Templates, Typen
– Typparameter (Generics)
16 Unternehmenspräsentation
17. III - Funktionale Programmierung
► Prinzipien
> Trennung von Daten und Funktionen!
> Zustandlosigkeit
► Daten
> Typen: Werte, Collections
> Sondertypen: Funktionen (Closures), Algebraische Datentypen
> Pattern Matching: Zerlegen von Daten in ihre Werte
► Funktionen
> Liefern immer einen Wert zurück
> Verändern nicht ihre Eingabeparameter
► Ziele
> Effiziente Datenverarbeitung
> Vermeidung von Seiteneffekten!
> Dadurch hohe Test- und Wartbarkeit
17 Unternehmenspräsentation
18. III – Funktionale Komponenten in Scala
► Scala integriert die FP als Teil der Objektorientierung
> Funktionen: Objekte mit einer unsichtbaren „apply“-Funktion
{ i => i.toString }
=> new Function(){ def apply(i: Any) = i.toString() }
> Algebraische Datentypen: Case Klassen
abstract sealed class Frucht
case class Apfel(sauer: Boolean) extends Frucht
Case class Birne(sorte: String) extends Frucht
> Pattern Matching
def welcheFrucht(frucht: Frucht) = frucht match {
case Apfel(sauer) => println(„Ich bin ein Apfel und sauer:“ + sauer)
case Birne(sorte) => println(„Ich bin eine Birne und heiße:“+ sorte)
}
18 Unternehmenspräsentation
19. III - Objektorientierung in Scala
► Klassen
> Wie in Java, nur kürzer!
> Case-Klassen: Quick-and-Dirty Datentypen mit equals/hashcode/toString
► Objekte
> Singletons als Sprachkonstrukt ersetzen die Statics
> Unterstützten Vererbung
> Package Objekt: Definition von package-weiten Funktionen / Werten
► Traits
> Wie Java-Interfaces, nur mit Implementierungen!
> Erlauben eingeschränkte Mehrfachvererbung: (abstrakt, ohne Konstruktor)
► Strukturelle Typen
> Wie Java-Interfaces, nur ohne Vererbung
> „Statisch typisiertes“ Ducktyping
19 Unternehmenspräsentation
20. III – Objektorientierung: Das Typsystem
Objektorientierung mit einer aufgeräumten Typhierarchie
Supertypen
► Any: Alle Objekte
► AnyRef: Alle Referenzen
> java.lang.Object
► AnyVal: Alle „Primitiven“
Subtypen
► Null: Subtyp aller AnyRefs
► Nothing: Subtyp aller Typen
> Ausstieg per Exception
Besonderheit
► Unit: Leerer Wert == void
20 Scala
21. III - Erweiterbarkeit durch FP und OO
In welcher Hinsicht ist Scala erweiterbar?
► Neue Datenstrukturen (Objektorientiert)
> Vererbung
► Neue Operationen (Funktional)
> Case Classes mit Pattern Matching
In jede Richtung mit impliziten Konvertierungen und Parametern..
Scala
22. III – Das Typsystem: Scalas Sprachebenen
Statements
Geben Werte zurück, erzeugen Seiteneffekte
def a = { 3 }
println („Hello World“)
Templates
Definition von Objekten und Klassen
trait Printable { … }
class Printer extends Printable{ … }
object Printer extends Printer{ … }
new { … } with Printable { … }
Typen
Kontrakte aus Klassen, Traits und Methoden
type Jlist[T] = java.util.List[T]
type Closeable = { def close() }
def onClosableList(c : Closeable with Jlist[T])
22 Unternehmenspräsentation
23. Livecoding
Themen
► Objektorientierung
► Funktionale Programmierung mit Case-Klassen / Pattern Matching
► Integration mit Java-Klassen
23 Unternehmenspräsentation
25. Einsatzszenarien
Scalas Stärken
► Skripting
► Buildskripte (SBT, baut auf Maven auf)
► Applikationsentwicklung
► Ersatz für XML-Konfigurationsdateien
► Unit-Testing (ScalaTest, Specs)
► Web-Entwicklung mit Lift
► Domain Specific Languages
Javas Stärken
► GUI-Layouting (GUI-Builder erzeugen immer Java-Code)
► GWT (Es gibt keinen Bytecode-Compiler für GWT)
► JPA-Beans (?)
Scala
26. Kritikpunkte
► Sprache
> XML-Support auf Sprachebene
> Keine dynamische Typisierung
> Komplexität?
– Sprache: Weniger komplex als Java, C# und C++…
– Fehlermeldungen des Compilers nicht immer hilfreich, v.a. bei impliziten
Konvertierungen
– Flexible Syntax erfordert Konventionen
– Viele Sprachfeatures sind für Library-Designer gedacht und werden nur
selten in der Applikationsentwicklung gebraucht
► Tooling
> Die IDEs (Noch)
> Auf die Java-Sprache bezogene Tools nicht einsetzbar (GWT)
Scala
27. Ich danke euch für eure Aufmerksamkeit.
Weitere JVM-Sprachen:
Groovy (dyn)
►
Clojure (dyn)
►
Fantom (stat/dyn)
►
JRuby (dyn)
►
Gosu (stat)
►
27 Unternehmenspräsentation