27
Programming in Scala

Nigh Session Scala

Embed Size (px)

DESCRIPTION

Diese Präsentation zeigt eine Einführung in die Programmiersprache Scala.

Citation preview

Page 1: Nigh Session Scala

Programming in Scala

Page 2: Nigh Session 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

Page 3: Nigh Session 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

Page 4: Nigh Session 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

Page 5: Nigh Session Scala

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

Page 6: Nigh Session Scala

I – Spracheinführung

Eine Einführung von Martin Odersky

Unternehmenspräsentation 6

Martin Odersky, FOSDEM 2009

A  Scalable  Language

Martin OderskyFOSDEM 2009

Page 7: Nigh Session Scala

II - Scripting

►  Scripting mit Scala

Unternehmenspräsentation 7

Page 8: Nigh Session Scala

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

Page 9: Nigh Session Scala

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

Page 10: Nigh Session Scala

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

Page 11: Nigh Session Scala

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 }

Page 12: Nigh Session Scala

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

Page 13: Nigh Session Scala

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

Page 14: Nigh Session Scala

III - Application Development

►  Application Development

Unternehmenspräsentation 14

Page 15: Nigh Session Scala

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

Page 16: Nigh Session Scala

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

Page 17: Nigh Session Scala

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

Page 18: Nigh Session Scala

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

Page 19: Nigh Session Scala

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

Page 20: Nigh Session Scala

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

Page 21: Nigh Session Scala

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

Page 22: Nigh Session 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“)

Page 23: Nigh Session Scala

Livecoding

Themen

►  Objektorientierung

►  Funktionale Programmierung mit Case-Klassen / Pattern Matching

►  Integration mit Java-Klassen

Unternehmenspräsentation 23

Page 24: Nigh Session Scala

Abschluss

Unternehmenspräsentation 24

Page 25: Nigh Session Scala

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

Page 26: Nigh Session 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

Page 27: Nigh Session 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)