SlideShare una empresa de Scribd logo
1 de 35
Descargar para leer sin conexión
Scala Language




  Dessì Massimiliano

  Linux Day Cagliari
   24 ottobre 2009
Author
    Software Architect and Engineer
        ProNetics / Sourcesense

              Presidente
          JugSardegna Onlus

        Fondatore e coordinatore
  SpringFramework Italian User Group

      Committer - Contributor
  OpenNMS - MongoDB - MagicBox

                 Autore
Spring 2.5 Aspect Oriented Programming
Topics

  Quanti core per processore ci sono sul server
          su cui metti le tue applicazioni ?
   La tua applicazione gestisce la concorrenza ?
 Il tuo codice è scritto pensando alla scalabilità ?
Consideri questi aspetti quando scrivi il tuo codice ?


          Se hai riposto affermativamente
    fermati ad ascoltare questa presentazione
SCAlable LAnguage

 E' un linguaggio funzionale
       ad oggetti puro.
   Ogni cosa è un oggetto.
    Non ci sono primitive.
Gira sulla Java Virtual Machine
Funzionale vs Imperativo

   I linguaggi funzionali dicono
  cosa deve fare il programma


Java e i linguaggi Object Oriented
         sono imperativi,
     dicono come deve farlo
SCALA - best of both


In Scala, paradigma funzionale e Object oriented
              sono complementari.
    Invita ad utilizzare l'approccio funzionale,
            ma non vincola le scelte.
               Tutto è un oggetto
               funzioni comprese.
Scala


Scala può essere utilizzato sia come linguaggio di scripting,
          sia come linguaggio ad alta concorrenza
   Possiede le caratteristiche di un linguaggio dinamico
 Con la velocità di un linguaggio statico e tipizzato, grazie
            alla inferenza si può scrivere codice
                     molto più coinciso
Scala Inference

   Scala è un linguaggio
 low-ceremony, static typing

    var anno: Int = 2009
    var altroAnno = 2009
    var saluto = "Ciao mondo"

  quando definiamo il tipo
  compare su un solo lato
    nella assegnazione
var builder = new StringBuilder("hello" )
Scala Inference


Scala attraverso l' inferenza, quando
    non specificato, comprende
  anche il tipo di ritorno dei metodi


         def   metodoUno() {   2 }
         def   metodoDue() =   { 4 }
         def   metodoTre() =   6
         def   metodoQuattro   : Double = 8
Java
public class Persona {

    private String nome, cognome;
    private int eta;

    public Persona(String nome, int eta, String cognome) {
        this.nome = nome;
        this.eta = eta;
        this.cognome = cognome;
    }

    public String getNome() {
        return nome;
    }

    public int getEta() {
        return eta;
    }

    public void setEta(int eta) {
        this.eta = eta;
    }

    public String getCognome() {
        return cognome;
    }
}
Scala

case class Persona(val nome: String, var eta: Int, val cognome: String)


           Il compilatore scala se non dichiariamo altro,
                   genera di default (case Class):
                             toString,
                             hashCode,
                              equals,
                 Costruttore con i parametri dichiarati
                   getter dei parametri definti val
                setter e getter dei parametri defini var
Scala
                              scalac Person.scala
                             javap -private Person


Compiled from "Person.scala"
public class org.magicbox.domain.Person extends java.lang.Object implements
scala.ScalaObject,scala.Product,java.io.Serializable{
    private final java.lang.String cognome;
    private int eta;
    private final java.lang.String nome;
    public org.magicbox.domain.Person(java.lang.String, int, java.lang.String);
    private final boolean gd1$1(java.lang.String, int, java.lang.String);
    public java.lang.Object productElement(int);
    public int productArity();
    public java.lang.String productPrefix();
    public boolean equals(java.lang.Object);
    public java.lang.String toString();
    public int hashCode();
    public int $tag();
    public java.lang.String cognome();
    public void eta_$eq(int);
    public int eta();
    public java.lang.String nome();
}
Scala

