27
Jug Ancona Onofrio Panzarino Twitter: @onof80 [email protected] http://it.linkedin.com/in/onofriopanzarino http://www.google.com/profiles/onofrio.panzarino

Introduzione a scala prima parte

Embed Size (px)

DESCRIPTION

Introduzione a Scala Meeting Jug Ancona 23-10-2010

Citation preview

Page 2: Introduzione a scala   prima parte

AgendaScala

Scopo del linguaggio

Caratteristiche principali

Demos

Vantaggi vs Java

Scala in practice

Swing

Web

Page 3: Introduzione a scala   prima parte

why Processori sempre più multi-core Le applicazioni devono supportare sempre più

parallelismo per sfruttare la CPU

L’avvento di Web 2.0 porta ad un numero di interazioni tra sistemi sempre più elevato Le applicazioni devono essere sempre più SCALAbili

Soluzioni Sviluppare applicazioni sempre più multi-thread Lock, Shared Memory, Thread Pools, …

Utilizzare paradigmi che supportano scalabilità e parallelismo naturalmente

Page 4: Introduzione a scala   prima parte

why (2) Functional Programming (1930s!)

Oggetti immutabili

Thread safe: no lock

Predicibilità: parallelizzazione

Collaborazione tramite messaggi

No shared memory

Funzioni = oggetti che operano su oggetti

Thread safe: no side effects

Page 5: Introduzione a scala   prima parte

Java developer’s frustrations Value types e Reference types

Collections

Verbosità getFoo(), setFoo()

add(), remove(), register(), unregister()

XML

Casting

NullPointerException

Equals e ==

Operatori?

Multithreading

Page 6: Introduzione a scala   prima parte

SCAlable LAnguage

Martin Odersky

“Designed to grow with demands of its users”

“Runs on JVM”

“All Java libraries”!

A blend of OOP and FP in statically typed language

Statically typed!

… but explicit types in just the right spaces

what

Page 7: Introduzione a scala   prima parte

how Scala = OOP + FP

OOP Objects are responsible for themselves

Class - Trait - Object

Mixin composition

Ogni cosa è un oggetto(anche il nulla!)

FP Le funzioni sono oggetti

Strutture dati immutabili

No side effects

Page 8: Introduzione a scala   prima parte

how (2) Compatibile

Conciso

High level

Statically typed

Meno errori run-time

Meno unit testing (Testing proves presence of errors, not their absence)

Generics

Type inference

Refactoring made easy

Page 9: Introduzione a scala   prima parte

Let’s go!object Program {

def main(args: Array[String]): Unit = {

println(“Hello world!”)

}

}

Page 10: Introduzione a scala   prima parte

object – class - trait Scala supporta le classi class

Scala supporta i singleton nativamente object

Le classi figlie devono specificare esplicitamente i metodi ridefiniti con la keyword override.

I trait sono simili alle interfacce ma ammettono implementazioni parziali o totali

Si possono aggiungere anche molti trait. La risoluzione dei metodi avviene attraverso uno specifico algoritmo.

Page 11: Introduzione a scala   prima parte

val Scala favorisce l’uso di codice scritto in modo

funzionale

Variabili non riassegnabili:

val a : Int = 280

a = 281 // Errore!

val b : MyMutable = new MyMutable(“test”)

b = new MyMutable(“test2”) // Errore!

b.myString = “test2” // Ok

Page 12: Introduzione a scala   prima parte

var Ma sono permesse le variabili riassegnabili

Per esempio nei cicli while e do-while

var i = 0

i = i + 1;

O nelle classi mutabili

Si possono e si dovrebbero sempre evitare

se non ci sono specifiche ragioni (performance, interazione con codice Java esistente, …)

Page 13: Introduzione a scala   prima parte

collections Iterable

Seq

Lists (immutable)

Array (mutable)

ListBuffer (mutable)

ArrayBuffer (mutable)

Queue (mutable | immutable)

Stack (mutable | immutable)

String (immutable)

Set

immutable.Set

immutable.HashSet

mutable.Set

mutable.HashSet

Map

immutable.Map

immutable.HashMap

mutable.Map

