tesinaTesina (7097346 byte) - Corso di Programmazione Mobile

annuncio pubblicitario
Confronto tra i principali
Linguaggi di Programmazione
per Sistemi Mobile
Biagini Piero - 000657367
Tesina
Programmazione di Sistemi Mobile
Anno Accademico 2014-2015
Docente: Prof. Mirko Ravaioli
Tutor: Nicolò Sordoni, Andrea Marozzi
BIAGINI PIERO
1
Descrizione della tesina
In questa tesina si parlerà dei Linguaggi di Programmazione più utilizzati nei Sistemi
Mobile, ovvero:
• Java (Android)
• C# (Windows Phone)
• Objective-C e Swift (iOS)
Verranno evidenziate somiglianze e differenze riguardanti la sintassi e le funzionalità.
Introduzione
Java
Java è un linguaggio di programmazione orientato agli oggetti
progettato per essere indipendente dalla piattaforma su cui viene
eseguito.
Il progetto nasce nel 1992, inizialmente chiamato Oak poi ribattezzato
nell’attuale Java, all’università di Stanford. Lo sviluppo viene poi
portato avanti dalla Sun Microsystem, in particolare dal team con a capo James Gosling.
La presentazione ufficiale avvenne nel maggio del 1995.
La sintassi di base viene mantenuta pressoché identica a quella del C++ per semplificare il
passaggio da tale linguaggio, ma alcune delle caratteristiche più complesse (es. aritmetica
dei puntatori, ereditarietà multipla, istruzione goto, …) sono state rimosse per rendere
l’utilizzo di Java più semplice e sicuro.
Il linguaggio viene definito in un documento chiamato The Java Language Specifcation (JLS),
pubblicato per la prima volta nel 1996 e in seguito ricevuto e ampliato. Ad oggi la versione
più recente è Java SE 8 Edition.
Uno dei punti di forza del linguaggio è il fatto che, grazie all’utilizzo del processore
virtuale Java Virtual Machine (JVM), il codice “compilato” (bytecode) per una certa
piattaforma non deve essere ricompilato per essere eseguito su un’altra (anche se esistono
alcune classi che sono specifiche, ad esempio, per il sistema operativo su cui vengono
utilizzate).
La JVM è inclusa all’interno del Java Runtime Environment (JRE), necessario per
l’esecuzione del programma compilato.
Java e Android
Java è il linguaggio principale utilizzato per la programmazione di applicazioni Android.
In particolare il comportamento dell’applicazione viene definito, generalmente, da codice
Java, mentre il layout degli oggetti grafici è descritto in XML.
BIAGINI PIERO
2
Non viene, tuttavia, utilizzata la classica JVM, ma ne sono state create
delle versioni specifiche (in particolare Dalvik Virtual Machine fino alla
versione Jelly Bean e ART da KitKat in poi).
Il paradigma di programmazione utilizzato per la costruzione delle
applicazioni è Event Driven, ovvero non esiste un entry point da cui il
programma si avvia, carica ed esegue le sue parti, ma ogni classe è
pensata per essere un componente pilotato dagli eventi. Ciò, se i
componenti sono sufficientemente indipendenti, permette al SO di
ottimizzare l’uso di risorse evitando di caricare componenti non
necessari o, allo stesso tempo, permette la condivisione di funzionalità
(con un meccanismo chiamato Intent).
Le applicazioni per Android vengono distribuite dal Play Store oppure direttamente sotto
forma di APK (un pacchetto contenente i codici da compilare).
IDE
L’IDE di riferimento è Android Studio, un ambiente di sviluppo basato su
IntelliJ IDEA (prodotto da JetBrains). Esso ha sostituito il vecchio Eclisse
Android Development Tools (ADT) basato su Eclipse.
E’ disponibile per tutti i sistemi operativi più diffusi (Windows, Mac OS
X e varie distribuzioni di Linux).
C#
C# è un linguaggio di programmazione orientato agli oggetti
sviluppato da Microsoft all’interno della framework .NET.
Il progetto nasce nel gennaio 1999, quando Anders Hejlsberg
forma un team per lo sviluppo di un nuovo linguaggio di
programmazione Object Oriented C-Like (Cool, C-like Object Oriented Language). E’ stato
in seguito pubblicato nel luglio del 2000 alla Professional Developers Conference dopo
averlo rinominato con il nome attuale e dopo aver riscritto nel nuovo linguaggio le librerie
ASP.NET.
Inizialmente visto come poco più di una copia di Java, a partire dal 2005 (anno di
pubblicazione della seconda versione) ha iniziato sempre più a divergere (se non nei
contenuti, nell’implementazione di essi).
C# non è definibile pienamente né come linguaggio compilato, né come linguaggio
interpretato. In prima istanza il framework converte il programma in un codice
intermedio (detto CIL) e al momento dell’esecuzione il CLR, specifico per il SO, converte il
CIL in codice macchina secondo una compilazione di tipo JIT. E’ tuttavia possibile
adottare anche un tipo di compilazione detto Ngen, che permette di convertire tutto il
codice CIL in codice macchina in una volta sola.
A differenza di Java, la cui JVM (o altra macchina virtuale) è disponibile per più sistemi
operativi diversi, il framework e il CLR sono disponibili solamente per Windows. Esistono
tuttavia alcuni progetti open source non ufficiali come Mono e DotGNU.
BIAGINI PIERO
3
C#e Windows Phone
C# è il principale linguaggio di sviluppo per Windows Phone. Altri
linguaggi utilizzati sono Visual Basic, C++ o JavaScript.
A differenza di Android, le applicazioni sviluppate per Windows Phone
sono universali, ovvero sono in grado di funzionare sia su dispositivi
mobili che su computer (nonostante le applicazioni vengano distribuite
da due store paralleli, rispettivamente Windows Phone Store e Windows
Store). Esse si basano su Windows Runtime.
Oltre al C# un altro linguaggio che deve essere necessariamente
utilizzato per la creazione delle app, in particolare per la descrizione del
layout della varie view,è XAML (eXtensible Application Markup
Language), analogo all’XML di Android ma sviluppato da Microsoft.
IDE
L’IDE di riferimento per la programmazione di applicazioni per Windows
è Visual Studio. Esso è disponibile solamente per Windows. E’ inoltre
necessario, a causa dell’utilizzo di Windows Runtime, utilizzare la
versione di Windows 8.1.
Objective-C
Objective-C è un linguaggio di programmazione orientato agli oggetti,
estensione del precedente linguaggio (non a oggetti) C.
Esso è ispirato al linguaggio Smalltalk e ha una logica e una sintassi
notevolmente diversa da quella degli altri linguaggi OOP più diffusi (Java
e C#), tra cui, per esempio, la gestione dei messaggi tra gli oggetti.
Il progetto nasce all’inizio degli anni ’80 da parte di Brad Cox e Tom Love.
Essi decisero di modificare un compilatore C aggiungendo alcune
caratteristiche prelevate dal linguaggio a oggetti che già conoscevano (Smalltalk) in modo
da permettere, tra l’altro, una maggiore riusabilità del codice. Il linguaggio così creato
prese il nome di OOPC (Object-Oriented Programming in C) e venne presto dotato di
numerose librerie software che consentivano al codice sorgente di essere raccolto in un
solo formato multipiattaforma.
La pubblicazione avvenne nel 1986 con il nome attuale.
Steve Jobs, durante il suo lavoro alle NeXT (fondata dopo Apple) ottenne la licenza
dell’Objective-C e fece realizzare il proprio compilatore e le proprie librerie sulle quali
basò il sistema operativo NeXTSTEP.
Dopo aver comprato NeXT nel 1966 Apple prese come base il SO NeXTStep per
sviluppare il sistema operativo Mac OSX. Tutt’ora le principali API di Apple (Cocoa) sono
basate sugli oggetti di interfaccia OpenStep. In seguito, con l’uscita sul mercato dei
dispositivi mobili, venne creata l’estensione Cocoa Touch.
Objective-C è un linguaggio totalmente compilato.
BIAGINI PIERO
4
Objective-C e iOS
Objective-C è il linguaggio storico per lo sviluppo di applicazioni per
iOS (oggi è in via di sostituzione da Swift, il nuovo linguaggio creato
ad hoc da Apple di cui parleremo in seguito.
Viene utilizzato il framework Foundation Kit. Esso è fedele alle
specifiche di OpenStep (clone open source di NeXTStep), contenuto
all’interno delle Cocoa Touch API.
Cocoa Touch è il framework per costruire l’interfaccia grafica (contiene i
set di controlli ed elementi grafici da usare nelle view) e fornisce al
programmatore un’astrazione del sistema operativo, permettendo di
utilizzare l’hardware presente all’interno degli smartphone e dei tablet
Apple.
L’architettura su cui si basano le applicazioni per iOS è MVC (Model
View Controller).
IDE
L’unico IDE utilizzabile per programmare applicazioni per iOS utilizzando
questo linguaggio è Xcode. Esso è disponibile per le più recenti versioni del
sistema operativo di casa Apple (Mac OSX).
Swift
Swift è il nuovo linguaggio di programmazione per sistemi iOS e OS X
presentato da Apple durante il WWDC 2014. E’ un linguaggio di tipo objectoriented progettato per coesistere con Objective-C (linguaggio tipicamente
utilizzato per gli stessi scopi), ma rendendo la scrittura del codice più
semplice.
Il progetto nasce nel 2010, portato avanti da un team guidato da Chris Lattner. Si ispira
agli altri linguaggi di programmazione più diffusi, come Objective-C, Rust, Haskell, Ruby,
Python, C#, CLU, … La presentazione ufficiale avviene nel 2014, quando viene rilasciata
al pubblico la prima app sviluppata in questo linguaggio.
Swift è un linguaggio di tipo compilato. Grazie al compilatore LLVM è possibile creare
programmi che contengono parti di codice in diversi linguaggi (C, Objective-C, C++ e
Swift).
Il manuale ufficiale del linguaggio può essere trovato sull’iBook Store.
Swift e iOS
Swift sta affiancando Objective-C nella programmazione di dispositivi iOS. Esso ha infatti
il vantaggio di avere una sintassi e un funzionamento notevolmente più semplici e simili
ad altri linguaggi più comuni.
Swift non è, tuttavia, completo: alcune funzionalità devono necessariamente essere
implementate in Objective-C (es. l’utilizzo delle mappe) in quanto ancora non sono state
BIAGINI PIERO
5
scritte librerie adeguate. In questi casi torna utile la possibilità di mescolare moduli scritti
in linguaggio diverso.
Le restanti considerazioni fatte per Objective-C possono essere considerate valide anche
per Swift.
IDE
Come per Objective-C, l’unico IDE utilizzabile è Xcode.
Confronto
Organizzazione dei file
Linguaggio
Descrizione
Java
Il codice sorgente è contenuto all’interno dei file .java. Di norma si utilizza un file per
ogni classe, ma è possibile inserire anche più classi all’interno dello stesso file (lo si fa
quando si utilizzano classi anonime o innestate).
C#
Il codice sorgente è contenuto all'interno dei file .cs. Come in Java, di norma si inserisce
un’unica classe o un’unico namespace all’interno dello stesso file, ma è possibile inserire
due o più classi o namespace all’interno dello stesso file.
Objective-C
Il codice sorgente è diviso in più file:
• .h: file header, contengono la dichiarazione di classi, tipi, funzioni e costanti.
• .m: file sorgente che può contenere codice Objective-C o C. Esso generalmente
implementa classi e funzioni dichiarate nel relativo file header.
• .mm: file sorgente che può contenere codice C++ oltre che Objective-C e C.
Swift
Il codice sorgente è contenuto all'interno dei file .swift. Generalmente si consiglia di
inserire una sola classe all’interno di ogni file, ma non esistono vincoli particolari.
Organizzazione delle classi
Linguaggio
Descrizione
Java
Le classi possono essere raggruppate in package. Essi permettono di dividere le classi in
base, per esempio, a criteri semantici ed eventualmente di limitare la visibilità delle classi
stesse o dei loro metodi o campi.
C#
Le classi possono essere raggruppate in namespace. Sono praticamente analoghi ai
package di Java.
Objective-C
Non è definito un modo particolare per organizzare le varie classi. Eventualmente i file
sorgenti possono essere organizzati per cartella.
Swift
Non è definito un modo particolare per organizzare le varie classi. Eventualmente i file
sorgenti possono essere organizzati per cartella.
BIAGINI PIERO
6
Visibilità di metodi, campi e classi
Linguaggio
Descrizione
Java
•
•
•
•
C#
•
•
•
•
Objective-C
•
•
•
Swift
•
•
•
private: l’elemento è visibile solamente all’interno della stessa classe.
package: l’elemento è visibile solamente all’interno dello stesso package (visibilità di
default)
protected: l’elemento è visibile solamente all’interno della classe stessa oppure dalle sue
sottoclassi.
public: l’elemento è visibile da qualunque parte del codice.
private: l’elemento è visibile solamente all’interno della classe stessa.
internal: l’elemento è visibile solamente all’interno dello stesso assembly.
protected: l’elemento è visibile solamente all’interno della classe stessa oppure dalle sue
sottoclassi.
public: l’elemento è visibile da qualunque parte del codice.
@private: l’elemento è visibile solamente all’interno della classe stessa.
@protected: l’elemento è visibile solamente all’interno della classe stessa oppure dalle
sue sottoclassi.
@public: l’elemento è visibile da qualunque parte del codice.
private: l’elemento è visibile solamente all’interno della classe stessa.
internal: l’elemento è visibile solamente all’interno dello stesso modulo.
public: l’elemento è visibile da qualunque parte del codice.
In Java, C# e Swift è sufficiente apporre, prima del nome dell’elemento che si vuole
limitare, il tipo di visibilità desiderata. In Objective-C la visibilità va invece specificata
nella riga immediatamente prima.
Paradigma a oggetti
Linguaggio
Java
Incapsulamento:
cia
Sì
Ereditarietà
Polimorfismo
Sì, singola
Sì
C#
Sì
Sì, singola
Sì
Objective-C
Sì
Sì, singola
Sì
Swift
Sì
Sì, singola
Sì
Tipi primitivi
Linguaggio
Descrizione
Java
Le variabili dichiarate in questo modo non corrispondono a oggetti e, per questo, non
possono avere valore nullo (al momento della dichiarazione, se non inizializzate
esplicitamente, assumono un valore di default). I tipi disponibili sono byte, short, int, long,
float, double, boolean, char.
Ad ogni tipo primitivo corrisponde anche una classe che fa wrapping. Grazie
all’autoboxing è possibile assegnare semplicemente un un operatore = il valore dei tipi
primitivi alla classe e viceversa.
BIAGINI PIERO
7
Linguaggio
Descrizione
C#
Esistono due classi di tipi: Value Types e Reference Types. I primi sono allocati nello stack e
contengono direttamente il valore (tipi primitivi) mentre i secondi fanno riferimento a
oggetti allocati dinamicamente nello heap (oggetti). Di seguito alcuni esempi di value
types: short, int, long, byte, char, float, double, decimal, bool.
Objective-C
Objective-C utilizza gli stessi tipi primitivi del C, quindi short, int, long, float, double,
BOOL, char.
Swift
Vengono utilizzati gli stessi tipi primitivi di Objective-C: Int, Double, String, …
Gestione della memoria
Linguaggio
Descrizione
Java
Entrambi i linguaggi utilizzano un Garbage Collector automatico: l’utente non ha
possibilità di controllare come viene gestita la memoria ma un sistema automatico
controlla a tempo di esecuzione se gli oggetti possono o meno essere cancellati.
C#
Objective-C
Swift
I linguaggi per dispositivi Apple utilizzano una funzionalità detta ARC (Automatic
Reference Counting). Per ogni oggetto allocato è mantenuto il conteggio dei riferimenti
ad esso. Se il riferimento viene cancellato il contatore viene decrementato mentre se il
riferimento viene creato il contatore viene incrementato. Una volta che ha raggiunto lo 0
si può supporre che nessuno abbia più riferimenti a tale oggetto e che possa, quindi,
essere cancellato. Tale conteggio viene fatto compile-time.
Classi e interfacce
Linguaggio
Descrizione
Java
Ogni classe dichiarata estende da object, ma è possibile anche estendere altre classi.
Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave this
mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super.
E’ possibile anche dichiarare classi statiche.
Una classe può essere dichiarata con una sintassi analoga alla seguente:
public class myClass extends mySuperClass implements myInterface { //fields //methods }
C#
Ogni classe dichiarata estende da object, ma è possibile anche estendere altre classi.
Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave this
mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super.
Un metodo o un campo di classe può essere dichiarato utilizzando la keyword static. E’
possibile anche dichiarare classi statiche.
Una classe può essere dichiarata con una sintassi analoga alla seguente:
public class myClass : mySuperClass, myInterface { //fields //methods }
BIAGINI PIERO
8
Linguaggio
Descrizione
Objective-C
Ogni classe dichiarata deve estendere esplicitamente da una classe base detta oggetto root
(oggetto che non estende da altri oggetti). L’oggetto root più comune è NSObject.
Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave self
mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super.
Un metodo di classe viene dichiarato inserendo un segno (+), mentre un metodo
d’istanza inserendo un segno (-).
Nota particolare per questo linguaggio dev’essere fatta per le interfacce: a differenza
degli altri, infatti, l’interfaccia deve essere obbligatoriamente scritta nel file header. Il file
sorgente importerà tale file e ne definirà l’implementazione.
Una tipica dichiarazione di classe prevede i seguenti costrutti:
//NEL FILE myClass.h @interface MyClass : NSObject { //public fields } //methods @end L’implementazione sarà poi presente all’interno del file .m che importa tale file header
tramite la direttiva #import.
//NEL FILE myClass.m #import “myClass.h” @implementation MyClass { //questa sezione si può omettere //private fields } //methods implementation @end Tramite la tecnica delle categorie è anche possibile aggiungere metodi (ma non campi)a
classi già fatte (sia classi create personalmente che classi di libreria). Per utilizzare questo
metodo bisogna, al momento dell’importazione, specificare entrambi gli header
separandoli con un segno “+” e, nella riga dove si definisce l’implementazione della
classe, specificare tra parentesi tonde la categoria che verrà aggiunta. Non esiste un limite
al numero di categorie che possono essere aggiunte, ma ognuna deve dichiarare e
definire metodi diversi.
Swift
Ogni classe dichiarata deve estendere esplicitamente da una classe base detta oggetto root
(oggetto che non estende da altri oggetti). L’oggetto root più comune è NSObject.
Per riferirsi a componenti della classe stessa può essere utilizzata la parola chiave self
mentre per riferirsi a componenti della superclasse si utilizza la parola chiave super.
Una dichiarazione di classe può essere fatta in questo modo:
public class myClass : mySuperClass, myInterface { //fields //methods }
BIAGINI PIERO
9
Metodi
Linguaggio
Descrizione
Java
La sintassi per la dichiarazione dei metodi è la seguente:
public returnType myMethod(type param1, type param2, …) {…} Un metodo di classe può essere dichiarato utilizzando la keyword static.
Un metodo può essere richiamato tramite la dot notification (nomeDellOggetto.metodo()
per metodi di istanza oppure nomeDellaClasse.metodo() per metodi di classe).
C#
La sintassi per la dichiarazione dei metodi è la seguente:
public returnType myMethod(type param1, type param2, …) {…} Un metodo di classe può essere dichiarato utilizzando la keyword static.
Un metodo può essere richiamato tramite la dot notification (nomeDellOggetto.metodo()
per metodi di istanza oppure nomeDellaClasse.metodo() per metodi di classe).
Objective-C
La sintassi per la dichiarazione dei metodi è la seguente:
-­‐(returnType)methodNameParam1Label:(type)Param1Name Param2Label:(type)Param2Name; //metodo di istanza +(returnType)methodNameParam1Label:(type)Param1Name Param2Label:(type)Param2Name; //metodo di classe A differenza degli altri linguaggi di programmazione in Objective-C non si chiama un
metodo, ma si invia un messaggio. Esso corrisponde alla firma del metodo con, in
aggiunta, le informazioni sui parametri. La sintassi è la seguente:
[myObject methodNameParam1Label:value Param2Label:value];
Swift
La sintassi per la dichiarazione dei metodi è la seguente:
public func myFuncName(param1:Type, param2:Type, …) -­‐> ReturnType {…} Un metodo o un campo di classe può essere dichiarato utilizzando la keyword static.
Un metodo può essere richiamato tramite la dot notification (nomeDellOggetto.metodo()
per metodi di istanza oppure nomeDellaClasse.metodo() per metodi di classe).
In Java, C# e Swift è possibile fare overload dei metodi delle classi semplicemente
aggiungendo la parola chiave override e riprendendo la signature del metodo di cui si
vuole fare overload.
Al contrario, Objective-C non supporta pienamente tale funzione, ma si adotta lo
stratagemma di modificare il primo argomento.
In tutti i linguaggi è inoltre possibile creare classi astratte, ma mentre in Java e in C# non è
possibile poi istanziarle a causa di controlli del compilatore, in Objective-C non è presente
tale limitazione (non esiste infatti distinzione tra classe astratta o meno).
BIAGINI PIERO
10
Dichiarazione di variabili, oggetti e campi
Linguaggio
Descrizione
Java
Per i tipi primitivi: type name = initValue; Per gli oggetti: class name = new Class(params); Nel caso si parli di campi è possibile aggiungere diverse parole chiave, tra cui final
(valore non più modificabile), volatile (utile nel caso la variabile sia condivisa da più
thread, evita inconsistenza), static (campo di classe), …
C#
Per i tipi primitivi: type name = initValue; Per gli oggetti: class name = new Class(params); Nel caso si parli di campi è possibile aggiungere diverse parole chiave, tra cui final,
volatile, static, …
Nel caso di dichiarazione e inizializzazione della variabile sulla stessa riga è possibile
usare la parola chiave var invece del tipo o della classe.
Objective-C
Per i tipi primitivi: type name = initValue; Per gli oggetti: class *name = [[Class alloc] init]; E’ necessario ricordarsi che in Objective-C sono presenti i puntatori. E’ possibile
dichiarare un puntatore semplicemente apponendo un * prima del nome della variabile.
Swift
Per i tipi primitivi: var name:myType = initValue;
Per gli oggetti: var name:Class = Class(paramName:param…); Oltre alla parola chiave var è presente anche la parola chiave let. La differenza è che con la
prima il valore può essere modificato mentre con la seconda no.
Nel caso l’inizializzazione avvenga nello stesso momento della dichiarazione della
variabile, il tipo di dato può essere omesso.
Interfacce e protocolli
Le interfacce (Java e C#) o protocolli (Objective-C) consentono di definire un elenco di
metodi che le classi che implementano l’interfaccia/protocollo dovranno contenere e
implementare. Essi si dichiarano in maniera analoga alle classi ma usando la parola chiave
interface o protocol (a seconda del linguaggio che si sta utilizzando).
BIAGINI PIERO
11
Proprietà
In C# e Objective-C è possibile definire le proprietà, ovvero metodi di accesso ai campi
degli oggetti dichiarabili in maniera veloce.
Linguaggio
Descrizione
C#
type fieldName { { get; } { set; } } Objective-C
@property myType myVariable; All’interno delle parentesi graffe che contengono get e set è possibile specificare delle
operazioni che dovranno essere compiute prima di ottenere il dato o prima
dell’assegnazione. Non è necessario creare entrambi i metodi di accesso.
Tale sintassi è analoga a definire due metodi di accesso, un getter e un setter. Il primo ha
nome uguale al campo mentre il secondo prende il nome di setmyVariable:. E’
eventualmente possibile specificare nomi diversi.
Dopo essere state dichiarate, le proprietà devono essere implementate tramite la keyword
@synthetize.
Enumeration
Linguaggio
Descrizione
Java
public enum MyEnum { elem1, elem2, … } In Java le Enum vengono dichiarate come classi.
I valori possono essere richiamati tramite la dot notification.
C#
enum MyEnum {
elem. = value, elem. = value, …
}
In C# le Enum possono essere dichiarate all’interno delle classi. E’ possibile assegnare un
valore ad ogni elemento.
I valori possono essere richiamati tramite la dot notification.
Objective-C
enum MyEnum { elem1, elem2, … }; E’ poi possibile definire un nuovo tipo di dato per evitare di utilizzare la keyword enum
ogni volta. In questo modo i valori possono essere richiamati semplicemente chiamandoli
per nome.
typedef MyEnumType MyEnum
Swift
enum MyEnum { elem1, elem2, … } I valori possono essere richiamati tramite dot notification.
BIAGINI PIERO
12
Delegate/Closure e Lambda Expression
Linguaggio
Descrizione
Java
Il meccanismo dei delegate non è disponibile in Java.
Le Lambda Expression sono disponibili a partire dalla versione 8 e possono essere
dichiarate con la seguente sintassi:
type lambdaName = (list of params) -­‐> { //statement or block of code } C#
Entrambe le funzionalità sono disponibili in C#.
Per l’utilizzo dei delegate è sufficiente dichiarare una variabile di tipo delegate e assegnare
ad essa un metodo tramite l’operatore =:
returnType myFunction() {…} … delegate returnType delegateName(params) = myFunction(); Le Lambda Expression hanno una sintassi simile a quella di Java:
delegate returnType lambdaName(params) => { //statement or block of code } Objective-C
In Objective-C i delegate prendono il nome di Blocchi o Closure. Possono essere dichiarati
in questo modo:
returnType (^ myBlock)(params); //dichiarazione del prototipo myBlock = ^(params) { //code }; Il blocco così dichiarato può essere utilizzato, utilizzato direttamente o anche passato
come parametro.
Swift
Come in C#, per la creazione di un delegate è sufficiente assegnare ad una variabile un
metodo creato in precedenza oppure un metodo anonimo creato con la seguente sintassi:
var myClosure = { (parameters) -­‐> returnType in //statements }
BIAGINI PIERO
13
Scarica