Se invece vogliamo anche la convenzione classica JavaBean
                         get<nome>
                         set<nome>
                   Utilizziamo l'annotazione

                  @scala.reflect.BeanProperty

case class Person(@scala.reflect.BeanProperty val nome: String,
                  @scala.reflect.BeanProperty var eta: Int,
                  @scala.reflect.BeanProperty val cognome: String)
Scala
                                scalac Person.scala
                               javap -private Person
Compiled from "Person.scala"
public class org.magicbox.domain.Person extends java.lang.Object implements
scala.ScalaObject,scala.Product,java.io.Serializable{
    private final java.lang.String cognome;
    private int eta;
    private final java.lang.String nome;
    public org.magicbox.domain.Person(java.lang.String, int, java.lang.String);
    private final boolean gd1$1(java.lang.String, int, java.lang.String);
    public java.lang.String getCognome();
    public void setEta(int);
    public int getEta();
    public java.lang.String getNome();
    public java.lang.Object productElement(int);
    public int productArity();
    public java.lang.String productPrefix();
    public boolean equals(java.lang.Object);
    public java.lang.String toString();
    public int hashCode();
    public int $tag();
    public java.lang.String cognome();
    public void eta_$eq(int);
    public int eta();
    public java.lang.String nome();
}
Val e Var

               Scala favorisce l' immutabilità.
Questo significa assegnare i valori definitivi al momento della
           creazione per non avere “side-effects”.
  Per ottenere questo risultato utilizziamo la keyword val.
Quando usiamo val, il compilatore creerà una variabile final.
Se invece abbiamo necessità di poter riassegnare dei valori
        utilizziamo var, ma è consigliabile utilizzare
 il più possibile val per scrivere codice in stile funzionale
Singleton
        Posso avere una sola istanza (per classloader)
                   con la keyword Object,
   l' oggetto è già pronto all' uso senza essere istanziato.
         class Marcatore private(val color: String) {
             override def toString() : String = "colore marcatore " + color
         }

         object Marcatore {
             private val marcatori = Map(
                 "red" -> new Marcatore("red" ),
                 "blue" -> new Marcatore("blue" ),
                 "green" -> new Marcatore("green" ))

             def getMarcatore(colore: String) =
             if (marcatori.contains(colore)) marcatori(colore) else null

         }

In questo caso object Marcatore agisce anche da Companion
                 Object di class Marcatore
Gerarchia e alcune keyword

            Any è il tipo base
Classi figlie di Any sono AnyVal e AnyRef
    AnyVal mappa i tipi primitivi Java
      AnyRef mappa i tipi reference
Alla fine della gerarchia abbiamo Nothing
         Unit corrisponde al void
Traits

Sono come le interfacce Java ma con una parziale
                implementazione
       Ci consentono di avere i benefici
           della ereditarietà multipla,
    ovvero avere classi con più funzionalità,
        ma senza i corrispettivi problemi.
 Vengono usate anche per la creazione di DSL
Traits
trait Amico {
   val nome: String
   def ascolta() = println("Il tuo amico " + name + " ti ascolta" )
}

class Umano(val nome: String) extends Amico

class Uomo(override val nome: String) extends Umano(nome)

class Donna(override val nome: String) extends Umano(name)

class Animale

trait Verso {
   val verso: String
   def tono() = println("sgnanfuz" )
}

class Cane(val nome: String) extends Animale with Amico with Verso {
   override def ascolta = println(nome + " ascolta in silenzio" )
   override def tono = println("basso" )
    val verso = "bau bau"
}
Pattern Matching e XML


                Scala utilizza il pattern matching
               in maniera molto estesa, l'utilizzo
                      più comune è quello
       con gli Actor che vedremo nelle pagine seguenti.
Per l' XML Scala fornisce il supporto nativo per la dichiarazione,
    lettura, lettura da file e ovviamente creazione/scrittura.
Collection


Scala fornisce collection basate su quelle Java, sia di tipo
                immutabile che mutabile.
   I tipi principali sono map, sequenze e liste, ma tutte
               arricchite nelle funzionalità.
        Anche nel caso delle collection lo scopo è
         fornire collezioni per l'alta concorrenza.