mutable.HashMap

Page 14: Introduzione a scala   prima parte

maps val nums = Map("i" ->3, "ii" -> 2)

Crea una mappa

nums.contains("ii") Interroga la mappa

nums("ii") Ottiene un valore dalla mappa

nums += ("vi" -> 6) Aggiunge un elemento

Se la mappa è immutable ritorna una nuova mappa (var) Altrimenti aggiunge l’elemento alla mappa (val o var)

nums – "ii“ rimuove un elemento dalla mappa

Page 15: Introduzione a scala   prima parte

Class e Object

Java e Scala a confronto con le collection

Page 16: Introduzione a scala   prima parte

Funzioni Le funzioni sono oggetti

Possono essere passate come parametri

Essere anonime

Per essere scalabili, non devono avere side-effects:

Concentrare le funzioni di I/O in punti ben precisi del programma

Non cambiare lo stato interno degli oggetti: oggettiimmutabili

Ritornare sempre un valore (nota: tuple)

Page 17: Introduzione a scala   prima parte

Trasformare un algoritmo da stile imperativo in funzionale

Page 18: Introduzione a scala   prima parte

Pattern matching (1) Case classes

case class MyCaseClass(name: String)

Scala fornisce per questo tipo di classi un’implementazione standard:

Un factory method

Tutti gli argomenti della classe sono usati come campi immutabili della stessa

toString, hashCode, equals

Sono un po’ più ingombranti ma forniscono un modo naturale per supportare il pattern matching.

Page 19: Introduzione a scala   prima parte

Pattern matching (2) Si usano le keyword match e case

Simile al classico switch – case, tranne che:

L’argomento di match può essere qualsiasi oggetto

È un’espressione (ritorna sempre un valore)

Lancia un MatchError se il caso non è contemplato

Si può usare un’espressione di default (con wildcard)

L’espressione in case (pattern) può essere qualsiasi oggetto, anche parzialmente specificato

In genere è una case class!

Page 20: Introduzione a scala   prima parte

Pattern matching (3) Essendo un’espressione

Può essere utilizzata come parametro

Può essere usata come partial function

Esempio

val count = myObjects match {

a : Seq[Int] => a.reduceLeft ( _ + _ )

(x : Int, _ ) => x

_ => 1

}

Page 21: Introduzione a scala   prima parte

Realizzare un semplificatore e valutatore di espressioni matematiche

Ricerca in una lista

Page 22: Introduzione a scala   prima parte

Extractors Il metodo apply può essere visto come un modo per trattare

un oggetto come una funzione (funtore) Il metodo unapply può essere visto come la funzione

inversa: dato un risultato ottiene gli argomenti Può essere usato per fare pattern matching:

object EMail {def apply(user: String, domain: String)

= user +"@"+ domaindef unapply(str: String): Option[(String, String)] = {

val parts = str split "@“if (parts.length == 2) Some(parts(0), parts(1)) else None

}}

Page 23: Introduzione a scala   prima parte

Utilizzare un extractor per valutare un’espressione

Page 24: Introduzione a scala   prima parte

operators = methods Identificatore

Uno o più simboli Unicode o ASCII printable characterstranne lettere, cifre, parentesi, underscore, semicolon (;), comma (,), punto (.)

Esempi

+ ++ ::: <?> :-> <::

Si definiscono come normali metodi

Anche unari prefissi

unary_-

Page 25: Introduzione a scala   prima parte

Aggiungere un operatore agli interi

Utilizzo di mappe

Il supporto di Scala per XML

Page 26: Introduzione a scala   prima parte

Riferimenti http://www.scala-lang.org/

M. Odersky, L. Spoon, B. Venners, Programming in Scala, Artima

Completo, chiaro e dettagliato

scala-user mailing list

http://stackoverflow.com/questions/tagged/scala

Blogs

http://debasishg.blogspot.com/

http://james-iry.blogspot.com/

Page 27: Introduzione a scala   prima parte

Riferimenti (2) http://www.artima.com/index.jsp

irc://irc.freenode.net/scala

Le demo:

http://github.com/onof/it.onof.demo.scala

Enjoy with