Upload
adesso-ag
View
456
Download
1
Tags:
Embed Size (px)
DESCRIPTION
Diese Präsentation zeigt eine Einführung in die Programmiersprache Scala.
Citation preview
Programming in Scala
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
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
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
Unternehmenspräsentation 4
I – Spracheinführung: DasTypsystem
► 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
You've got the best of both worlds, don't you? All our strengths, none of our weaknesses.
Scala
I – Spracheinführung
Eine Einführung von Martin Odersky
Unternehmenspräsentation 6
Martin Odersky, FOSDEM 2009
A Scalable Language
Martin OderskyFOSDEM 2009
II - Scripting
► Scripting mit Scala
Unternehmenspräsentation 7
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!
Unternehmenspräsentation 8
II – Scripting-Basiskomponenten
Scala‘s Collections:
► 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
Unternehmenspräsentation 9
Here be Arrays
II – Scripting-Basiskomponenten
Unternehmenspräsentation 10
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)
Collections: Sequenzen und Maps
II – Scripting-Basiskomponenten
Implizite Konvertierungen ► Selbstdefinierte automatische Typumwandlungen
► Scala‘s Panzerklebeband
Unternehmenspräsentation 11
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 }
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
Unternehmenspräsentation 12
I – Scripting mit Scala
Live Coding Session
Themen
► Die Eclipse-IDE
► Package-Objekte und App
► Var, Val und Def
► Implizite Konvertierungen
► Collections
Unternehmenspräsentation 13
III - Application Development
► Application Development
Unternehmenspräsentation 14
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
Unternehmenspräsentation 15
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)
Unternehmenspräsentation 16
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
Unternehmenspräsentation 17
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)
}
Unternehmenspräsentation 18
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
Unternehmenspräsentation 19
III – Objektorientierung: Das Typsystem
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
Objektorientierung mit einer aufgeräumten Typhierarchie
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
III – Das Typsystem: Scalas Sprachebenen
Unternehmenspräsentation 22
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])
Statements Geben Werte zurück, erzeugen Seiteneffekte def a = { 3 } println („Hello World“)
Livecoding
Themen
► Objektorientierung
► Funktionale Programmierung mit Case-Klassen / Pattern Matching
► Integration mit Java-Klassen
Unternehmenspräsentation 23
Abschluss
Unternehmenspräsentation 24
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
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
Ich danke euch für eure Aufmerksamkeit.
Unternehmenspräsentation 27
Weitere JVM-Sprachen: ► Groovy (dyn)
► Clojure (dyn)
► Fantom (stat/dyn)
► JRuby (dyn)
► Gosu (stat)