Function value
          Possiamo passare una funziona come parametro

def store(arr: Array[Int], start: Int, funzione: (Int, Int) => Int) :
Int = {
   var precedente = start
   arr.foreach(element => precedente = funzione(precedente, element) )
   precedente
}


Passando funzioni anonime diverse possiamo avere:

scala> val array = Array(2, 3, 5, 1, 6, 4, 13)

scala> val somma = store(array, 0, (precedente, elem) => precedente + elem)
somma: Int = 34

scala> val max = store(array, Integer.MIN_VALUE, (precedente, elem) =>
Math.max(precedente, elem))
max: Int = 13
Function value
        Possiamo anche ordinare meglio riusando le funzioni


def somma(precedente: Int, elem : Int) = { precedente + elem }

def max(precedente: Int, elem : Int) = { Math.max(precedente, elem)}


scala> val sum = store(array, 0, somma)
sum: Int = 34

scala> val massimo = store(array, Integer.MIN_VALUE, max)
massimo: Int = 13
Concorrenza
Scala Concurrency



Scala rende semplice la programmazione multithread.
            I thread comunicano tra loro
          utilizzando un modello ad eventi
   per inviarsi oggetti immutabili come messaggi.
Actors

     Gli actors sono unità di esecuzione
           threadless e stackless
     che processano messaggi (eventi)
             in maniera seriale.
Un actor riceve i messaggi nella sua mailbox,
          li processa uno alla volta
            in maniera asincrona
         prendendoli dalla mailbox.
Actors


 Un actor non esponendo nessuno stato
    e venendo modificato o interrogato
          attraverso i messaggi,
  che sono processati in maniera seriale
non ha bisogno di lock sul suo stato interno
          ed è perciò thread safe
Actor
class FooActor extends Actor {


    def act() = {
        var control = true
        while (control) {
            react {
                case "mailbox" => println("Mailbox: " + mailbox.toString)
                case "quit" =>    {
                      println("spengo questo FooActor")
                      control = false
                  }
                case i: Int => println("Ho ricevuto un Int: " + i.toString)
                case _ => println("Nulla di particolare.")
            }
        }
    }
}
Actor

object Test{
    def main(args: Array[String]) {
        val foo = new FooActor()
        foo.start
        foo ! “mailbox”
        foo ! 1
        foo ! 12
        foo ! 20
        foo ! ”mailbox”
        System.exit(0)
    }
}
Scala - IntelliJ IDEA
Scala - Netbeans
Scala - Eclipse
Demo concorrenza



Una negozio da barbiere
        3 sedie
      1 barbiere
       n-clienti
Domande ?
Grazie per l'attenzione !

      Massimiliano Dessì
      desmax74 at yahoo.it
 massimiliano.dessi at pronetics.it

                  http://twitter.com/desmax74
                   http://jroller.com/desmax
             http://www.linkedin.com/in/desmax74
              http://www.slideshare.net/desmax74
     http://wiki.java.net/bin/view/People/MassimilianoDessi
 http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi

Más contenido relacionado

La actualidad más candente

La actualidad más candente (11)

Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai framework
 
Programming iOS lezione 3
Programming iOS lezione 3Programming iOS lezione 3
Programming iOS lezione 3
 
Ajax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni webAjax - Presente e futuro delle applicazioni web
Ajax - Presente e futuro delle applicazioni web
 
Entity Framework 6 for developers, Code-First!
Entity Framework 6 for developers, Code-First!Entity Framework 6 for developers, Code-First!
Entity Framework 6 for developers, Code-First!
 
Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei d...
Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei d...Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei d...
Back to Basics, webinar 3: Riflessioni sulla progettazione degli schemi nei d...
 
Back to Basics, webinar 4: Indicizzazione avanzata, indici testuali e geospaz...
Back to Basics, webinar 4: Indicizzazione avanzata, indici testuali e geospaz...Back to Basics, webinar 4: Indicizzazione avanzata, indici testuali e geospaz...
Back to Basics, webinar 4: Indicizzazione avanzata, indici testuali e geospaz...
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
Corso avanzato di Tecnologie WEB - jquery e d3js
Corso avanzato di Tecnologie WEB - jquery e d3jsCorso avanzato di Tecnologie WEB - jquery e d3js
Corso avanzato di Tecnologie WEB - jquery e d3js
 
Office & VBA - Giorni 4 e 5
Office & VBA - Giorni 4 e 5Office & VBA - Giorni 4 e 5
Office & VBA - Giorni 4 e 5
 
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
No sql introduzione. Corso Sistemi Informativi Politecnico di Milano 12-11-2013
 

Similar a Scala Programming Linux Day 2009

Similar a Scala Programming Linux Day 2009 (20)

Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parte
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Corso Java
Corso JavaCorso Java
Corso Java
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
Diversamente Javascript: si.. può.. fare! (di Mirko Ravaioli)
 
Java5
Java5Java5
Java5
 
What's Big Data? - Big Data Tech - 2015 - Firenze
What's Big Data? - Big Data Tech - 2015 - FirenzeWhat's Big Data? - Big Data Tech - 2015 - Firenze
What's Big Data? - Big Data Tech - 2015 - Firenze
 
Hibernatesearch
HibernatesearchHibernatesearch
Hibernatesearch
 
Java 8
Java 8Java 8
Java 8
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Cattive abitudini e-lineeguida
Cattive abitudini e-lineeguidaCattive abitudini e-lineeguida
Cattive abitudini e-lineeguida
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
2016 02-24 - Piattaforme per i Big Data
2016 02-24 - Piattaforme per i Big Data2016 02-24 - Piattaforme per i Big Data
2016 02-24 - Piattaforme per i Big Data
 
Eclipse emf
Eclipse emfEclipse emf
Eclipse emf
 
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
Enrico Zimuel - PUG Milano meetup - Codemotion Milan 2017
 

Más de Massimiliano Dessì

Más de Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 

Scala Programming Linux Day 2009

  • 1. Scala Language Dessì Massimiliano Linux Day Cagliari 24 ottobre 2009
  • 2. Author Software Architect and Engineer ProNetics / Sourcesense Presidente JugSardegna Onlus Fondatore e coordinatore SpringFramework Italian User Group Committer - Contributor OpenNMS - MongoDB - MagicBox Autore Spring 2.5 Aspect Oriented Programming
  • 3. Topics Quanti core per processore ci sono sul server su cui metti le tue applicazioni ? La tua applicazione gestisce la concorrenza ? Il tuo codice è scritto pensando alla scalabilità ? Consideri questi aspetti quando scrivi il tuo codice ? Se hai riposto affermativamente fermati ad ascoltare questa presentazione
  • 4. SCAlable LAnguage E' un linguaggio funzionale ad oggetti puro. Ogni cosa è un oggetto. Non ci sono primitive. Gira sulla Java Virtual Machine
  • 5. Funzionale vs Imperativo I linguaggi funzionali dicono cosa deve fare il programma Java e i linguaggi Object Oriented sono imperativi, dicono come deve farlo
  • 6. SCALA - best of both In Scala, paradigma funzionale e Object oriented sono complementari. Invita ad utilizzare l'approccio funzionale, ma non vincola le scelte. Tutto è un oggetto funzioni comprese.
  • 7. Scala Scala può essere utilizzato sia come linguaggio di scripting, sia come linguaggio ad alta concorrenza Possiede le caratteristiche di un linguaggio dinamico Con la velocità di un linguaggio statico e tipizzato, grazie alla inferenza si può scrivere codice molto più coinciso
  • 8. Scala Inference Scala è un linguaggio low-ceremony, static typing var anno: Int = 2009 var altroAnno = 2009 var saluto = "Ciao mondo" quando definiamo il tipo compare su un solo lato nella assegnazione var builder = new StringBuilder("hello" )
  • 9. Scala Inference Scala attraverso l' inferenza, quando non specificato, comprende anche il tipo di ritorno dei metodi def metodoUno() { 2 } def metodoDue() = { 4 } def metodoTre() = 6 def metodoQuattro : Double = 8
  • 10. Java public class Persona { private String nome, cognome; private int eta; public Persona(String nome, int eta, String cognome) { this.nome = nome; this.eta = eta; this.cognome = cognome; } public String getNome() { return nome; } public int getEta() { return eta; } public void setEta(int eta) { this.eta = eta; } public String getCognome() { return cognome; } }
  • 11. Scala case class Persona(val nome: String, var eta: Int, val cognome: String) Il compilatore scala se non dichiariamo altro, genera di default (case Class): toString, hashCode, equals, Costruttore con i parametri dichiarati getter dei parametri definti val setter e getter dei parametri defini var
  • 12. Scala scalac Person.scala javap -private Person Compiled from "Person.scala" public class org.magicbox.domain.Person extends java.lang.Object implements scala.ScalaObject,scala.Product,java.io.Serializable{ private final java.lang.String cognome; private int eta; private final java.lang.String nome; public org.magicbox.domain.Person(java.lang.String, int, java.lang.String); private final boolean gd1$1(java.lang.String, int, java.lang.String); public java.lang.Object productElement(int); public int productArity(); public java.lang.String productPrefix(); public boolean equals(java.lang.Object); public java.lang.String toString(); public int hashCode(); public int $tag(); public java.lang.String cognome(); public void eta_$eq(int); public int eta(); public java.lang.String nome(); }
  • 13. Scala Se invece vogliamo anche la convenzione classica JavaBean get<nome> set<nome> Utilizziamo l'annotazione @scala.reflect.BeanProperty case class Person(@scala.reflect.BeanProperty val nome: String, @scala.reflect.BeanProperty var eta: Int, @scala.reflect.BeanProperty val cognome: String)
  • 14. Scala scalac Person.scala javap -private Person Compiled from "Person.scala" public class org.magicbox.domain.Person extends java.lang.Object implements scala.ScalaObject,scala.Product,java.io.Serializable{ private final java.lang.String cognome; private int eta; private final java.lang.String nome; public org.magicbox.domain.Person(java.lang.String, int, java.lang.String); private final boolean gd1$1(java.lang.String, int, java.lang.String); public java.lang.String getCognome(); public void setEta(int); public int getEta(); public java.lang.String getNome(); public java.lang.Object productElement(int); public int productArity(); public java.lang.String productPrefix(); public boolean equals(java.lang.Object); public java.lang.String toString(); public int hashCode(); public int $tag(); public java.lang.String cognome(); public void eta_$eq(int); public int eta(); public java.lang.String nome(); }
  • 15. Val e Var Scala favorisce l' immutabilità. Questo significa assegnare i valori definitivi al momento della creazione per non avere “side-effects”. Per ottenere questo risultato utilizziamo la keyword val. Quando usiamo val, il compilatore creerà una variabile final. Se invece abbiamo necessità di poter riassegnare dei valori utilizziamo var, ma è consigliabile utilizzare il più possibile val per scrivere codice in stile funzionale
  • 16. Singleton Posso avere una sola istanza (per classloader) con la keyword Object, l' oggetto è già pronto all' uso senza essere istanziato. class Marcatore private(val color: String) { override def toString() : String = "colore marcatore " + color } object Marcatore { private val marcatori = Map( "red" -> new Marcatore("red" ), "blue" -> new Marcatore("blue" ), "green" -> new Marcatore("green" )) def getMarcatore(colore: String) = if (marcatori.contains(colore)) marcatori(colore) else null } In questo caso object Marcatore agisce anche da Companion Object di class Marcatore
  • 17. Gerarchia e alcune keyword Any è il tipo base Classi figlie di Any sono AnyVal e AnyRef AnyVal mappa i tipi primitivi Java AnyRef mappa i tipi reference Alla fine della gerarchia abbiamo Nothing Unit corrisponde al void
  • 18. Traits Sono come le interfacce Java ma con una parziale implementazione Ci consentono di avere i benefici della ereditarietà multipla, ovvero avere classi con più funzionalità, ma senza i corrispettivi problemi. Vengono usate anche per la creazione di DSL
  • 19. Traits trait Amico { val nome: String def ascolta() = println("Il tuo amico " + name + " ti ascolta" ) } class Umano(val nome: String) extends Amico class Uomo(override val nome: String) extends Umano(nome) class Donna(override val nome: String) extends Umano(name) class Animale trait Verso { val verso: String def tono() = println("sgnanfuz" ) } class Cane(val nome: String) extends Animale with Amico with Verso { override def ascolta = println(nome + " ascolta in silenzio" ) override def tono = println("basso" ) val verso = "bau bau" }
  • 20. Pattern Matching e XML Scala utilizza il pattern matching in maniera molto estesa, l'utilizzo più comune è quello con gli Actor che vedremo nelle pagine seguenti. Per l' XML Scala fornisce il supporto nativo per la dichiarazione, lettura, lettura da file e ovviamente creazione/scrittura.
  • 21. Collection Scala fornisce collection basate su quelle Java, sia di tipo immutabile che mutabile. I tipi principali sono map, sequenze e liste, ma tutte arricchite nelle funzionalità. Anche nel caso delle collection lo scopo è fornire collezioni per l'alta concorrenza.
  • 22. Function value Possiamo passare una funziona come parametro def store(arr: Array[Int], start: Int, funzione: (Int, Int) => Int) : Int = { var precedente = start arr.foreach(element => precedente = funzione(precedente, element) ) precedente } Passando funzioni anonime diverse possiamo avere: scala> val array = Array(2, 3, 5, 1, 6, 4, 13) scala> val somma = store(array, 0, (precedente, elem) => precedente + elem) somma: Int = 34 scala> val max = store(array, Integer.MIN_VALUE, (precedente, elem) => Math.max(precedente, elem)) max: Int = 13
  • 23. Function value Possiamo anche ordinare meglio riusando le funzioni def somma(precedente: Int, elem : Int) = { precedente + elem } def max(precedente: Int, elem : Int) = { Math.max(precedente, elem)} scala> val sum = store(array, 0, somma) sum: Int = 34 scala> val massimo = store(array, Integer.MIN_VALUE, max) massimo: Int = 13
  • 25. Scala Concurrency Scala rende semplice la programmazione multithread. I thread comunicano tra loro utilizzando un modello ad eventi per inviarsi oggetti immutabili come messaggi.
  • 26. Actors Gli actors sono unità di esecuzione threadless e stackless che processano messaggi (eventi) in maniera seriale. Un actor riceve i messaggi nella sua mailbox, li processa uno alla volta in maniera asincrona prendendoli dalla mailbox.
  • 27. Actors Un actor non esponendo nessuno stato e venendo modificato o interrogato attraverso i messaggi, che sono processati in maniera seriale non ha bisogno di lock sul suo stato interno ed è perciò thread safe
  • 28. Actor class FooActor extends Actor { def act() = { var control = true while (control) { react { case "mailbox" => println("Mailbox: " + mailbox.toString) case "quit" => { println("spengo questo FooActor") control = false } case i: Int => println("Ho ricevuto un Int: " + i.toString) case _ => println("Nulla di particolare.") } } } }
  • 29. Actor object Test{ def main(args: Array[String]) { val foo = new FooActor() foo.start foo ! “mailbox” foo ! 1 foo ! 12 foo ! 20 foo ! ”mailbox” System.exit(0) } }
  • 33. Demo concorrenza Una negozio da barbiere 3 sedie 1 barbiere n-clienti
  • 35. Grazie per l'attenzione ! Massimiliano Dessì desmax74 at yahoo.it massimiliano.dessi at pronetics.it http://twitter.com/desmax74 http://jroller.com/desmax http://www.linkedin.com/in/desmax74 http://www.slideshare.net/desmax74 http://wiki.java.net/bin/view/People/MassimilianoDessi http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi