POLITECNICO DI MILANO · 2.5 Esempio di progetto Xamarin in Visual Studio. . . . . . . . . . . . ....
Transcript of POLITECNICO DI MILANO · 2.5 Esempio di progetto Xamarin in Visual Studio. . . . . . . . . . . . ....
POLITECNICO DI MILANO
Scuola di Ingegneria Industriale e dell’Informazione
Dipartimento di Elettronica, Informatica e Bioingegneria
Corso di Laurea Magistrale in Computer Science and Engineering
2.2 . | il marchio, il logotipo: le declinaZioni
Generazione automatica di applicazioni
mobili native secondo un approccio
model-driven
Relatore: Prof. Luciano BARESI
Tesi di Laurea di:
Aldo PINTUS Matr. 823545
Anno Accademico 2015-2016
Un ringraziamento speciale va ai miei genitori, per avermi permesso di essere qui a
portare a termine il primo grande traguardo della mia vita. Grazie Papa, per avermi
dato tutto e avermi reso cio che sono, grazie Mamma per il tuo sostegno infinito e la
fiducia che hai sempre dimostrato nei miei confronti, e grazie anche a te Daniela, che
mi hai insegnato cosa significhino il sacrificio e la passione di inseguire un sogno.
Grazie a te Chiara, che nonostante tutti i miei difetti, sei sempre qui accanto a me
e hai saputo rendermi una persona migliore. Spero di condividere tanti altri traguardi
importanti della mia vita insieme a te.
Grazie ai miei amici di sempre, che sono un punto di riferimento ormai da molti
anni e che hanno condiviso con me tanti momenti felici, e grazie ai miei compagni
di universita, con cui ho speso forse troppo poco tempo al Politecnico, ma che mi han
dato la forza di andare avanti, tra un esame andato male e una partita ai videogame
in pausa pranzo.
Infine un ringraziamento sincero va al Professor Luciano Baresi, che mi ha permesso
di unire il lavoro con la mia grande passione per le tecnologie web e mobile, alleggerendo
le fatiche di questi mesi e regalandomi davvero tanto entusiasmo e soddisfazione.
Aldo
Indice
1 Introduzione 1
2 Contesto generale 4
2.1 Stato dell’arte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.1 Applicazioni di prototipizzazione . . . . . . . . . . . . . . . . . 5
2.1.2 Applicazioni per sviluppatori . . . . . . . . . . . . . . . . . . . . 9
2.1.2.1 Applicazioni multipiattaforma ibride . . . . . . . . . . 9
2.1.2.2 Applicazioni cross-compilate o interpretate . . . . . . . 10
2.1.2.3 Applicazioni native . . . . . . . . . . . . . . . . . . . . 13
2.2 Obiettivo della tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Soluzione proposta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3 Generazione del modello astratto 19
3.1 Protocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.1 Librerie software . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1.2 Architettura software originale . . . . . . . . . . . . . . . . . . . 24
3.1.2.1 Routing . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.2.2 Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.2.3 Controller . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.2.4 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1.3 Interfaccia grafica dell’applicazione . . . . . . . . . . . . . . . . 32
3.2 Aggiornamento di Protocode . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.1 Design della logica applicativa . . . . . . . . . . . . . . . . . . . 37
3.2.1.1 Routing . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.1.2 Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.1.3 Controller . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.2.1.4 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.2.2 Aggiornamento dell’interfaccia grafica . . . . . . . . . . . . . . . 56
3.3 Generazione del modello . . . . . . . . . . . . . . . . . . . . . . . . . . 64
I
4 Traduzione in codice nativo 72
4.1 MobileCodeGenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.1.1 Epsilon Suite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.1.1.1 Eclipse Modeling Framework . . . . . . . . . . . . . . 73
4.1.1.2 openArchitectureWare . . . . . . . . . . . . . . . . . . 74
4.1.2 Struttura del progetto . . . . . . . . . . . . . . . . . . . . . . . 77
4.1.2.1 Metamodello dell’applicazione mobile . . . . . . . . . . 78
4.1.2.2 Templates di traduzione . . . . . . . . . . . . . . . . . 79
4.2 Traduzione in codice nativo . . . . . . . . . . . . . . . . . . . . . . . . 86
5 Valutazione 98
5.1 Analisi quantitativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.1.1 Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.1.2 iOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.1.3 Considerazioni finali . . . . . . . . . . . . . . . . . . . . . . . . 106
5.2 Analisi qualitativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
6 Conclusioni 112
6.1 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Bibliografia 116
Appendice A 121
II
Elenco delle figure
2.1 Interfaccia grafica di FluidUI . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Interfaccia grafica di Proto.io . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Interfaccia grafica di InvisionApp . . . . . . . . . . . . . . . . . . . . . 7
2.4 Interfaccia grafica di Pixate . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 Esempio di progetto Xamarin in Visual Studio . . . . . . . . . . . . . . 11
2.6 Esempio di classe Java generata con Titanium . . . . . . . . . . . . . . 12
3.1 Struttura di Protocode . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Modello logico di Protocode . . . . . . . . . . . . . . . . . . . . . . . . 26
3.3 Schema dei controller di Protocode . . . . . . . . . . . . . . . . . . . . 29
3.4 Gerarchia delle view di Protocode . . . . . . . . . . . . . . . . . . . . . 31
3.5 Anteprima applicazione Android su Protocode . . . . . . . . . . . . . . 32
3.6 Anteprima applicazione iOS su Protocode . . . . . . . . . . . . . . . . 33
3.7 Modello logico finale di Protocode . . . . . . . . . . . . . . . . . . . . . 40
3.8 Schema dei controller finale di Protocode . . . . . . . . . . . . . . . . . 53
3.9 Gerarchia finale delle view di Protocode . . . . . . . . . . . . . . . . . 55
3.10 Anteprima applicazione smartphone Android su Protocode . . . . . . . 56
3.11 Anteprima applicazione smartwatch WatchOS su Protocode . . . . . . 57
4.1 Meccanismo di traduzione di MobileCodeGenerator . . . . . . . . . . . 74
4.2 Struttra del progetto di MobileCodeGenerator . . . . . . . . . . . . . . 77
5.1 Modello dell’applicazione ParkTraining su smartphone . . . . . . . . . 99
5.2 Modello dell’applicazione ParkTraining su smartwatch . . . . . . . . . . 100
5.3 Applicazione ParkTraining simulata su Apple Watch 42mm . . . . . . . 102
5.4 Applicazione ParkTraining simulata su iPhone6s Plus - 1 . . . . . . . . 102
5.5 Applicazione ParkTraining simulata su iPhone6s Plus - 2 . . . . . . . . 103
5.6 Immagini a confronto della schermata chat di WhatsApp . . . . . . . . 109
5.7 Immagini a confronto della schermata dettaglio chat di WhatsApp . . . 110
5.8 Immagini a confronto della schermata impostazioni di WhatsApp . . . 110
III
Elenco delle tabelle
3.1 Tabella dei widget di Protocode . . . . . . . . . . . . . . . . . . . . . . 36
3.2 Tabella dei widget smartphone nella versione finale di Protocode . . . . 61
3.3 Tabella dei widget smartwatch nella versione finale di Protocode . . . . 63
4.1 Tabella dei widget smartphone tradotti con MobileCodeGenerator . . . 94
4.2 Tabella dei widget smartwatch tradotti con MobileCodeGenerator . . . 96
5.1 Copertura codice sorgente ParkTraining Android Studio . . . . . . . . 105
5.2 Copertura codice sorgente ParkTraining Xcode . . . . . . . . . . . . . . 106
IV
Sommario
I dispositivi mobili sono oramai diventati uno strumento indispensabile nella vita di
tutti i giorni e il loro mercato e costantemente in crescita: la piu grande rivoluzione a cui
stiamo assistendo negli ultimi anni e la nascita e diffusione degli smartwatches, ovvero
gli orologi intelligenti, che non sono piu solo semplici estensioni dello smartphone, ma
veri e propri dispositivi indipendenti. I colossi del mercato, Apple e Google, permettono
oggi di creare applicazioni mobili per entrambi i dispositivi, ma i costi di progettazione
della stessa applicazione per entrambe le piattaforme, iOS e Android, sono spesso il
motivo per cui si rinuncia alla potenza dello sviluppo in codice nativo, in favore di
altre soluzioni ibride. Il lavoro svolto in questa tesi, consiste nel creare uno strumento
che permetta di generare applicazioni mobili per le suddette piattaforme, traducendo
in codice nativo un unico modello astratto dell’applicazione, realizzato semplicemente
attraverso un editor grafico: questo approccio, chiamato model-driven, permettera di
generare la stessa applicazione sia per iOS che per Android a partire da un unico
modello iniziale, dimezzando quindi i tempi di sviluppo del software almeno nelle sue
fasi preliminari. Viene dunque descritto il funzionamento della toolchain di traduzione e
condotta un’analisi qualitativa e quantitativa su di essa, in un vero processo di sviluppo,
per dimostrare quanto questo approccio possa essere decisivo nel ridurre i tempi e i
costi della realizzazione di applicazioni mobili native.
V
Abstract
Mobile devices have now become an essential tool in everyday life, and their market is
constantly growing: the biggest revolution we are seeing in recent years is the emer-
gence and spread of smartwatches, that are not longer just simple extensions of the
smartphone, but real independent devices. The giants of the market, Apple and Goo-
gle, now allow you to create mobile applications for both devices, but the design costs
of the same application for both platforms, iOS and Android, are often the reason for
missing out on the power of native code development, in favor of other hybrid solu-
tions. The work done in this thesis is to create a tool that allows to generate mobile
applications for these platforms, translating into native code a single abstract model
of the application, achieved simply through a graphic editor: this approach, called
model-driven, will allow to generate the same application for both iOS and Android,
starting from a single initial model, thus halving software development times, at least
in its preliminary stages. It is then described the behaviour of the translation tool-
chain, and finally, it is conducted a qualitative and quantitative analysis on it, in a real
development process, to show how this approach can be decisive in reducing the time
and costs of the realization of native mobile applications.
VI
Capitolo 1
Introduzione
I dispositivi mobili sono oramai diventati uno strumento indispensabile nella vita di
tutti i giorni, riuscendo a compensare i bisogni dei consumatori sotto tutti i punti di
vista, dallo svago alla produttivita: il loro strettissimo legame con i social media, li ha
inevitabilmente resi lo strumento per eccellenza della comunicazione e della condivisio-
ne di informazioni in tutto il mondo. Il mercato dei dispositivi mobili e costantemente
in crescita sin dai primi anni 2000 e sebbene ancora oggi i piu grandi produttori di
smartphone, l’americana Apple [1] e il colosso coreano Samsung [2], siano saldamente
al comando della classifica, negli ultimi anni anche il mercato cinese ha cominciato ad
imporsi grazie al marchio Huawei [3] [4]. Tuttavia, la situazione dei sistemi operativi a
bordo di questi dispositivi, resta invariata praticamente dal 2008 con iOS [5] di Apple
e Android [6] di Google [7] che dominano la scena, lasciando attualmente ai competitor
Windows Phone [8] e BlackBerry OS [9] meno dell’1% del mercato [10].
La piu grande rivoluzione a cui stiamo assistendo negli ultimi 2-3 anni e la nascita
e diffusione degli smartwatch, ovvero gli orologi intelligenti che montano sistemi ope-
rativi del tutto simili ai corrispettivi su smartphone, e che nel giro di poco tempo sono
passati da semplice estensione dei telefoni a dispostivi quasi completamente indipen-
1
1. INTRODUZIONE
denti, in grado di connettersi ad Internet e scambiare informazioni autonomamente. Il
mercato in questo senso e ancora una volta dominato da Apple con il suo Apple Watch
[11] e in buona parte anche da Samsung con i vari Samsung Gear [12], le quali pro-
ducono rispettivamente il 52.4% e il 14.3% degli smartwatch in commercio dall’inizio
del 2016 [13]; restano comunque altri validi competitor quali LG [14], Motorola [15] e
ASUS [16] i quali, a differenza di Samsung che ha quasi completamente rimpiazzato
Android con Tizen [17], montano il sistema operativo Android Wear [18] di Google.
Apple Watch, naturalmente, possiede il sistema operativo di casa Apple watchOS [19].
Fatte queste premesse, risulta evidente che per quel che riguarda lo sviluppo di ap-
plicazioni mobili, sia per smartphone che per smartwatch, la soluzione piu promettente
in termini di ricavi e diffusione sul mercato e senza dubbio quella di Google e/o Apple;
la vera questione in termini di sviluppo sta nello scegliere se progettare due appli-
cazione indipendenti per i due sistemi operativi, oppure scegliere un’unica soluzione
compatibile per entrambi, con i conseguenti pregi e difetti. Se nel primo caso i costi di
progetto in termini di tempo e denaro possono risultare maggiori, poiche e inevitabile
procedere contemporaneamente su almeno due team di sviluppo differenti, nel secondo
caso non e invece possibile raggiungere lo stesso risultato di un’applicazione scritta ad
hoc per un specifico sistema operativo (nativa), sia in termini di prestazioni, sia in
relazione al look-and-feel dell’applicazione, per il quale i designer di Apple e Google
hanno maturato concetti decisamente differenti.
In questo elaborato di tesi, si e scelto di progettare un sistema in grado di suppor-
tare lo sviluppo di applicazioni mobili compatibili con le piattaforme Android, iOS e i
loro sistemi smartwatch, che produca sı due applicazioni distinte e indipendenti, ma che
generi automaticamente buona parte del codice sorgente dell’applicazione, a partire da
un unico modello sviluppato tramite un semplice tool grafico. Questo permetterebbe
sostanzialmente di risparmiare un enorme quantita di tempo nelle prime fasi di pro-
getto, andando a colmare il gap temporale di cui si e parlato sopra e ottenendo tutti i
benefici di un’applicazione scritta per uno specifico sistema operativo.
2
1. INTRODUZIONE
Il progetto di tesi prende forma a partire da una toolchain composta da una web app,
che permette di creare un modello astratto di un’applicazione tramite un semplice
editor grafico, e un’applicazione nativa per PC che traduce il modello generato pre-
cedentemente in codice sorgente per Android e iOS, creata originariamente da altri
tesisti che mi hanno preceduto. Il mio compito e stato dunque riprogettare parzial-
mente la toolchain, per renderla uno strumento in grado di produrre applicazioni che
rispettino gli standard qualitativi delle app di ultima generazione: poiche essa e stata
sviluppata originariamente nel 2012-13, attualmente non e piu in grado di soddisfare
le esigenze del mercato, ma nonostante questo, mi ha permesso di partire da un eco-
sistema gia di per se completo e funzionante, senza dover progettare tutto dal principio.
Di seguito e riportata una breve descrizione del contenuto di ciascun capitolo della tesi:
� Il secondo capitolo descrive il contesto attuale dello sviluppo di applicazioni mobili
multipiattaforma, a partire dai tool di prototipizzazione interattiva, fino agli
strumenti per sviluppare applicazioni cross-platform o in codice nativo.
� Il terzo capitolo illustra la struttura della web app in grado di generare il modello
astratto di un’applicazione mobile e quali siano stati gli interventi apportati al
fine di renderla uno strumento oggi valido e competitivo.
� Il quarto capitolo illustra invece la struttura dell’applicazione in grado di tradurre
il modello astratto in codice nativo, con tutte le modifiche introdotte personal-
mente, al fine di generare tutto cio che di nuovo e stato inserito nella web app
descritta nel capitolo precedente.
� Il quinto capitolo presenta dunque un’analisi quantitativa e qualitativa degli stru-
menti che sono stati sviluppati, prendendo come riferimento un’applicazione pro-
gettata senza di essi, e mettendo in evidenza quanto e stato possibile generare
automaticamente.
� Il sesto capitolo infine, riporta le considerazioni conclusive sul lavoro svolto e
illustra i possibili sviluppi futuri.
3
Capitolo 2
Contesto generale
In questo capitolo viene presentato il contesto generale in cui si trovano ad operare
gli sviluppatori di applicazioni per dispositivi mobili, con una breve parentesi sugli
strumenti di supporto alla fase di prototipizzazione e concentrandosi in particolar modo
sugli strumenti effettivamente utilizzabili per lo sviluppo vero e proprio. Vengono
prese in considerazione alcune tra le migliori possibilita presenti oggi sul mercato, per
evidenziare quali possano essere i fattori determinanti nel garantire uno sviluppo rapido
e ottimizzato per le piattaforme iOS e Android, tenendo conto del risultato finale sia
in termini di prestazioni, sia in relazione alla qualita dell’interfaccia grafica prodotta.
2.1 Stato dell’arte
Al termine della fase di design di un’applicazione, in cui vengono definiti tutti i requisiti
del software e viene descritta accuratamente l’architettura e l’interazione delle varie
componenti, comincia il processo di sviluppo vero e proprio; generalmente la stesura
del codice sorgente viene pero preceduta da una fase di prototipizzazione, che consiste
nella realizzazione di una versione dimostrativa dell’applicativo in grado di simulare il
comportamento dell’interfaccia grafica e possibilmente la navigazione dei contenuti. In
questa sezione viene illustrato lo stato dell’arte del processo di sviluppo.
4
2. CONTESTO GENERALE
2.1.1 Applicazioni di prototipizzazione
Le applicazioni di prototipizzazione sono uno strumento fondamentale nella progetta-
zione di un’applicazione di successo: sebbene Apple faccia della qualita dell’interfaccia
grafica un suo valore fondante da sempre, anche Google ha ormai da anni dettato le li-
nea guida su cio che un applicazione Android dovrebbe sempre rispettare, il cosiddetto
Material Design [20].
Si riportano di seguito i maggiori tool di prototipizzazione per applicazioni mobili
disponibili sul mercato.
FluidUI
Si tratta di una web app che permette lo sviluppo di un prototipo tramite widgets:
l’utente puo creare un certo numero di schermate per poi decorarle con i controlli for-
niti dall’editor dell’applicazione, ed eventualmente puo gestire la navigazione tramite
bottoni o gestures. FluidUI permette di simulare il comportamento dell’applicazione
tramite un web player oppure di esportare semplicemente le immagini delle varie scher-
mate; il piano gratuito prevede un limite di 1 progetto di 10 schermate, mentre il piano
piu economico costa 12$/mese e garantisce un numero illimitato di schermate. [21]
Figura 2.1: Interfaccia grafica di FluidUI
5
2. CONTESTO GENERALE
Proto.io
Anche Proto.io e distributo sottoforma di web app e come il precedente tool, permette
lo sviluppo di un prototipo tramite l’utilizzo di widgets: l’utente puo creare un certo nu-
mero di schermate per poi decorarle con i controlli forniti dall’editor dell’applicazione,
ed eventualmente puo gestire la navigazione tramite bottoni o gestures. L’applicazione
permette di simulare il comportamento del prototipo direttamente su di un dispositivo
reale, grazie all’app mobile di Proto.io che puo essere installata sullo smartphone e
riprodurre il prototipo generato via web; in alternativa e sempre possibile scaricare le
immagini delle varie schermate. Il piano gratuito e disponibile per un periodo di prova
di 15 giorni, mentre il piano piu economico costa 29$/mese e permette di gestire fino
a 5 progetti differenti. [22]
Figura 2.2: Interfaccia grafica di Proto.io
6
2. CONTESTO GENERALE
InvisionApp
Si tratta anche in questo caso di un’applicazione di prototipizzazione disponibile via
web, ma a differenza delle due precedenti si basa su di un approccio completamente
differente: l’utente puo solamente caricare delle immagini che ha precedentemente rea-
lizzato tramite un’altra applicazione di manipolazione delle stesse e posizionarle all’in-
terno delle varie schermate. Per rendere interattivo il prototipo, e possibile selezionare
alcune aree all’interno di una specifica schermata e trasformarle in dei collegamenti
che permettano di navigare tra i vari contenuti. La simulazione del comportamento
dell’applicazione puo avvenire sia tramite un web player, sia direttamente su di un
dispositivo reale, scaricando l’app di InvisionApp sul proprio smartphone. Il piano
gratuito e disponibile per un periodo di prova di 7 giorni, mentre il piano piu econo-
mico costa 15$/mese e permette di gestire fino a 3 progetti differenti. [23]
Figura 2.3: Interfaccia grafica di InvisionApp
7
2. CONTESTO GENERALE
Pixate
Si tratta di un’applicazione nativa per PC disponibile per le piattaforme Windows [25]
e OSX [26], corredata anch’essa da un’app per smartphone che permette di simulare
il comportamento del prototipo direttamente sul proprio dispositivo; anche Pixate e
uno strumento di prototipizzazione basato su immagini, percio e necessario ancora una
volta, creare prima le immagini delle schermate dell’applicazione e poi eventualmente
aggiungervi delle aree cliccabili che permettano la navigazione dei contenuti. La qualita
di un prototipo realizzato con questo tipo di applicazioni, dipende molto dall’abilita
dell’utente nell’utilizzo di applicazioni di elaborazione delle immagini, in quanto questi
strumenti forniscono solamente un supporto nel dimensionamento delle immagini che
vengono inserite nelle diverse schermate. [24]
Figura 2.4: Interfaccia grafica di Pixate
Allo stato attuale delle cose questo genere di applicazioni, indipendentemente dall’ap-
proccio basato su widgets o su immagini, rimane esclusivamente rilegato alla fase di
prototipizzazione, senza poter dare alcun contributo concreto alla stesura del codice
sorgente; nonostante il buon livello di interattivita, non e possibile estrarre alcun tipo
di informazione che possa essere riutilizzata automaticamente nella fase di sviluppo del
software vero e proprio.
8
2. CONTESTO GENERALE
2.1.2 Applicazioni per sviluppatori
Le applicazioni per sviluppatori rappresentano il cuore della progettazione di un’ap-
plicazione mobile: indipendentemente dal fatto che sia stato sviluppato o meno un
prototipo, esse rappresentano lo strumento tramite il quale avviene la stesura vera e
propria del codice sorgente e si differiscono tra loro per la tecnologia che utilizzano al
fine di generare un’applicativo per smartphone o altri dispositivi mobili. Generalmente
ci si riferisce a queste applicazioni col il termine IDE (Integrated Development Environ-
ment) poiche appunto rappresentano il cosiddetto ambiente di sviluppo del software,
in grado si fornire al programmatore tutto cio che serve per la stesura del codice sor-
gente: un editor di testo, un compilatore e/o interprete, un tool di building automatico
e solitamente un debugger. In questa sezione vengono riportati i piu celebri software
di sviluppo, suddivisi in base alla tecnologia utilizzata al fine di produrre applicazioni
mobili multipiattaforma.
2.1.2.1 Applicazioni multipiattaforma ibride
Una prima tipologia di applicazioni mobili multipiattaforma presenti oggi sul merca-
to, sono le cosiddette applicazioni ibride, ovvero realizzate tramite una tecnologia che
permette l’esecuzione dell’applicativo su qualunque tipo di dispositivo mobile, sia esso
Android, iOS o qualunque altro sistema in grado di riprodurre contenuti web.
Un applicazione ibrida nasce originariamente come una normale web app HTML5,
che viene successivamente incapsulata in una generico involucro di contenuti web (la
cosiddetta WebView) disponibile nativamente su tutti i dispositivi mobili: in pratica e
come se il dispositivo mostrasse una normale pagina web, costruita con le tradizionali
tecnologie HTML5, CSS3 e Javascript. E bene precisare che solitamente una web app
viene progettata tramite il paradigma SPA (Single Page Application), ovvero viene
simulata la navigazione dei contenuti rimpiazzando gli elementi presenti nella pagina
ogni volta che viene cliccato un link, dando la senzazione di navigare all’interno di una
vera e propria applicazione, piuttosto che su di un normale sito web: tutto questo e
oggi possibile grazie a librerie Javascript come AngularJS [27].
9
2. CONTESTO GENERALE
Per quando riguarda lo sviluppo del software, in questo contesto si fa riferimento piu
precisamente a dei framework, ovvero l’architettura logica di supporto che permette
l’incapsulamento della web app in una generica WebView: il piu celebre dei framework
per applicazioni ibride multipiattaforma e attualmente Apache Cordova [28]. Cio
che rende questo framework un vero e proprio strumento di sviluppo per applicazioni
mobili, e il fatto che la web app non viene solamente impacchettata in un contenitore
diverso dal semplice browser, ma fornisce delle API (Application Programming Inter-
face) che lo sviluppatore puo utilizzare per accedere a tutte le funzionalita esclusive
di un dispositivo mobile, come l’accesso in memoria, alla fotocamera o ai vari sensori
presenti sullo smartphone.
2.1.2.2 Applicazioni cross-compilate o interpretate
Una seconda tipologia di sviluppo di applicazioni mobili multipiattaforma e quella che
segue l’approccio della cross-compilazione: si tratta di utilizzare un solo linguaggio di
programmazione, indipendentemente dal numero di piattaforme sulle quali verra di-
stribuita l’applicazione, poiche tramite la cross-compilazione sara possibile tradurre il
codice sorgente in eseguibili compatibili con la piattaforma desiderata.
Il principio che sta alla base di questo approccio e il cosiddetto “write once, run any-
where” ovvero scrivi una sola volta, esegui ovunque; le applicazioni che seguono questa
filosofia generalmente forniscono un IDE dedicato con tutti gli strumenti necessari allo
sviluppo come se si stesse lavorando in ambiente nativo.
Xamarin
E il piu famoso ambiente di sviluppo che sfrutta esattamente il principio della cross-
compilazione: l’applicazione puo essere scritta interamente in C# per poi essere tradot-
ta in eseguibili compatibili con le piattaforme Android e iOS. Xamarin, inoltre, fornisce
tutte le API necessarie per accedere alle risorse hardware del dispositivo mobile, an-
che se per sviluppare contemporaneamente per Android e iOS, e necessario creare due
sotto-progetti distinti per le due piattaforme: di conseguenza, la quantita di codice che
viene sfruttato in maniera totalmente orizzontale e solamente una piccola parte.
10
2. CONTESTO GENERALE
Ad esempio, tramite le cosiddette Xamarin.Form, e possibile definire l’interfaccia gra-
fica dell’applicazione una sola volta per entrambi i sistemi operativi, ma in generale
e necessario implementare due logiche applicative distinte per le due piattaforme. Lo
sviluppo di applicazioni Xamarin e supportato da un IDE dedicato chiamato Xamarin
Studio sui sistemi OSX oppure tramite un estensione di Visual Studio [29] sui sistemi
Windows. [30]
Figura 2.5: Esempio di progetto Xamarin in Visual Studio
Appcelerator Titanium
E un’ambiente di sviluppo completamente basato sull’utilizzo di Javascript: tramite
l’SDK (Software Development Kit) Titanium, e possibile comporre tutta la logica appli-
cativa e l’interfaccia grafica dell’applicazione, sfruttando solamente questo linguaggio.
Titanium infatti, fornisce tutte le API necessarie per interagire con il dispositivo mobi-
le indipendentemente dalla piattaforma finale: e possibile infatti compilare il progetto
scritto interamente in Javascript e ottenere delle normali classi Java per Android e
Objective-C per iOS. Tuttavia, all’interno delle classi generate da Titanium, non vi e
11
2. CONTESTO GENERALE
un normale sviluppo del codice sorgente come avverrebbe in ambiente nativo, ma bensı
vengono semplicemente richiamati i motori Javascript del dispositivo (ad esempio V8
[31] per Android) al fine di interpretare a run-time il codice Javascript originale: non si
tratta dunque di una vera e propria cross-compilazione ma piu precisamente di un’in-
terpretazione. Lo sviluppo di applicazioni Titanium e supportato da un IDE dedicato
chiamato Titanium Studio [32] disponibile gratuitamente solo per un periodo di prova.
[33]
Figura 2.6: Esempio di classe Java generata con Titanium
React Native
Si tratta anche in questo caso di applicazioni mobili multipiattaforma basate interamen-
te su Javascript, dove sia la logica applicativa che l’interfaccia grafica, sono realizzate
utilizzando solamente questo linguaggio: come nel caso di Titanium, e possibile compi-
lare il progetto scritto completamente in Javascript e ottenere delle normali classi Java
per Android e Objective-C per iOS. Tutti i componenti grafici vengono definiti con una
sintassi basata su XML e durante l’interpretazione a run-time della logica applicativa,
essi vengono istanziati come dei veri e propri componenti nativi, con i conseguenti be-
nefici per quanto riguarda il look-and-feel dell’applicazione; inoltre, i componenti non
12
2. CONTESTO GENERALE
disponibili all’interno di React Native, possono essere definiti all’interno delle classi
Java o Swift e richiamati dalle classi Javascript del progetto, estendendo dunque le
funzionalita basilari di questo framework. [34]
NativeScript
Anche questo strumento si basa sugli stessi principi gia evidenziati per Titanium e
React Native, ovvero la scrittura del codice sorgente totalmente in Javascript ed la sua
interpretazione a run-time sul dispositivo reale, per richiamare nativamente le funzio-
nalita del sistema operativo utilizzato. La grande differenza rispetto ai due precedenti
framework, sta nel fatto che NativeScript non implementa solamente dei moduli che
espongano le API Javascript, ma permette anche di utilizzare direttamente tutti i me-
todi disponibili per iOS e Android, seguendo esattamente la stessa sintassi descritta
nella documentazione dalle due piattaforme. Questo permette di spingere al massimo il
livello di performance dell’applicazione, sempre nell’ambito comunque di un’esecuzione
Javascript interpretata, e di non avere alcun limite riguardo i componenti disponibili o
eventuali aggiornamenti delle piattaforme iOS e Android. [35]
2.1.2.3 Applicazioni native
Gli approcci descritti fino ad ora, sebbene in apparenza risultino delle soluzioni conve-
nienti per poter riutilizzare la stessa applicazione su piattaforme differenti, sono soggetti
ad alcune criticita sia in termini di prestazioni, sia in termini di qualita dell’interfaccia
grafica prodotta.
Per quanto riguarda le applicazioni ibride, nonstante ci sia un riutilizzo al 100% del
codice sorgente, il risultato in termini di prestazioni puo risultare particolarmente sca-
dente per applicazioni di una certa dimensione, in quanto tutte le risorse del dispositivo
sono concentrate nel riprodurre una web app all’interno di una semplice WebView. Inol-
tre, l’interfaccia grafica e generalmente poco fedele all’aspetto nativo della piattaforma
mobile, anche utilizzando dei framework dedicati a generare interfacce specifiche per
ciascun sistema operativo, come ad esempio Ionic Framework [36].
13
2. CONTESTO GENERALE
Utilizzando invece l’approccio della cross-compilazione, si possono riscontrare criticita
differenti in base alla tecnologia utilizzata: nel caso di Xamarin, il codice completamen-
te riutilizzabile su piattaforme differenti e in realta solo quello riguardante la gestione
dei dati o eventualmente, quello dedicato all’interfaccia grafica (Xamarin.Form) che
comunque non e equiparabile a quella creata tramite gli ambienti di sviluppo nativi.
Nel caso infine di applicazioni basate su Javascript, poiche non si tratta di una vera
e propria cross-compilazione ma semplicemente di un’interpretazione a run-time della
logica applicativa, le prestazioni possono risultare notevolmente inferiori, oltre al fatto
che non sempre sono disponibili tutte le API e i componenti grafici offerti naturalmente
in ambiente nativo.
Per queste ragioni, e talvolta indispensabile scegliere di intraprendere uno sviluppo
completamente nativo per ciascuna piattaforma, utilizzando gli ambienti di sviluppo
predefiniti per Android e iOS ovvero rispettivamente Android Studio [37] e Xcode [38].
Un approccio di questo tipo naturalmente, non genera problemi di scarsa qualita dell’in-
terfaccia grafica, ne tantomeno problemi di prestazioni o accesso alle risorse hardware
del dispositivo, sebbene si tratti di sviluppare due applicazioni completamente distinte
per ciascuna piattaforma.
14
2. CONTESTO GENERALE
2.2 Obiettivo della tesi
Stabilito che non sia possibile in alcun caso superare la qualita ne tantomeno le pre-
stazioni di un’applicazione mobile nativa, ci si chiede se sia possibile ridurre il tempo
necessario allo sviluppo di un’applicativo su due piattaforme differenti, sfruttando le
informazioni contenute nel prototipo dell’applicazione. L’obiettivo di questa ricerca e
quello di far si che durante la realizzazione del prototipo dell’applicazione, sia possibile
conservare le sue caratteristiche all’interno di un modello di dati strutturato, che possa
essere riutilizzato per generare del codice nativo per piu piattaforme differenti.
Un approccio di questo tipo, ovvero quello di generare applicazioni per diverse piat-
taforme a partire da un unico modello ad alto livello, prende il nome di approccio
model-driven o model-driven development ed e stato concettualmente sviluppato anche
nell’ambito di applicazioni mobili multipiattaforma [39][40]. In generale, l’idea e quella
di descrivere l’applicativo mobile secondo un modello ad alto livello, per poi procedere
ad una generazione model2text del codice sorgente, eventualmente passando attraver-
so ulteriori modelli specifici per ciascuna piattaforma (traduzione model2model). In
ambito nativo, e stato anche sviluppato un framework chiamato md 2 [41] che pero
si basa sulla definizione del modello dell’applicazione in maniera puramente testuale:
cio che manca dunque, e la possibilita di generare un modello in maniera semplice ed
intuitiva, come puo essere un’applicazione che metta a disposizione un editor grafico
simile a quello delle tradizionali app di prototipizzazione. [42]
Esiste sul mercato uno strumento recentemente sviluppato che fa al caso nostro, chia-
mato Neonto Studio [43]: si tratta un’applicazione disponibile solamente su OSX in
grado di generare automaticamente un progetto Android Studio e/o un progetto Xcode
a partire da un semplice prototipo realizzato graficamente. Attualmente supporta una
buona quantita di widgets per smartphone come bottoni, campi di testo, immagini, vi-
deo, webviews, liste, griglie e un bottone che richiama in automatico la fotocamera del
dispositivo; nella versione a pagamento (99$ una tantum) inoltre, permette lo sviluppo
di applicazioni per smartwatch, ma solamente di casa Apple.
15
2. CONTESTO GENERALE
In alternativa, esiste una toolchain di strumenti sviluppata per lo stesso scopo da alcuni
tesisti che mi hanno preceduto, in grado di ottenere il medesimo risultato, almeno sulle
piattaforme smartphone: si tratta di Protocode [44], creato nel 2013 da Mattia Natali,
e MobileCodeGenerator [60], sviluppato da Gregorio Perego e Stefania Pezzetti nel
2012; il primo strumento permette la creazione del prototipo di un’applicazione mobile,
e produce un file di informazioni che, dato in input al secondo applicativo, genera i
progetti Android e iOS automaticamente. Sebbene Neonto Studio sia gia indirizzato
verso il mondo degli orologi, i widget generati per smartphone sono decisamente meno
potenti di quelli disponibili su Protocode, mancando ad esempio di funzionalita come
registrare e riprodurre file audio automaticamente: per quanto riguarda invece il codi-
ce sorgente generato, entrambe le soluzioni producono del codice Java per Android e
Objective-C per iOS.
Gli elementi di notiva assoluta sul mercato sono quindi rappresentati dalla possibilita
di generare applicazioni iOS completamente scritte in codice Swift e di poter progettare
applicativi smartwatch gratuitamente per entrambi le piattaforme mobili Android Wear
e watchOS: sara dunque la toolchain Protocode/MobileCodeGenerator, completamen-
te open-source e disponibile su tutti i sistemi operativi per PC, il punto di partenza
per il lavoro descritto in questa tesi.
16
2. CONTESTO GENERALE
2.3 Soluzione proposta
La soluzione proposta in questo elaborato di tesi, consiste nel riprogettare buona par-
te della toolchain Protocode/MobileCodeGenerator al fine di renderla uno strumento
davvero competitivo e unico nel suo genere: poiche gli applicativi risalgono al 2012-
2013 non sono piu in grado di soddisfare le esigenze del mercato, ma possono essere
aggiornati in modo da rispettare gli standard qualitativi delle applicazioni di ultima
generazione.
Per prima cosa verra esteso il set di widget disponibile su Protocode e verra approfondi-
to il loro livello di personalizzazione, riducendo ulteriormente il lavoro delle successive
fasi di sviluppo; inoltre, la veste grafica di default dei componenti e del sistema ope-
rativo, dovra rispecchiare le ultime versioni di Android e iOS oggi disponibili sui piu
recenti dispositivi mobili, rispettivamente Android Marshmallow e iOS 9.3. Di conse-
guenza, verra aggiornato il meccanismo di generazione automatica di codice sorgente
di MobileCodeGenerator a partire da quanto introdotto su Protocode: tutti i nuovi
componenti e gli aggiornamenti introdotti in fase di prototipizzazione verranno tradot-
ti in codice nativo per le due piattaforme.
In secondo luogo verra rivisto il sistema di generazione di codice per quel che riguarda
il mondo iOS: la traduzione in Objective-C verra completamente rimpiazzata in favore
del nuovo linguaggio di casa Apple, ovvero Swift.
Si tratta certamente di una scelta che produrra risultati migliori in termini di sem-
plicita della sintassi, leggibilita del codice e quantita di file prodotti (eliminazione di
file header .h e di implementazione .m in favore di un unico file .swift); fattori che,
nonostante la continua evoluzione del linguaggio (Swift 3 e gia disponibile in preview
release nonostante la versione 2 stable sia uscita a Settembre 2015) lo rendono facile da
mantenere e aggiornare. Inoltre, le performance della prima versione di Swift erano gia
paragonabili a quelle di C++ secondo alcuni benchmarks puramente computazionali
(Greekbench 3) [61] e largamente superiori a quelle di Objective-C nell’ambito dei piu
17
2. CONTESTO GENERALE
noti algoritmi di ordinamento degli array [62], grazie soprattutto alle ottimizzazioni
introdotte ad-hoc a livello di compilatore [63]. Ad esempio, un compilatore Swift e in
grado di riconoscere se un metodo sia completamente vuoto e dunque evitare di effet-
tuare qualunque chiamata ad esso oppure, ipotesi piu probabile, rilevare se un oggetto
inizializzato non venga mai realmente utilizzato e dunque evitare di allocare spazio in
memoria.
Infine, verra reso possibile lo sviluppo della controparte smartwatch dell’applicazio-
ne mobile gia in fase di prototipizzazione: sara dunque possibile generare un certo
numero di schermate e arrichirle con dei widgets dedicati all’interno di Protocode, e
verra di conseguenza aggiornato MobileCodeGenerator, al fine di tradurre il prototipo
in un’applicazione per le piattaforme wearable Andriod Wear e watchOS.
Il risultato finale dovra produrre uno strumento unico nel suo genere e in grado di
supportare concretamente lo sviluppo di un’applicazione per Android e iOS, rendendo
la fase di prototipizzazione parte integrante nella stesura del codice sorgente.
18
Capitolo 3
Generazione del modello astratto
In questo capitolo viene descritto il processo di generazione del modello astratto del-
l’applicazione mobile, utilizzato per la creazione automatica di applicativi Android e
iOS. L’approccio seguito e il cosiddetto approccio model-driven che permette di de-
scrivere il funzionamento dell’applicazione con un modello del tutto trasparente alle
piattaforme per le quali questo verra successivamente implementato. L’applicazione
utilizzata per la generazione di questo modello e una web application chiamata Pro-
tocode, sviluppata originariamente nel 2013 per un precedente lavoro di tesi: vengono
qui riportate l’architettura originale dell’applicazione e come sia stata riprogettata per
gli scopi di questa ricerca. [65]
3.1 Protocode
Protocode e un applicazione web che permette all’utente di creare un prototipo di un
applicativo mobile tramite un editor grafico semplice ed intuitivo: segue il cosiddetto
paradigma WYSIWYG (What You See Is What You Get) ovvero cio che vedi e cio
che ottieni, ma a differenza di un normale strumento di prototipizzazione, Protocode
permette di esportare le informazioni contenute nel prototipo sottoforma di un file
XML e non di comuni immagini o file .pdf.
19
3. GENERAZIONE DEL MODELLO ASTRATTO
Lo scopo di questo applicativo infatti, e quello di produrre una serie di dati strutturati
relativi ad un prototipo di un’applicazione mobile, che possano essere riutilizzati per
la generazione automatica di codice sorgente nelle fasi preliminari di sviluppo, con la
semplicita di un normale editor visivo.
L’utente puo inserire e posizionare una serie di widgets all’interno delle varie schermate
dell’applicazione, proprio come in un qualunque altro strumento di prototipizzazione,
con il vantaggio che tutte queste informazioni vengono conservate in maniera struttu-
rata e possono essere successivamente accedute da un applicativo software in grado di
fare del parsing di dati in formato XML.
Vengono di seguito descritte le librerie software che costituiscono l’architettura logica
dell’applicazione web.
3.1.1 Librerie software
Protocode e una normale web app HTML5 basata sul framework Javascript Ember.js
[45], il cui sviluppo e supportato da una serie di strumenti di gestione e distribuzione
del software, oltre che da i piu classici plug-in CSS3 per la definizione dell’interfaccia
grafica.
Ember.js
Si tratta di un framework Javascript open-source basato sul pattern Model-View-
ViewModel (MVVM), che permette di creare una cosiddetta Single Page (Web) Ap-
plication: progettata sul paradigma design-over-configuration, predilige le convezioni
piuttosto che le configurazioni, liberando lo sviluppatore dalla creazione di codice che
connetta i vari componenti dell’applicazione (boilerplate code).
Utilizza Ember Data [46], una libreria per il salvataggio dei dati che mappa i modelli
lato utente a quelli lato server, usata in questo caso per salvare i dati direttamen-
te sul client che esegue l’applicazione, sfruttando in particolar modo il local storage
disponibile oggi su qualunque browser di navigazione.
20
3. GENERAZIONE DEL MODELLO ASTRATTO
Ember.js si fonda su alcuni concetti chiave che sono fondamentali per la comprensione
della struttura del progetto di Protocode:
� Template: Descrive una particolare interfaccia grafica dell’applicazione ed e co-
stituito da un file .hbs (handlebars) scritto in codice HTML e decorato con delle
espressioni Javascript. Ogni template fa riferimento ad uno specifico dato o in-
sieme di dati (model); la somma di tutti i template costituisce l’intera interfaccia
grafica dell’applicazione.
� View: E un componente utilizzato per definire una sezione dell’interfaccia grafica
che richiede una sofisticata interazione con l’utente: e generalmente costituita
da un file .js che ne descrive il comportamento in base a determinati eventi
(inizializzazione, click del mouse e simili) e un file .hbs che ne descrive la veste
grafica.
� Router: E il cuore di qualunque Single Page Application, in quanto stabilisce
quale template mostrare sulla base dell’URL inserito: la navigazione infatti e
solamente simulata, rimpiazzando i template ogni volta che l’utente seleziona un
link.
� Model: Si tratta di un oggetto Javascript salvato in maniera persistente, conte-
nente una serie di proprieta e metodi che vengono mostrati attraverso i template
dell’applicazione: la somma di tutti i model costituisce in pratica lo strato dei
dati dell’applicativo.
� Route: E il componente che collega ogni template al modello che deve mostrare,
e viene normalmente generato automaticamente secondo il principio di design-
over-configuration, nel momento in cui il template e il model siano stati definiti
secondo le convenzioni di Ember.
� Controller: Si tratta di un oggetto Javascript che puo essere assegnato ad un
template per definire delle caratteristiche transitorie: in pratica ogni template
mostra dei dati che sono salvati in maniera persistente nel model ed eventual-
mente alcuni dati relativi allo stato attuale dell’applicazione, che sono pero salvati
e manipolati da uno specifico controller.
21
3. GENERAZIONE DEL MODELLO ASTRATTO
Yeoman.io
Yeoman.io e uno strumento di scaffolding per lo sviluppo di web applications, in grado
automatizzare una serie di operazioni di gestione e distribuzione del software tramite
alcune semplici direttive dettate dal programmatore. [47]
Si descrivono in seguito i 4 tool che lo compongono :
� Yo: Strumento che genera automaticamente lo scheletro dell’applicazione, defi-
nendo la struttura del progetto e delle directory da cui esso e costituito. [48]
� Compass: Framework CSS che permette una gestione ottimizzata dei fogli di
stile, introducendo l’utilizzo di variabili all’interno dei file .scss e la possibilita di
definire dichiarazioni innestate delle classi CSS. [49]
� Grunt: E un cosiddetto task runner, ovvero uno strumento in grado di creare un
server con installata la web application e che osserva in tempo reale le modifiche
ai file dell’applicazione, oltre che compattare e unire i file Javascript e SCSS per
produrre la versione di distribuzione della web application. [50]
� Bower: Package manager che permette di installare le librerie esterne dell’ap-
plicazione, tramite la definizione di un file contenente la lista delle librerie ed una
loro eventuale versione che si intende utilizzare. [51]
Bootstrap
Si tratta di un framework per la gestione dell’interfaccia grafica di una web application,
costituito fondamentalmente da un foglio di stile e da una serie di file Javascript che
permettono di utilizzare dei componenti grafici particolarmente elaborati e interattivi;
inoltre, permette con estrema semplicita di definire il layout dell’applicazione in manie-
ra responsive, ovvero adattando i contenuti alla dimensioni dello schermo su cui viene
eseguita la web application. [52]
22
3. GENERAZIONE DEL MODELLO ASTRATTO
Altre librerie
Vengono di seguito descritte le altre librerie che compongono l’architettura logica di
Protocode :
� Ember Data Local Storage Adapter: Libreria Javascript che permette di
utilizzare le normali funzionalita di Ember Data per salvare i dati all’interno del
browser, nel local storage appunto. [53]
� JQuery: Framework di sviluppo dell’interfaccia grafica che sta alla base dell’u-
tilizzo di Bootstrap e che ne permette dunque il funzionamento. [54]
� Font Awesome: Kit di icone per il web. [55]
� Blob e File Saver: Librerie per il download di dati lato client, viene utilizzata
in questo caso per scaricare il file XML contente le informazioni sul prototipo
dell’applicazione mobile. [56] [57]
� vkBeautify: Libreria per indentare automaticamente il codice XML generato
dall’applicazione prima del download. [58]
23
3. GENERAZIONE DEL MODELLO ASTRATTO
3.1.2 Architettura software originale
In questa sezione viene presentata l’architettura originale di Protocode, cosı come si
presentava all’inizio di questo lavoro di tesi, a partire dalla gerarchia di cartelle al-
l’interno dell’applicazione, fino alla descrizione della logica dei componenti e alla loro
interazione. Si riporta di seguito la struttura gerarchica delle directory dell’applicativo:
� root: cartella principale, contiene tutte le successive cartelle e i file di confi-
gurazione di Grunt e Bower; il primo descrive i task da seguire per la normale
esecuzione su localhost e quelli per la distribuzione dell’applicazione, il secondo
invece contiene la lista delle librerie esterne e la loro versione da scaricare.
� node modules: contiene le librerie necessarie al funzionamento di Grunt e degli
altri applicativi basati su Node.js [59].
� test: contiene i file per il testing dell’applicazione.
� dist: contiene la versione di distribuzione dell’applicazione generata da Grunt,
ovvero dove i fogli di stile e i file Javascript sono compattati e unificati, rimuoven-
do il codice commentato e codificando gli script dell’applicazione, che rimarreb-
bero altrimenti accessibili a chiunque tramite la console del browser. Oltretutto,
questo processo garantisce maggiori prestazioni dell’applicazione, nel momento
in cui questa venisse pubblicata su un qualunque webserver in rete.
� app: contiene l’applicazione vera e propria, suddivisa sostanzialmente in logica
applicativa, template delle pagine, fogli di stile e immagini; al suo interno si
trovano inoltre tutte le librerie installate tramite Bower che sono state elencate
in precedenza.
Di seguito viene descritto accuratamente il contenuto della cartella app, focalizzan-
do l’attenzione sul ruolo che i vari file ricoprono nel funzionamento di Protocode: la
trattazione e suddivisa nei quattro meccanismi chiave che regolano la web application
ovvero routing, model, controller e view.
24
3. GENERAZIONE DEL MODELLO ASTRATTO
Figura 3.1: Struttura di Protocode
3.1.2.1 Routing
Con il termine routing si intende il meccanismo che permette di mappare l’URL presen-
te nella barra di navigazione del browser con il template che deve essere visualizzato;
oltre al router principale (app/scripts/router.js) vengono definiti anche degli ogget-
ti route, che specificano quale modello debba essere mostrato all’interno di ciascun
template. Essi si trovano all’interno della directory app/scripts/routes.
3.1.2.2 Model
Per model si intendono tutti gli oggetti che vengono salvati in maniera persistente
all’interno di Protocode: solo alcuni di questi verranno utilizzati effettivamente per la
generazione del modello astratto dell’applicazione mobile, mentre altri sono solamente
legati al funzionamento della web app; i file Javascript contenenti la descrizione dei
modelli si trovano nella cartella app/scripts/model. Si riporta di seguito un diagramma
dei modelli di Protocode che verranno cosı esportati al termine della prototipizzazione.
25
3. GENERAZIONE DEL MODELLO ASTRATTO
3.1.2.3 Controller
Con il termine controller, si intende quel componente che viene assegnato ad un tem-
plate per manipolarne temporaneamente alcune caratteristiche: in pratica tutte le
informazioni mostrate dinamicamente da un template, prima di essere eventualmente
salvate in maniera persistente, sono gestite dal suo controller. I controller di Protocode
sono contenuti nella cartella app/scripts/controllers/.
A questa categoria appartengono anche i cosiddetti mixins, ovvero dei componenti
che contengono delle proprieta e dei metodi che possono essere ereditati dai controller
veri e propri, in modo da rendere piu snella e scalabile la logica applicativa: essi si
trovano nella directory app/scripts/mixins/.
Si descrivono di seguito i dettagli di ciascun mixin :
� Deletable, Saveable: contengono i metodi per la creazione e la cancellazione di
un modello dell’applicazione.
� ClickListeneable: contiene la logica necessaria per la gestione e la cancellazione
di modelli che sono collegati direttamente ad un oggetto ClickListener.
� Navigable: contiene la logica necessaria per la gestione e la cancellazione di
modelli che sono collegati direttamente ad un oggetto Navigation.
� TextAlignable: contiene i metodi per la gestione dell’allineamento orizzontale del
testo di uno specifico widget.
� WithSourceType: contiene la logica necessaria per la gestione di modelli che hanno
un particolare file sorgente (audio, immagini e video).
� UiMoveable: contiene la logica applicativa necessaria per la gestione del trasci-
namento di un widget sullo schermo del dispositivo e l’aggiornamento in tempo
reale delle sue coordinate.
� UiDroppable: contiene i metodi per la gestione del drag&drop dei widget sullo
schermo.
27
3. GENERAZIONE DEL MODELLO ASTRATTO
Un esempio di manipolazione della logica applicativa in cui i controller giocano un
ruolo fondamentale e la gestione del sistema dei vincoli tra i vari widget presenti sulla
schermata.
Questo sistema, e stato pensato per essere riutilizzato facilmente all’interno del Relati-
veLayout di Android e del sistema dei constraints della Storyboard di iOS : in pratica,
per supportare agilmente schermi di dimensioni differenti, e indispensabile posizionare
i componenti relativamente allo schermo che li contiene o ai componenti che popolano
la stessa schermata, tramite le proprieta presenti nel modello UiControl di Protocode.
In particolare il controller UiControlController, ogni qual volta viene aggiunto un nuo-
vo vincolo per un widget, effettua una verifica su tutti i vincoli presenti per eliminare
eventuali circolarita: ad esempio, un widget A posizionato sopra a B e un widget B
posizionato sotto ad A creano un loop nella verifica dei vincoli poiche manca una coor-
dinata di riferimento per almeno uno dei due widget. Questa circolarita viene spezzata
semplicemente rimuovendo l’ultimo vincolo inserito ed invitando quindi l’utente a ve-
rificare che non siano gia presenti tutti i vincoli necessari.
Si riporta in seguito uno schema dei controller di Protocode.
28
3. GENERAZIONE DEL MODELLO ASTRATTO
3.1.2.4 View
Il concetto di view incorpora tutti i componenti che vengono utilizzati per la definizione
dell’interfaccia grafica dell’applicazione, e si dividono sostanzialmente in due categorie:
i template veri e propri, contenuti nella directory app/templates/, e le cosiddette view
che sono invece delle piccole porzioni di interfaccia grafica che necessitano la definizione
di una logica piu elaborata; queste ultime sono descritte da un file .hbs contenuto in
app/templates/views/ e sono manipolate da un file .js contenuto in app/scripts/views/
e possono eventualmente ereditare delle caratteristiche provenienti da un mixin esat-
tamente come i controller puri.
Sono stati definiti inoltre alcuni componenti HTML particolarmente sofisticati, che
come le view sono descritti da un file .hbs contenuto in app/templates/components/ e
sono controllati da un file .js presente in app/scripts/components/.
Tutta l’interfaccia grafica dell’applicazione e stata definita dal punto di vista pura-
mente estetico, dai fogli di stile contenuti nella directory app/styles/. In pratica, i file
Javascript che manipolano le view, permettono di rimuovere e/o aggiungere delle classi
CSS a queste ultime, sulla base di particolari eventi provocati dall’utente: ad esempio,
quando viene modificato il tipo di dispositivo presente nell’editor di Protocode, in base
alla piattaforma di questo, verranno inserite le classi CSS .android oppure .ios diret-
tamente nel DOM (Document Object Model) e si aggiornera di conseguenza l’aspetto
di tutti i componenti presenti nella schermata corrente.
Si riporta in seguito un diagramma della gerarchia delle view dell’applicazione.
30
3. GENERAZIONE DEL MODELLO ASTRATTO
3.1.3 Interfaccia grafica dell’applicazione
In questa sezione viene presentata l’interfaccia grafica originale di Protocode, mostran-
do come l’utente possa effettivamente creare un prototipo di un applicazione mobile ed
esportare il modello astratto di questa.
Innanzitutto, nella barra di navigazione in alto sono presenti i controlli per creare
o eliminare il modello che si vuole generare, e un collegamento all’editor grafico ve-
ro e proprio; all’interno di questa sezione dunque, e possibile rinominare il modello e
cominciare la creazione delle varie schermate, che possono essere visualizzate in moda-
lita Android oppure iOS semplicemente selezionando il corrispondente dispositivo dallo
specifico menu a tendina.
Infine, in alto a destra, e presente un bottone che permette da qualunque sezione
di scaricare il modello dell’applicazione generata fino a quel momento.
Figura 3.5: Anteprima applicazione Android su Protocode
32
3. GENERAZIONE DEL MODELLO ASTRATTO
Figura 3.6: Anteprima applicazione iOS su Protocode
Smartphones
L’anteprima dell’applicazione e disponibile in versione iOS 7 su di un iPhone 5s oppure
in modalita Android KitKat su di un Google Nexus 5 : e possibile decorare le schermate
dell’applicazione semplicemente trascinandoci sopra i widget presenti nel pannello in
basso a sinistra oppure modificarne alcune caratteristiche tramite il pannello di destra.
Naturalmente, l’aspetto dell’anteprima e perfettamente fedele al risultato finale del-
l’applicazione, poiche la dimensione delle schermate e dei componenti viene calcolata
prendendo in considerazione la dimensione dell’immagine .png del dispositivo, la di-
mensione reale dello schermo del dispositivo e scalando proporzionalmente tutti i com-
ponenti; quest’ultima in particolare, viene definita in base alla sua densita di pixel,
piuttosto che alla sua generica risoluzione, cosı come avviene all’interno degli IDE di
sviluppo nativi. Ogni dispositivo mobile infatti, nonostante esistano in commercio in-
numerevoli risoluzioni, e caratterizzato da una certa densita di pixel, ovvero il rapporto
fra il numero di pixel presenti sullo schermo e la sua dimensione in cm o pollici: que-
sto consente di utilizzare un’unita di misura astratta, i points per iOS e i dp (density
pixels) per Android, che permetta di dire quanto sia “grande” un particolare schermo
in termini assoluti.
33
3. GENERAZIONE DEL MODELLO ASTRATTO
Dunque, tramite il pannello di destra, e possibile aggiungere per ogni schermata un
certo numero di dialogs e definire un eventuale menu di navigazione: per iOS e stato
adottata la navigazione tramite la Bottom Bar in basso nello schermo, mentre per
Android si e scelto di replicare per ogni schermata il classico menu a tendina in alto.
Widgets
Una volta trascinato un widget sullo schermo, e possibile selezionarlo per modificarne
la dimensione, il posizionamento e alcune caratteristiche specifiche di quel componen-
te; il pannello di destra contenente le informazioni generali della schermata, viene
rimpiazzato da un pannello suddiviso nelle tre seguenti sezioni :
� Caratteristiche, che permette di modificare le proprieta specifiche del componente
� Posizione, che permette di modificare le coordinate X,Y del componente sia in
termini assoluti che relativamente allo schermo e agli altri componenti
� Dimensione, che permette di impostare l’altezza, la larghezza e i margini del
componente
Si riporta in seguito una tabella esplicativa di tutti i widget presenti su Protocode.
Widget Android iOS Personalizzazione
ButtonBottone grigio con
testo nero
Bottone bianco con
testo azzurro
Testo
ClickListener
Posizione
Dimensione
Label Testo nero Testo nero
Testo
Allineamento del testo
Posizione
Dimensione
34
3. GENERAZIONE DEL MODELLO ASTRATTO
EditTextCampo di input
con bordo inferiore
Casella di input
con bordo
arrotondato
Testo
Placeholder
Posizione
Dimensione
WebViewRettangolo verde
con icona del globo
Rettangolo azzurro
con la scritta
UIWebView
Nome del file sorgente
Posizione
Dimensione
ImageView
Rettangolo verde
con icona di
un’immagine
Rettangolo azzurro
con la scritta
UIImageView
Tipo di sorgente
URI del file sorgente
Posizione
Dimensione
VideoView
Rettangolo verde
con icona di una
videocamera
Rettangolo azzurro
con icona di una
videocamera
Tipo di sorgente
URI del file sorgente
Posizione
Dimensione
AudioPlayer
Contenitore di 3
bottoni grigi
allineati con la
scritta nera play,
pause, stop
Contenitore di 3
bottoni bianchi
allineati con la
scritta azzurra
play, pause, stop
Tipo di sorgente
URI del file sorgente
Posizione
Dimensione
ListViewContenitore
trasparente
Contenitore
trasparente
ClickListener
Posizione
Dimensione
ListViewCell
Cella orizzontale
contenente solo
testo
Cella orizzontale
contenente solo
testo
Testo
GridViewContenitore
trasparente
Contenitore
trasparente
ClickListener
Posizione
Dimensione
35
3. GENERAZIONE DEL MODELLO ASTRATTO
GridViewCell
Cella quadrata
contenente solo
testo
Cella quadrata
contenente solo
testo
Testo
Photocamera
Controller
Bottone grigio con
la scritta nera
“Fotocamera”
Botton bianco con
la scritta azzurra
“Fotocamera”
ImageView di
anteprima
(hardwareFile)
Posizione
Dimensione
Videocamera
Controller
Bottone grigio con
la scritta nera
“Videocamera”
Bottone bianco con
la scritta azzurra
“Videocamera”
VideoView di
anteprima
(hardwareFile)
Posizione
Dimensione
Audio
Recorder
Bottone grigio con
la scritta nera
“Rec”
Bottone bianco con
la scritta azzurra
“Rec”
AudioPlayer di
anteprima
(hardwareFile)
Posizione
Dimensione
Menu
Menu a lista a
destra della
ActionBar
TabBar in basso
nella schermata
Tabella 3.1: Tabella dei widget di Protocode
36
3. GENERAZIONE DEL MODELLO ASTRATTO
3.2 Aggiornamento di Protocode
In questa sezione vengono presentate tutte le modifiche e gli aggiornamenti che sono
stati apportati all’applicazione, in modo da poter soddisfare le esigenze di questo lavoro
di tesi: seguendo lo stesso percorso utilizzato per la descrizione dell’architettura del
software originale, verranno descritti gli interventi apportati all’applicativo e il risulta-
to finale raggiunto.
Come gia anticipato, l’obiettivo principale per quel che riguarda la fase di prototi-
pizzazione su Protocode era quello di estendere la possibilita di creare un modello
anche per la controparte smartwatch dell’applicazione: in altre parole, e stato reso
possibile gestire sia l’interfaccia grafica dell’applicazione mobile, sia quella che verra
eventualmente installata sullo smartwatch. Per fare questo, si e dovuto quindi creare
un editor dedicato agli orologi, con i relativi widget tipici di quell’ambiente, e modifi-
care il modello alla base di Protocode in maniera da poter esportare un file XML che
comprendesse le informazioni relative ad entrambi i dispositivi.
Prima di tutto pero, e stato approfondito il livello di personalizzazione dei componenti
disponibili per smartphone e sono stati introdotti i widget piu recenti, poiche quelli gia
presenti erano ormai praticamente obsoleti o comunque scarsamente personalizzabili in
fase di prototipizzazione.
3.2.1 Design della logica applicativa
L’intervento sulla logica applicativa di Protocode e stato diviso sostanzialmente in due
fasi: nella prima, si e scelto di agire “in verticale” ovvero si e andata ad approfondire
la modellizzazione di tutti i componenti presenti e del sistema operativo mostrato
nell’editor grafico; nella seconda invece, si e ridefinito il funzionamento dell’applicativo
dando la possibilita all’utente di creare una controparte smartwatch dell’applicazione
con conseguenze anche sui modelli e i sui template originali. La trattazione verra
ancora una volta mostrata focalizzandosi sugli elementi chiave della web application
ossia routing, model, controller e view.
37
3. GENERAZIONE DEL MODELLO ASTRATTO
3.2.1.1 Routing
Per quanto riguarda il routing dell’applicazione, e stato necessario innanzitutto esten-
dere i percorsi disponibili, introducendo le risorse relative ai nuovi widget che sarebbero
stati creati: in pratica, e stato modificato il router principale per configurare gli URL
che collegano i modelli dei nuovi widget, ai rispettivi template dell’interfaccia grafica.
In secondo luogo, e stato introdotto un percorso di navigazione “parallelo” a quello
principale, che permettesse di scegliere se aprire l’editor grafico dello smartphone op-
pure quello dello smartwatch e mostrare di conseguenza il rispettivo dispositivo e i
widget ad esso associati.
3.2.1.2 Model
Lo strato dei dati dell’applicativo e quello che piu di tutti ha subito una riprogettazio-
ne, poiche e da questo che deriva il modello finale che verra esportato al termine della
prototipizzazione.
Per prima cosa, sono stati rimodellati i widget disponibili, aggiungendo numerose carat-
teristiche che sarebbero diventate quindi personalizzabili gia all’interno di Protocode;
per alcuni di questi e stato necessario intervenire anche sul sistema di posizionamento,
forzando alcune caratteristiche che altrimenti avrebbero prodotto dei risultati sgrade-
voli alla fine della traduzione in codice nativo. Un esempio di rimodellazione partico-
larmente approfondita dei widget e stato quello delle ListView e delle GridView, che
sono state trasformate in modo da poter contenere oltre che a del semplice testo, anche
delle immagini o delle icone, fondamentali per un’interfaccia grafica di buona qualita.
In seguito, sono stati introdotti i nuovi modelli relativi ai widget non ancora esistenti,
con le relative caratteristiche e vincoli di dimensione e posizionamento: sono stati crea-
ti praticamente tutti i widget oggi disponibili negli IDE Android Studio e Xcode, come
mappe, pickers e bottoni di ogni genere; sono stati quindi introdotti gli smartphone
di ultima generazione di casa Google e Apple con i relativi sistemi operativi alla loro
ultima versione.
38
3. GENERAZIONE DEL MODELLO ASTRATTO
Infine, sono stati creati i modelli per i dispositivi smartwatch e una serie di widget
disponibili sulle piattaforme Android Wear e watchOS, con delle caratteristiche del
tutto simili a quelli per smartphone in termini di posizionamento e dimensione; at-
tualmente, solo le applicazioni per Android Wear permettono un posizionamento dei
componenti completamente libero, mentre su watchOS possono solo essere organizzati
verticalmente o in delle griglie chiamate groups, ma non e escluso che in futuro possa
essere introdotto un sistema di vincoli simile a quello per iPhone, ragion per cui si e
scelto di non limitare a priori il posizionamento dei vari widget.
Si riporta in seguito il diagramma dei modelli di Protocode nella sua versione fina-
le: sono indicati in verde i modelli che hanno subito delle modifiche e tutti i nuovi
modelli e relazioni che sono stati introdotti. Si descrive quindi ciascun componente e
le sue caratteristiche, per evidenziare la profondita con cui questi siano stati modellati
e quanto dunque sara possibile tradurre automaticamente senza alcun intervento nella
fase di stesura del codice sorgente.
39
3. GENERAZIONE DEL MODELLO ASTRATTO
Application
Elemento radice del modello astratto XML esportato da Protocode
Attributi
name identificativo che rappresenta il nome dell’applicazione mobile
Relazioni
menu relazione 0:1 tra l’applicazione e il suo menu
viewControllers relazione 0:n tra l’applicazione e le sue schermate smartphone
watchControllers relazione 0:n tra l’applicazione e le sue schermate smartwatch
ViewController
Rappresenta una singola schermata dell’applicazione su smartphone
Attributi
name identificativo che rappresenta il nome della schermata
backgroundColor stringa che indica il colore dello sfondo
backgroundImage stringa che indica il nome dell’immagine di sfondo
launcher booleano che indica se sia la prima schermata a comparire
Relazioni
application relazione 1:1 tra la schermata e l’applicazione
uiPhoneControls relazione 0:n tra la schermata e i suoi widgets
alertDialogs relazione 0:n tra la schermata e i suoi dialog di conferma
progressDialogs relazione 0:n tra la schermata e i suoi dialog di progresso
asyncTasks relazione 0:n tra la schermata e i suoi task asincroni
WatchController
Rappresenta una singola schermata dell’applicazione su smartwatch
Attributi
name identificativo che rappresenta il nome della schermata
launcher booleano che indica se sia la prima schermata a comparire
Relazioni
application relazione 1:1 tra la schermata e l’applicazione
uiWatchControls relazione 0:n tra la schermata e i suoi widgets
41
3. GENERAZIONE DEL MODELLO ASTRATTO
Dialog
Rappresenta un dialog visualizzabile in una determinata schermata su smartphone
Attributi
name identificativo che rappresenta il nome del dialog
title stringa che indica il titolo del dialog
message stringa che indica il messaggio contenuto nel dialog
Dialog - AlertDialog
Rappresenta un dialog con bottoni di conferma
Dialog - ProgressDialog
Rappresenta un dialog per un attivita in corso
Attributi
spinner booleano che indica se visualizzare uno spinner
AsynchTask
Rappresenta un task asincrono eseguito in background su smartphone
Attributi
name identificativo che rappresenta il nome del task asincrono
Menu
Rappresenta il menu di navigazione dell’applicazione su smartphone
Relazioni
menuItems relazione 0:n tra il menu e le voci che lo compongono
MenuItem
Rappresenta una singola voce del menu
Attributi
name identificativo della voce del menu
title stringa che indica il nome da visualizzare nella voce del menu
Relazioni
navigation relazione 1:1 tra la voce del menu e un oggetto di navigazione
parentMenu relazione 1:1 tra la voce del menu e il menu che lo contiene
42
3. GENERAZIONE DEL MODELLO ASTRATTO
Navigation
Rappresenta un oggetto di navigazione utilizzato come ponte tra il componente per
smartphone che richiede la navigazione e la schermata di destinazione
Relazioni
destination relazione 1:1 tra Navigation e la sua destinazione
WatchNavigation
Rappresenta un oggetto di navigazione utilizzato come ponte tra il componente per
smartwatch che richiede la navigazione e la schermata di destinazione
Relazioni
destination relazione 1:1 tra WatchNavigation e la sua destinazione
ClickListener
Rappresenta un oggetto utilizzato come punto di collegamento tra tutti i componenti
per smartphone che possono richiedere una navigazione e l’oggetto di navigazione
Relazioni
navigation relazione 0:1 tra ClickListener e Navigation
WatchClickListener
Rappresenta un oggetto utilizzato come punto di collegamento tra tutti i componenti
per smartwatch che possono richiedere una navigazione e l’oggetto di navigazione
Relazioni
navigation relazione 0:1 tra WatchClickListener e WatchNavigation
SourceType
Rappresenta un oggetto astratto utilizzato per i componenti che necessitano di un
particolare file sorgente (immagini, video, audio)
Attributi
type stringa che indica il tipo di file sorgente: risorsa di progetto
(localFile), file remoto (remoteFile) oppure proveniente dal
dispositivo (hardwareFile)
fileUri stringa che indica l’URL del file sorgente di tipo remoto
43
3. GENERAZIONE DEL MODELLO ASTRATTO
UiControl
Rappresenta un widget che puo essere aggiunto ad una schermata.
E la superclasse da cui ereditano tutti widget per smartphone e smartwatch, i quali
pero, potranno essere messi in relazione solo fra di loro poiche appartengo ovviamente
a schermate differenti.
Attributi
name identificativo che rappresenta il nome del widget
posX, posY float che indicano le coordinate del widget
width, height float che indicano la larghezza e l’altezza del widget
padding float che indica il margine interno al bordo del widget
margin float che indica il margine esterno al bordo del widget
alignParent booleano che indica se il widget e allineato al bordo
superiore,destro, inferiore e/o sinistro della schermata
xmlName stringa che indica il nome dell’elemento nel modello XML che
verra esportato da Protocode
UiPhoneControl
Rappresenta un widget che puo essere aggiunto a una schermata su smartphone.
Relazioni
viewController relazione 1:1 tra il widget e la sua schermata
align relazione 0:1 tra i widgets che permette di allinearli
relativamente l’uno all’altro
above relazione 0:1 tra i widgets che permette di posizionarne uno
sopra l’altro
below relazione 0:1 tra i widgets che permette di posizionarne uno
sotto l’altro
toStartOf relazione 0:1 tra i widgets che permette di posizionare l’estre-
mo destro del widget all’estremo sinistro di un altro, ovvero
all’inizio
toEndOf relazione 0:1 tra i widgets che permette di posizionare l’estre-
mo sinistro del widget all’estremo destro di un altro, ovvero
alla fine
44
3. GENERAZIONE DEL MODELLO ASTRATTO
UiPhoneControl - AudioPlayer
Rappresenta un contenitore dei bottoni play, pausa, stop posizionabile sulla schermata
Relazioni
sourceType relazione 1:1 tra l’AudioPlayer e il tipo di file sorgente
UiPhoneControl - AudioRecorder
Rappresenta un bottone che richiamera la funzione di registratore del dispositivo.
Relazioni
audioPlayer relazione 0:1 tra l’AudioRecorder e l’eventuale AudioPlayer
UiPhoneControl - Button
Rappresenta un bottone posizionabile sulla schermata
Attributi
title stringa che indica il testo contenuto nel bottone
textColor stringa che indica il colore del testo contenuto nel bottone
backgroundColor stringa che indica il colore di sfondo del bottone
clickColor stringa che indica il colore di sfondo al momento del click
borderRadius intero che indica l’arrotondamento dei bordi del bottone
Relazioni
clickListener relazione 0:1 tra il bottone e l’oggetto ClickListener
UiPhoneControl - Card
Rappresenta una Cardview posizionabile sulla schermata
Attributi
title stringa che indica il titolo contenuto nella card
subtitle stringa che indica il sottotitolo contenuto nella card
numActions intero che indica il numero di bottoni disponibili nella card
UiPhoneControl - Datepicker
Rappresenta un calendario posizionabile sulla schermata
UiPhoneControl - Timepicker
Rappresenta un orologio posizionabile sulla schermata
45
3. GENERAZIONE DEL MODELLO ASTRATTO
UiPhoneControl - Label
Rappresenta un’etichetta di testo posizionabile sulla schermata
Attributi
title stringa che indica il testo da visualizzare
textColor stringa che indica il colore del testo
textSize intero che indica la dimensione del testo da visualizzare
textAlign stringa che indica l’allineamento orizzontale del testo
textDecoration stringa che indica il formato del testo da visualizzare
UiPhoneControl - EditText
Rappresenta un input di testo posizionabile sulla schermata
Attributi
title stringa che indica il testo da visualizzare
textColor stringa che indica il colore del testo
textSize intero che indica la dimensione del testo da visualizzare
placeholder stringa che indica un suggerimento per il campo di testo
UiPhoneControl - ListView
Rappresenta una lista di elementi posizionabile sulla schermata
Attributi
backgroundColor stringa che indica il colore di sfondo della lista
listType stringa che indica il tipo di lista da visualizzare
Relazioni
clickListener relazione 0:1 tra la lista e l’oggetto ClickListener
listViewCells relazione 0:n tra la lista e gli elementi che compongono la lista
ListViewCell
Rappresenta un singolo elemento di una ListView
Attributi
name identificativo dell’elemento della lista
title stringa che indica il testo da visualizzare
subtitle stringa che indica un eventuale sottotitolo da visualizzare
Relazioni
parentListView relazione 1:1 tra l’elemento e la lista che lo contiene
46
3. GENERAZIONE DEL MODELLO ASTRATTO
UiPhoneControl - GridView
Rappresenta una griglia di elementi posizionabile sulla schermata
Attributi
gridType stringa che indica il tipo di griglia da visualizzare
Relazioni
clickListener relazione 0:1 tra la griglia e l’oggetto ClickListener
gridViewCells relazione 0:n tra la griglia e gli elementi che la compongono
GridViewCell
Rappresenta un singolo elemento di una GridView
Attributi
name identificativo dell’elemento della griglia
title stringa che indica il testo da visualizzare
Relazioni
parentGridView relazione 1:1 tra l’elemento e la griglia che lo contiene
UiPhoneControl - Map
Rappresenta una mappa posizionabile sulla schermata
Attributi
lat float che indica la latitudine a cui centrare la mappa
lon float che indica la longitudine a cui centrare la mappa
UiPhoneControl - Slider
Rappresenta uno slider posizionabile sulla schermata
UiPhoneControl - Spinner
Rappresenta un selettore di elementi posizionabile sulla schermata
UiPhoneControl - Switch
Rappresenta un bottone a interruttore (switch) posizionabile sulla schermata
47
3. GENERAZIONE DEL MODELLO ASTRATTO
UiPhoneControl - WebView
Rappresenta un contenitore di pagine web
Attributi
htmlFileName stringa che indica il file HTML sorgente da visualizzare
UiPhoneControl - ImageView
Rappresenta un’immagine posizionabile sulla schermata
Relazioni
sourceType relazione 1:1 tra l’ImageView e il tipo di file sorgente
UiPhoneControl - PhotocameraController
Rappresenta un bottone che richiami la fotocamera del dispositivo
Attributi
backgroundType stringa che indica se sia presente l’icona della fotocamera
Relazioni
imageView relazione 0:1 tra il PhotocameraCtrl e l’eventuale ImageView
UiPhoneControl - VideoView
Rappresenta un filmato posizionabile sulla schermata
Relazioni
sourceType relazione 1:1 tra la VideoView e il tipo di file sorgente
UiPhoneControl - VideocameraController
Rappresenta un bottone che richiami la videocamera del dispositivo
Attributi
backgroundType stringa che indica se sia presente l’icona della videocamera
Relazioni
videoView relazione 0:1 tra il VideocameraCtrl e l’eventuale VideoView
48
3. GENERAZIONE DEL MODELLO ASTRATTO
UiWatchControl
Rappresenta un widget che puo essere aggiunto a una schermata su smartwatch
Attributi
order intero che indica la posizione del widget dall’alto verso il basso
nella schermata
Relazioni
watchController relazione 1:1 tra il widget e la sua schermata
align relazione 0:1 tra i widgets che permette di allinearli
relativamente l’uno all’altro
above relazione 0:1 tra i widgets che permette di posizionarne uno
sopra l’altro
below relazione 0:1 tra i widgets che permette di posizionarne uno
sotto l’altro
toStartOf relazione 0:1 tra i widgets che permette di posizionare l’estre-
mo destro del widget all’estremo sinistro di un altro, ovvero
all’inizio
toEndOf relazione 0:1 tra i widgets che permette di posizionare l’estre-
mo sinistro del widget all’estremo destro di un altro, ovvero
alla fine
UiWatchControl - WatchButton
Rappresenta un bottone posizionabile sulla schermata
Attributi
title stringa che indica il testo contenuto nel bottone
Relazioni
watchClickListener relazione 0:1 tra il bottone e l’oggetto WatchClickListener
UiWatchControl - WatchLabel
Rappresenta un etichetta di testo posizionabile sulla schermata
Attributi
title stringa che indica il testo da visualizzare
textAlign stringa che indica l’allineamento orizzontale del testo
textDecoration stringa che indica il formato del testo da visualizzare
49
3. GENERAZIONE DEL MODELLO ASTRATTO
UiWatchControl - WatchSlider
Rappresenta uno slider posizionabile sulla schermata
UiWatchControl - WatchSwitch
Rappresenta un bottone a interruttore (switch) posizionabile sulla schermata
Attributi
title stringa che indica il testo da visualizzare accanto allo switch
UiWatchControl - WatchVoiceMessage
Rappresenta un bottone che invii un input vocale dallo smartwatch allo smartphone
Si descrive in seguito come siano stati modificati i modelli riguardanti i dispositivi
visualizzabili nell’editor grafico di Protocode e i controlli di anteprima trascinabili sul-
la schermata per istanziare i vari widgets.
Device
Rappresenta un dispositivo che viene utilizzato per posizionare i vari widget di Proto-
code. E la superclasse da cui ereditano i modelli Smartphone e Smartwatch
Attributi
name identificativo che rappresenta il nome del dispositivo mobile
label stringa che indica il nome da visualizzare nel menu di selezione
del dispositivo
platform stringa che indica la piattaforma del dispositivo
screenWidth,
screenHeight
stringa che indica la dimensione della superficie dello schermo
del dispositivo reale
viewTop,
viewBottom
stringa che indica la dimensione della superficie dello schermo
che viene occupata da eventuali barre di navigazione o header
in maniera permanente
cssWidth,
cssHeight
stringa che indica la dimensione in pixel della superficie dello
schermo all’interno dell’editor di Protocode
50
3. GENERAZIONE DEL MODELLO ASTRATTO
Smartphone
Rappresenta un device di tipo smartphone
Smartwatch
Rappresenta un device di tipo smartwatch
UiPhoneControlTemplate
Rappresenta un oggetto di anteprima dei widget per smartphone
Attributi
label stringa che indica il nome del relativo widget
nameImg stringa che indica il nome dell’immagine da visualizzare
all’interno dell’anteprima
type stringa che indica il tipo di widget che verra istanziato
UiWatchControlTemplate
Rappresenta un oggetto di anteprima dei widget per smartwatch
Attributi
label stringa che indica il nome del relativo widget
nameImg stringa che indica il nome dell’immagine da visualizzare
all’interno dell’anteprima
type stringa che indica il tipo di widget che verra istanziato
51
3. GENERAZIONE DEL MODELLO ASTRATTO
3.2.1.3 Controller
Per quanto riguarda la gestione dei controller, sono stati innanzitutto creati quelli
relativi ai nuovi widget per smartphone e smartwatch, e sono stati quindi adeguati i
vecchi controller al fine di manipolare le nuove caratteristiche introdotte per i widgets
gia presenti. Inoltre, sono stati aggiunti due ulteriori mixins per la gestione dei nuovi
componenti:
� TextDecorable: implementato sia dalle Label per smartphone che per smartwatch,
permette di manipolare l’aspetto del testo presente nelle etichette (normale,
grassetto o corsivo)
� WatchClickListenable: contiene la logica necessaria per la gestione e la cancella-
zione di modelli che sono collegati direttamente ad un oggetto WatchClickListener
E stato quindi rivisto il meccanismo di aggiunta dei widget su smartphone, impedendo
ad alcuni controlli di essere istanziati piu di una volta nella stessa schermata: in par-
ticolare, oggetti come le VideoView e le Mappe possono causare un arresto anomalo
dell’applicazione mobile su alcuni dispositivi e/o versioni di Android meno recenti, se
presenti piu di una volta nella stessa schermata.
Infine, per quanto riguarda gli smartwatch, il sistema di introduzione e cancellazio-
ne dei widget e stato naturalmente adeguato per tenere conto dell’ordinamento in
verticale dei componenti sulla schermata.
Si riporta in seguito lo schema dei controller di Protocode nella sua versione finale:
sono indicati in verde i controller che hanno subito delle modifiche e tutti i nuovi
controller e relazioni che sono stati introdotti.
52
3. GENERAZIONE DEL MODELLO ASTRATTO
3.2.1.4 View
Il primo intervento riguardo il meccanismo delle view, e stato quello di adeguare quelle
relative ai widget gia presenti nell’applicazione, in maniera tale da visualizzare le nuove
caratteristiche introdotte e, solo in seguito, sono state create le view corrispondenti ai
nuovi componenti.
Per modificare le proprieta riguardanti il colore di sfondo o quello del testo dei wid-
get di Protocode, e stato necessario introdurre dei componenti HTML dedicati, che
permettessero di scegliere un colore tramite il cosiddetto color picker, come avviene co-
munemente in tutti gli applicativi di manipolazione delle immagini: per questo scopo si
e utilizzata una libreria javascript/css, basata sempre su Bootstrap, chiamata Mjolnic
Bootstrap Colorpicker [64].
Per quel che riguarda invece la gestione dell’interfaccia grafica degli smartwatch, sono
stati introdotti i template dedicati a mostrare l’orologio nel pannello di editing grafico
e quelli relativi alle proprieta specifiche dei widget: il risultato ricalca esattamente il
template gia utilizzato per gli smartphone, rendendo la navigazione particolarmente
semplice ed intuitiva.
Poiche l’applicazione aveva ormai raggiunto una dimensione piuttosto consistente, sono
stati riorganizzati i fogli di stile in piu di un file .scss, ciascuno dedicato ad un parti-
colare sistema operativo, rendendo la manipolazione dell’interfaccia grafica piu snella
e scalabile.
Si riporta in seguito la gerarchia finale delle view di Protocode: sono indicate in verde
le view che hanno subito delle modifiche e tutte le nuove view e relazioni che sono state
introdotte.
54
3. GENERAZIONE DEL MODELLO ASTRATTO
3.2.2 Aggiornamento dell’interfaccia grafica
L’interfaccia grafica dell’applicazione ha subito in primo luogo una revisione puramen-
te estetica, riguardo il tema principale dei colori e riguardo la dimensione dei pannelli
contenenti i dispositivi e i relativi widgets: inoltre, sono state rimpiazzate le vecchie
icone dei widgets con un set di immagini piu moderno, che ricalcasse l’aspetto odierno
dei vecchi componenti e di quelli appena inseriti all’interno di Protocode.
A seguito dell’introduzione degli smartwatch dunque, e stato creato un menu a tendina
dedicato alla scelta dell’orologio da visualizzare e il relativo pannello di editing grafico,
mantenendo comunque l’impostazione iniziale di Protocode per rendere la navigazione
il piu lineare possibile. In sostanza, accedendo alla sezione dedicata all’editor, non
viene piu mostrato direttamente il pannello relativo alla modifica delle schermate per
smartphone, ma viene data la possibilita di scegliere quale tipo di dispositivo modificare
tramite un menu a bottoni posizionato appena sotto la barra di navigazione principale.
Figura 3.10: Anteprima applicazione smartphone Android su Protocode
56
3. GENERAZIONE DEL MODELLO ASTRATTO
Figura 3.11: Anteprima applicazione smartwatch WatchOS su Protocode
Smartphones
Per quanto riguarda gli smartphone, sono stati introdotti nuovi dispositivi sia per An-
droid che per iOS, rispettivamente il Nexus 6P e gli iPhones 6 e 6 Plus : in questo
modo e ora possibile visualizzare il risultato finale su dispositivi con lo stesso sistema
operativo ma con risoluzioni diverse, supportando l’utente in maniera ancora piu age-
vole durante la fase di design dell’interfaccia grafica.
A questo proposito, si e scelto di utilizzare delle immagini .png dei dispositivi con
uno schermo la cui risoluzione in pixels fosse esattamente uguale alla dimensione del-
lo schermo reale del dispositivo in dp per Android o in points per iOS: cosı facendo,
si eliminano completamente i difetti di approssimazione poiche tutto cio che viene
rappresentato nel browser avra una dimensione in scala 1:1 con il risultato finale sul
dispositivo reale.
I sistemi operativi visualizzati sugli smartphones, sono stati portati alla loro ultima
versione, rispettivamente Android Marshmallow per i dispositivi Nexus e iOS 9 per
gli iPhones; in particolare, il menu di navigazione a tendina per Android e stato com-
pletamente rimpiazzato da una navigazione tramite Tab Bar, che rispecchia molto piu
57
3. GENERAZIONE DEL MODELLO ASTRATTO
efficacemente il comportamento della Bottom Bar presente in basso nelle applicazioni
per iOS. Nonostante il grosso sforzo che questo comportera nella traduzione in codice
nativo, si e scelto di fare questo aggiornamento in quanto la versione originale di Pro-
tocode prevedeva che tutte le schermate su Android avessero lo stesso menu a tendina
nella Action Bar, creando un’incredibile confusione durante la navigazione, a causa del
continuo sovrapporsi di nuove schermate.
Widgets per smartphones
Si riporta in seguito una descrizione dettagliata di tutti i widgets per smartphones
disponibili nella versione finale di Protocode.
Widget Android iOS Personalizzazione
ButtonBottone grigio con
testo nero
Bottone bianco con
testo azzurro
Testo
Colore del testo
Colore di sfondo
Colore al click
Curvatura del bordo
ClickListener
Posizione
Dimensione
Label Testo nero Testo nero
Testo
Colore del testo
Dimensione del testo
Stile del testo
Allineamento del testo
Posizione
Dimensione
58
3. GENERAZIONE DEL MODELLO ASTRATTO
EditText
Campo di input
con bordo inferiore
rosa
Casella di input
con bordo
arrotondato
Testo
Placeholder
Colore del testo
Dimensione del testo
Posizione
Dimensione
Spinner
Menu di selezione a
tendina con bordo
inferiore rosa
Classica picker
view trasparente
Posizione
Dimensione
SwitchBottone a
interruttore rosa
Bottone a
interruttore verde
Posizione
Dimensione
SliderBarra di
scorrimento rosa
Barra di
scorrimento
azzurra
Posizione
Dimensione
WebView
Rettangolo grigio
con la scritta
WebView
Rettangolo azzurro
con la scritta
UIWebView
Nome del file sorgente
Posizione
Dimensione
ImageView
Rettangolo grigio
con icona di
un’immagine
Rettangolo azzurro
con la scritta
UIImageView
Tipo di sorgente
URI del file sorgente
Posizione
Dimensione
VideoView
Rettangolo grigio
con la scritta
VideoView
Rettangolo azzurro
con la scritta
UIVideoView
Tipo di sorgente
URI del file sorgente
Posizione
Dimensione
59
3. GENERAZIONE DEL MODELLO ASTRATTO
AudioPlayer
Contenitore di 3
bottoni rosa
rotondi e allineati
con i simboli
bianchi di play,
pause, stop
Contenitore di 3
bottoni bianchi
allineati con i
simboli azzurri di
play, pause, stop
Tipo di sorgente
URI del file sorgente
Posizione
Dimensione
ListViewContenitore
trasparente
Contenitore
trasparente
Colore di sfondo
Tipo di lista
ClickListener
Posizione
Dimensione
ListViewCell
Cella orizzontale
contenente
immagini e icone
oltre che ad un
titolo e sottotitolo
Cella orizzontale
contenente
immagini e icone
oltre che ad un
titolo e sottotitolo
Testo
Sottotitolo
GridViewContenitore
trasparente
Contenitore
trasparente
Tipo di griglia
ClickListener
Posizione
Dimensione
GridViewCell
Cella quadrata
contenente
immagini con testo
Cella quadrata
contenente
immagini con testo
Testo
Photocamera
Controller
Bottone grigio con
la scritta nera
“Fotocamera”
oppure con icona
di Fotocamera
Botton bianco con
la scritta azzurra
“Fotocamera”
oppure con icona
di Fotocamera
ImageView di
anteprima
(hardwareFile)
Posizione
Dimensione
60
3. GENERAZIONE DEL MODELLO ASTRATTO
Videocamera
Controller
Bottone grigio con
la scritta nera
“Videocamera”
oppure con icona
di Videocamera
Bottone bianco con
la scritta azzurra
“Videocamera”
oppure con icona
di Videocamera
VideoView di
anteprima
(hardwareFile)
Posizione
Dimensione
Audio
Recorder
Bottone grigio con
la scritta nera
“Rec”
Bottone bianco con
la scritta azzurra
“Rec”
AudioPlayer di
anteprima
(hardwareFile)
Posizione
Dimensione
Map Google Map Map View iOS
Longitudine del centro
Latitudine del centro
Posizione
Dimensione
DatepickerCalendario
trasparente
Classica picker
view trasparente
Posizione
Dimensione
Timepicker
Orologio digitale
con bottone rosa di
tracking
Classica picker
view trasparente
Posizione
Dimensione
Card
CardView a tutto
schermo con titolo
sottotitolo e
bottoni
CardView a tutto
schermo con titolo
sottotitolo e
bottoni
Titolo
Sottotitolo
Numero di bottoni
Posizione
Dimensione
MenuTabBar in alto
nella schermata
BottomBar in
basso nella
schermata
Tabella 3.2: Tabella dei widget smartphone nella versione finale di Protocode
61
3. GENERAZIONE DEL MODELLO ASTRATTO
Smartwatches
I dispositivi smartwatch introdotti nella nuova versione di Protocode sono i seguenti:
� Apple Watch 42mm, con sistema operativo watchOS di Apple, di forma rettan-
golare e con una risoluzione di 156x195 points.
� Asus Zen Watch, con sistema operativo Android Wear, di forma quadrata e con
una risoluzione di 213x213 dp.
� Moto 360, con sistema operativo Android Wear, di forma circolare e con una
risoluzione di 241x248 dp.
Anche in questo caso, sono state utilizzate delle immagini .png dei dispositivi con uno
schermo le cui dimensioni in pixels combaciassero con le risoluzioni reali degli schermi
degli orologi.
Widgets per smartwatches
Come gia anticipato nelle sezioni precedenti, sebbene anche i widgets per smartwatch
posseggano tutte le proprieta necessarie per un posizionamento completamente libero
sulla schermata e un sistema di vincoli identico ai componenti per smartphone, queste
proprieta non saranno comunque personalizzabili dall’utente.
Si e scelto di vincolare i dispositivi Android Wear a quelli watchOS, posizionando i
vari widgets consecutivamente l’uno sotto l’altro: questo in pratica, significa che sa-
ranno tutti larghi esattamente quanto la schermata dell’orologio e con le proprieta di
allineamento verticale “forzate a true” nel momento in cui questi vengono istanziati.
Si riporta in seguito una descrizione dettagliata di tutti i widgets per smartwatch
che e possibile aggiungere alle varie schermate.
62
3. GENERAZIONE DEL MODELLO ASTRATTO
Widget Android Wear watchOS Personalizzazione
WatchButton
Bottone grigio
chiaro con testo
bianco
Bottone grigio
scuro con testo
bianco
Testo
WatchClickListener
Altezza del bottone
WatchLabel Testo bianco Testo bianco
Testo
Stile del testo
Allineamento del testo
Altezza dell’etichetta
WatchSlider
Barra di
scorrimento
azzurra
Barra verde
suddivisa in step
con bottoni bianchi
+,-
Altezza del contenitore
della barra
WatchSwitch
Bottone a
interruttore
azzurro con testo
bianco
Bottone a
interruttore verde
con testo bianco
Testo
Altezza del contenitore
Watch-
VoiceMessage
Bottone grigio
chiaro con testo
bianco
Bottone grigio
scuro con testo
bianco
Altezza del bottone
Tabella 3.3: Tabella dei widget smartwatch nella versione finale di Protocode
63
3. GENERAZIONE DEL MODELLO ASTRATTO
3.3 Generazione del modello
In questa sezione, viene presentato il meccanismo con cui viene generato il modello
astratto dell’applicazione mobile e la sua struttura nel dettaglio: l’approccio model-
driven seguito per creare questo modello, si concretizza nella generazione di un file
XML che contiene tutte le informazioni riguardanti il prototipo creato graficamente,
senza dover conoscere in alcun modo la tecnologia con cui questo verra implementato.
In altre parole, il modello generato con Protocode, potrebbe essere utilizzato per gene-
rare applicazioni di natura completamente differente dallo scopo di questa ricerca, con
linguaggi e tecnologie diverse da quelle utilizzate per Android e iOS.
Come gia anticipato nella sezione riguardante i modelli dell’applicazione, ogni com-
ponente creato con Protocode possiede un attributo xmlName e un metodo toXml(),
che trasformano le proprieta degli oggetti Javascript in una stringa di testo secondo
la sintassi XML: al momento del download del modello, a partire dall’elemento radice
application, vengono richiamati ricorsivamente i metodi toXml() di tutte le schermate
dell’applicazione e dei loro widgets, per produrre appunto il modello astratto scritto in
formato XML. Naturalmente, si e dovuto intervenire sui vecchi modelli di Protocode,
oltre che su quelli appena introdotti, in maniera da poter generare tutte le nuove pro-
prieta, i nuovi componenti per smartphone e le schermate relative agli smartwatch.
Si presenta di seguito la struttura del modello astratto generato da Protocode nella sua
versione finale, descritta per compattezza tramite una grammatica EBNF (Extended
Backus-Naur Form).
64
3. GENERAZIONE DEL MODELLO ASTRATTO
XML →
<?xml version="1.0" encoding="UTF-8"?>
<metamodel:Application
name="APPNAME" companyIdentifier="it.polimi">
(VCONTROLLER)∗
(WCONTROLLER)∗
<menu>
(MENUITEM)∗
</menu>
</metamodel:Application>
VCONTROLLER →
<viewControllers
name="ID" backgroundColor="COLOR"
backgroundImage="STRING" launcher="BOOL">
(ALERTDIALOG)∗
(PROGRESSDIALOG)∗
(ASYNCTASK)∗
(UIPHONECONTROL)∗
</viewControllers>
WCONTROLLER →
<watchControllers name="ID" launcher="BOOL">
(UIWATCHCONTROL)∗
</watchControllers>
MENUITEM →
<menuItems title="STRING" id="ID">
<navigation destination="ID"/>
</menuItems>
65
3. GENERAZIONE DEL MODELLO ASTRATTO
ALERTDIALOG →
<alertDialogs id="ID" title="STRING" message="STRING" />
PROGRESSDIALOG →
<progressDialogs
id="ID" title="STRING"
message="STRING" spinner="BOOL" />
ASYNCTASK →
<asyncTasks name="ID" />
UIPHONECONTROL → BUTTON | LABEL | EDITTEXT |
SPINNER | SWITCH | SLIDER | WEBVIEW |
IMAGEVIEW | VIDEOVIEW | AUDIOPLAYER |
LISTVIEW | GRIDVIEW | MAP | CARD |
PHOTOCONTROLLER | VIDEOCONTROLLER |
AUDIORECORDER | DATEPICKER | TIMEPICKER
UIWATCHCONTROL → WATCHBUTTON | WATCHLABEL |
WATCHSLIDER | WATCHSWITCH | WATCHVOICEMESSAGE
BUTTON →
<buttons
PROPERTIES
viewController="ID"
title="STRING"
textColor="COLOR" backgroundColor="COLOR"
borderRadius="INT" clickColor="COLOR">
(CLICKLISTENER)?
</buttons>
66
3. GENERAZIONE DEL MODELLO ASTRATTO
LABEL →
<textViews
PROPERTIES
viewController="ID"
content="STRING"
textAlign="STRING" textColor="COLOR"
textSize="INT" textDecoration="STRING" />
EDITTEXT →
<editTexts
PROPERTIES
viewController="ID"
initialContent="STRING" placeholder="STRING"
textColor="COLOR" textSize="INT" />
SPINNER → <spinners PROPERTIES viewController="ID" />
SWITCH → <switches PROPERTIES viewController="ID" />
SLIDER → <sliders PROPERTIES viewController="ID" />
WEBVIEW →
<webViews
PROPERTIES
viewController="ID"
HTMLFileName="STRING" />
IMAGEVIEW →
<imageViews
PROPERTIES
viewController="ID" sourceType="STRING" fileUri="STRING" />
67
3. GENERAZIONE DEL MODELLO ASTRATTO
VIDEOVIEW →
<videoViews
PROPERTIES
viewController="ID" sourceType="STRING" fileUri="STRING" />
AUDIOPLAYER →
<audioPlayers
PROPERTIES
viewController="ID" sourceType="STRING" fileUri="STRING" />
LISTVIEW →
<listViews
PROPERTIES
viewController="ID"
backgroundColor="COLOR" listType="STRING">
(CLICKLISTENER)? (LISTVIEWCELL)∗
</listViews>
GRIDVIEW →
<gridViews
PROPERTIES
viewController="ID" gridType="STRING">
(CLICKLISTENER)? (GRIDVIEWCELL)∗
</gridViews>
PHOTOCONTROLLER →
<photocameraController
PROPERTIES
viewController="ID" imageViewId="ID" />
68
3. GENERAZIONE DEL MODELLO ASTRATTO
VIDEOCONTROLLER →
<videocameraController
PROPERTIES
viewController="ID" videoViewId="ID" />
AUDIORECORDER →
<audioRecorder
PROPERTIES
viewController="ID" audioPlayerId="ID" />
MAP →
<map
PROPERTIES
viewController="ID" lat="REAL" lon="REAL" />
DATEPICKER → <datepickers PROPERTIES viewController="ID"/>
TIMEPICKER → <timepickers PROPERTIES viewController="ID"/>
CARD →
<cards
PROPERTIES
viewController="ID"
title="STRING" subtitle="STRING" numActions="INT" />
WATCHBUTTON →
<watchButtons
PROPERTIES
watchController="ID" order="INT" title="STRING">
(WATCHCLICKLISTENER)?
</watchButtons>
69
3. GENERAZIONE DEL MODELLO ASTRATTO
WATCHLABEL →
<watchTextViews
PROPERTIES
watchController="ID"
order="INT" content="STRING"
textAlign="STRING" textDecoration="STRING"/>
WATCHSLIDER →
<watchSliders
PROPERTIES
watchController="ID" order="INT"/>
WATCHSWITCH →
<watchSwitches
PROPERTIES
watchController="ID" order="INT" title="STRING"/>
WATCHVOICEMESSAGE →
<watchVoiceMessage
PROPERTIES
watchController="ID" order="INT" title="STRING"/>
CLICKLISTENER →
<clickListener>
<navigation destination="ID"/>
</clickListener>
WATCHCLICKLISTENER →
<watchClickListener>
<watchNavigation destination="ID"/>
</watchClickListener>
70
3. GENERAZIONE DEL MODELLO ASTRATTO
LISTVIEWCELL →
<listViewCells title="STRING" subtitle="STRING" />
GRIDVIEWCELL →
<gridViewCells title="STRING" />
PROPERTIES →
id="ID" posX="REAL" posY="REAL" width="INT" height="INT"
paddingTop="INT" paddingBottom="INT"
paddingStart="INT" paddingEnd="INT"
marginTop="INT" marginBottom="INT"
marginStart="INT" marginEnd="INT"
alignParentTop="BOOL" alignParentBottom="BOOL"
alignParentStart="BOOL" alignParentEnd="BOOL"
alignTop="ID" alignBottom="ID" alignStart="ID" alignEnd="ID"
above="ID" below="ID" toStartOf="ID" toEndOf="ID"
APPNAME → ( a-z | A-Z )+
ID → ( a-z | A-Z )( a-z | A-Z | 0-9 | )∗
STRING → ( a-z | A-Z | 0-9 | )∗
REAL → ( 0-9 )+.( 0-9 )+
INT → ( 0-9 )+
BOOL → true | false
COLOR → #( A-F | 0-9 ){6}
Il modello cosı ottenuto al termine della fase di prototipizzazione, verra utilizzato per
generare le applicazioni Android e iOS in codice nativo senza ulteriori interventi da
parte dello sviluppatore: nel prossimo capitolo verra mostrato lo strumento in grado
di leggere questo modello e produrre delle applicazioni vere e proprie, semplicemente
prendendo in input questo file XML ed eseguendo la routine di traduzione, che potra
essere avviata con pochi click da parte dell’utente.
71
Capitolo 4
Traduzione in codice nativo
In questo capito viene descritto il meccanismo di traduzione in codice nativo del mo-
dello astratto generato tramite Protocode: lo strumento realizzato per la generazione
di codice sorgente e basato sulle stesse tecnologie che venivano utilizzate nella tool-
chain originale, ma le regole di traduzione sono state quasi completamente rimpiazzate
per adeguare lo strumento alle novita introdotte in fase di prototipizzazione. In que-
sto caso, verra esclusa dalla trattazione la descrizione della struttura originale dello
strumento di traduzione, poiche le modifiche introdotte durante questa ricerca, hanno
quasi completamente sostituito i vecchi meccanismi di generazione di codice nativo;
non mancheranno comunque eventuali segnalazioni riguardo componenti che sono stati
utilizzati senza alcuna modifica rispetto alla versione originale del progetto.
4.1 MobileCodeGenerator
L’applicativo utilizzato per la traduzione in codice sorgente del modello dell’applica-
zione mobile prende il nome di MobileCodeGenerator [66]: si tratta di un progetto che
si sviluppa all’interno dell’IDE Eclipse [67], ed e basato su una serie di strumenti che
permettono di generare un’istanza di un modello di dati strutturati e di tradurla in
codice sorgente per un particolare applicativo.
72
4. TRADUZIONE IN CODICE NATIVO
Nella sua versione originale, MobileCodeGenerator produceva un’applicazione Android
scritta in Java e un’applicazione iOS scritta in Objective-C: la prima, sottoforma di
file di progetto per Eclipse con ADT (Android Developer Tools) mentre la seconda,
sottoforma di file di progetto per Xcode. Si e modificato il funzionamento dell’applica-
tivo al fine di produrre un’applicazione mobile Android importabile direttamente nel
nuovo IDE dedicato Android Studio, e un’applicazione mobile iOS scritta con il nuovo
linguaggio Swift: in entrambi i casi, verranno generati anche tutti i file per la gestione
della controparte smartwatch degli applicativi all’interno dei rispettivi IDE di sviluppo.
4.1.1 Epsilon Suite
Lo strumento di traduzione del modello in codice nativo e basato su due principali
framework di modellazione, disponibili all’interno della distribuzione Epsilon di Eclipse:
EMF (Eclipse Modeling Framework), il quale permette la creazione e la gestione del
modello dell’applicazione mobile [68], e oAW (openArchitectureWare) che invece mette
a disposizione tutta una serie di strumenti utili alla traduzione del modello in codice
sorgente, in questo caso Java per Android e Swift per iOS. [69]
4.1.1.1 Eclipse Modeling Framework
E il framework che sta alla base della definizione del modello dell’applicazione mobi-
le e che permette di generare automaticamente un’istanza di questo modello, per poi
eventualmente tradurla in codice sorgente per un determinato applicativo; in questo
caso pero, EMF e stato utilizzato solamente per definire il modello dell’applicazione
mobile, in quanto la traduzione e stata progettata utilizzando gli strumenti disponibili
all’interno del framework oAW.
In teoria tramite EMF, una volta definito il modello dell’applicazione mobile, sareb-
be possibile anche generare un’istanza di questo sottoforma di file XML: nel nostro
caso pero, l’istanza del modello viene fornita direttamente dal file XML esportato da
Protocode, mentre il modello definito all’interno di MobileCodeGenerator serve per
garantire la correttezza delle regole di traduzione in termini di proprieta e relazioni fra
i vari componenti del modello.
73
4. TRADUZIONE IN CODICE NATIVO
4.1.1.2 openArchitectureWare
A partire dell’istanza del modello definito tramite EMF, e stato dunque possibile vali-
dare le proprieta di questa istanza e procedere alla fase di traduzione vera e propria: gli
strumenti utilizzati per questo proposito, sono tutti contenuti all’interno del framework
oAW e sono i seguenti:
� Xpand : per definire le regole di traduzione dell’istanza del modello.
� Xtend : per aggiungere alle funzionalita di Xpand la potenza del linguaggio Java.
� Check : per validare l’istanza del modello dell’applicazione.
� Modeling Workflow Engine: per definire il flusso di task da eseguire durante la
fase di traduzione vera e propria.
Figura 4.1: Meccanismo di traduzione di MobileCodeGenerator
74
4. TRADUZIONE IN CODICE NATIVO
Xpand
Si tratta di un framework che permette allo sviluppatore di produrre dell’output te-
stuale a partire da un modello EMF Ecore, UML2, JavaBeans o XMLSchema: nel caso
di MobileCodeGenerator, il modello dell’applicazione mobile e di tipo Ecore, e l’out-
put testuale prodotto e naturalmente linguaggio Java o Swift. Le regole di traduzione
possono essere modularizzate in piu file di estensione .xpt e contengono al loro interno
dei costrutti che permettono di produrre dell’output testuale sulla base degli elementi
che compongono l’istanza del modello, ad esempio :
�IMPORT metamodel�
�DEFINE attributesDeclarations FOR ViewController-�
�FOREACH buttons AS b-�
private Button �b.id�;
�ENDFOREACH-�
�ENDDEFINE-�
Il costrutto IMPORT viene utilizzato per far riferimento al modello dell’applicazione e
permette quindi di definire le regole di traduzione come attributesDeclarations che, per
ogni bottone presente nell’istanza del modello (FOREACH buttons), produce l’output
testuale “private Button �b.id�;”. [70]
Xtend
Grazie a questo strumento e possibile utilizzare dei metodi scritti completamente in
Java all’interno dei file Xpand che regolano la traduzione del modello: sono state create
alcune classi Java contenenti delle routine relative alla creazione delle directory di pro-
getto o alla creazione di nuovi file sorgente, che possono essere richiamate all’interno dei
file Xpand semplicemente utilizzando il costrutto �EXTENSION path-to-java-class� e
riportando all’interno di un file .ext di Xtend la lista dei metodi contenuti nella classe
Java originale. [71]
Si riporta una porzione di codice Xtend a titolo di esempio.
75
4. TRADUZIONE IN CODICE NATIVO
AndroidJavaUtil.java
public static void deleteApplicationFolder() {
File androidAppFolder =
new File(AndroidConstants.destinationFilesFolder);
AppJavaUtil.deleteFolder(androidAppFolder);
}
Java.ext
Void deleteApplicationFolder():JAVA
android extensions.AndroidJavaUtil.deleteApplicationFolder();
Check
Il linguaggio Check permette di definire all’interno di alcuni file con estensione .chk,
una serie di regole per la validazione dell’istanza del modello dell’applicazione mobile,
che verranno richiamate per prime durante la fase di traduzione vera e propria: anche in
questo caso, e possibile fare ricorso ad Xtend per effettuare delle verifiche piu articolate
utilizzando dei metodi scritti puramente in Java. All’interno di Check, e possibile
utilizzare dei costrutti tipici della logica matematica come forAll ed exists, combinarli
con semplici metodi Java come matches e dunque verificare determinate condizioni
per ciascun elemento dell’istanza del modello: nel caso in cui queste condizioni non
risultino verificate, e possibile sollevare un WARNING oppure un ERROR, bloccando
in quest’ultimo caso il processo di traduzione. [72]
Modeling Workflow Engine
Si tratta del framework che permette di definire il processo di traduzione vera e propria:
grazie ad esso, e possibile creare dei file .mwe all’interno dei quali, sono contenuti in
maniera sequenziale tutti i task da eseguire durante il processo di traduzione. In altre
parole, al suo interno si troveranno dei componenti scritti in un linguaggio basato su
XML, che leggono l’istanza del modello, verificano i vincoli scritti all’interno dei file
Check, eseguono la traduzione definita con Xpand e producono i file risultanti all’in-
terno di una particolare cartella di destinazione. [73]
76
4. TRADUZIONE IN CODICE NATIVO
4.1.2 Struttura del progetto
In questa sezione viene presentata la struttura del progetto di MobileCodeGenerator,
andando ad analizzare tutti i package che lo compongono e il loro ruolo nel meccanismo
di traduzione in codice nativo; in generale, lo scheletro dell’applicativo e composto da
tre sezioni principali: la cartella src contenente i cosiddetti template di traduzione e il
modello dell’applicazione, la cartella utils contenente i file che l’utente intende aggiun-
gere come risorse di progetto e la cartella src-gen che conterra i progetti per Android
Studio e Xcode al termine della traduzione. Tra i sorgenti ci sono inoltre tutte le li-
brerie di sistema, i plugin ed i file di configurazione necessari per garantire il corretto
funzionamento di MobileCodeGenerator.
Figura 4.2: Struttra del progetto di MobileCodeGenerator
77
4. TRADUZIONE IN CODICE NATIVO
4.1.2.1 Metamodello dell’applicazione mobile
All’interno della cartella src/metamodel si trova il cosiddetto metamodello dell’appli-
cazione mobile, ovvero la descrizione del modello dell’applicativo che verra tradotto
in codice nativo: come gia anticipato, si tratta di un modello di tipo .ecore, e ricalca
esattamente il modello utilizzato all’interno di Protocode, oltre al fatto che e accompa-
gnato anche da un modello grafico con estensione .ecore diagram, che rende ancora piu
esplicite le proprieta e le relazioni che i componenti dell’applicazione devono rispetta-
re. L’istanza del modello dell’applicazione, si trova invece nel percorso src/model ed e
costituito dal file XML generato al termine della fase di prototipizzazione.
Il package model checks infine, contiene i file relativi alla validazione dell’istanza del
modello da tradurre in codice nativo, rispettivamente:
� Checks.chk, che contiene tutti i controlli relativi alle proprieta del modello che
non sono state verificate gia in fase di prototipizzazione e che solleveranno even-
tualmente un errore in fase di traduzione.
� JavaChecks.java, che contiene dei metodi scritti in Java per i controlli di valida-
zione particolarmente elaborati.
� Extension.ext, che funge da ponte tra i metodi Java e i controlli Check contenuti
nei due precedenti file.
La validazione del modello effettuata tramite Check, riguarda ad esempio i file inseriti
dall’utente come immagini, audio e video, la corretta definizione del menu di naviga-
zione e la nomenclatura utilizzata per le schermate ed i widgets, come gia descritta
nella sezione relativa al modello esportato da Protocode.
78
4. TRADUZIONE IN CODICE NATIVO
4.1.2.2 Templates di traduzione
Si descrivono in seguito i cosiddetti template di traduzione, ovvero i file Xpand conte-
nenti le regole di traduzione e decorate da espressioni Java grazie ad Xtend, oltre che
il contenuto delle cartelle utils e src-gen utilizzate rispettivamente all’inizio e alla fine
della fase di traduzione.
Cartella src
� android activities templates: contiene tutti i template relativi alla generazio-
ne della componente logica di ciascun widget per smartphone su Android, dalla
loro dichiarazione fino ai metodi piu complessi che ne garantiscono il corretto
funzionamento. Sono stati modularizzati in piu file specifici alcuni metodi Java,
relativi al ciclo di vita delle Activities di Android come onCreate, onCreateView,
onPause e onResume.
� ios viewcontrollers templates: contiene tutti i template relativi alla genera-
zione della componente logica di ciascun widget per smartphone su iOS, dalla
loro dichiarazione fino ai metodi piu complessi che ne garantiscono il corret-
to funzionamento. Sono stati modularizzati in piu file specifici alcuni metodi
Swift, relativi al ciclo di vita dei ViewControllers di iOS come viewDidAppear,
viewDidDisappear e viewDidLoad.
� androidwear activities templates: contiene tutti i template relativi alla ge-
nerazione della componente logica di ciascun widget per smartwatch su Android-
Wear, dalla loro dichiarazione fino ai metodi piu complessi che ne garantiscono il
corretto funzionamento. Sono stati modularizzati in piu file specifici alcuni me-
todi Java, relativi al ciclo di vita delle Activities di AndroidWear come onCreate
e onLayoutInflated.
� ios watchcontrollers templates: contiene tutti i template relativi alla gene-
razione della componente logica di ciascun widget per smartwatch su watchOS,
dalla loro dichiarazione fino ai metodi piu complessi che ne garantiscono il cor-
retto funzionamento. Sono stati modularizzati in piu file specifici alcuni me-
79
4. TRADUZIONE IN CODICE NATIVO
todi Swift, relativi al ciclo di vita degli InterfaceControllers di watchOS come
awakeWithContext, willActivate e didDeactivate.
� android templates
– AndroidManifest.xpt : descrive il file Manifest per smartphone, con la lista
delle Activities e di tutti i permessi necessari.
– AndroidManifestWatch.xpt : descrive il file Manifest per smartwatch, con la
lista delle Activities e di tutti i permessi necessari.
– Activities.xpt : descrive la componente logica di ogni schermata dell’appli-
cazione per smartphone, ovvero la struttura delle Activities (in assenza di
un menu di navigazione), oppure quella dei Fragments (nel caso in cui una
schermata sia anche una sezione del menu dell’applicazione). Questa distin-
zione e inevitabile dal momento che si e scelto di utilizzare una navigazione
a Tab Bar per i sistemi Android, ma nonostante il differente ciclo di vita tra
Activities e Fragments, verra mantenuto lo stesso aspetto e comportamento
di ogni widget indipendentemente dal tipo di schermata.
– ActivitiesWatch.xpt : descrive la componente logica di ogni schermata del-
l’applicazione per smartwatch.
– XMLFiles.xpt : descrive l’interfaccia grafica di ogni schermata dell’applica-
zione per smartphone, che come avviene naturalmente per Android, consiste
in un singolo file in formato XML. All’interno di questo template, vengono
generati anche i file relativi al layout di ListView e GridView che conten-
gano immagini o icone e quelli relativi ai bottoni che non abbiano l’aspetto
grigio di default; inoltre, viene qui gestita la traduzione dei vincoli di posi-
zionamento tra i widgets secondo il sistema del RelativeLayout utilizzato da
Android. Anche in questo caso, la struttura generale del file XML e piutto-
sto differente a seconda che si tratti dell’interfaccia grafica di un’Activity o
di quella di un Fragment.
– XMLFilesWatch.xpt : descrive l’interfaccia grafica di ogni schermata dell’ap-
plicazione per smartwatch, ricalcando il sistema di posizionamento utilizzato
per smartphone.
80
4. TRADUZIONE IN CODICE NATIVO
– DefaultFiles.xpt : descrive intere classi Java che e necessario produrre per il
corretto funzionamento di determinati widget dell’applicazione su smartpho-
ne. In particolare, in questo template si trovano i cosiddetti Adapters per
ListView e GridView sofisticate, la classe ImageDownloadingTask.java per il
download in background delle immagini e la classe MyWearableListenerSer-
vice.java per la ricezione dei messaggi provenienti dallo smartwatch. Infine
questo template, descrive il file di build di Gradle [74] per lo smartphone,
con la lista di tutte le librerie che devono essere scaricate e installate.
– DefaultFilesWatch.xpt : descrive il file di build di Gradle per lo smartwatch,
con la lista di tutte le librerie che devono essere scaricate e installate.
� ios templates
– Xcodeproj.xpt : descrive il file .xcodeproj dell’applicazione, contenente i rife-
rimenti a tutti i file di progetto, alle Storyboards, ai ViewControllers dello
smartphone e agli InterfaceControllers per smartwatch. Ognuno dei file qui
elencati e identificato da una coppia di identificativi esadecimali che possono
avere un valore qualunque purche non siano ovviamente mai ripetuti.
– InfoPlist.xpt : descrive il file Info.plist dell’applicazione, contenente le infor-
mazioni relative alla compilazione del progetto, ed eventuali eccezioni per
gestire delle richieste HTTP che di default sono sempre proibite su iOS.
– MainStoryboard.xpt : descrive il file Main.storyboard dell’applicazione per
smartphone, contenente tutte le schermate e i relativi widgets. All’interno
di questo template naturalmente, viene gestita la traduzione dei vincoli di
posizionamento tra i widgets secondo il sistema dei vincoli di Xcode e l’e-
ventuale presenza o meno del menu di navigazione in basso nella Bottom
Bar; sono elencati in questo file anche tutti i collegamenti tra i widget e le
loro dichiarazioni all’interno dei ViewController, e gli eventuali meccanismi
di navigazione tra di essi.
– LaunchScreenStoryboard.xpt : descrive il file LaunchScreen.storyboard com-
posto solamente da una schermata bianca, mai visualizzata all’avvio dell’ap-
plicazione.
81
4. TRADUZIONE IN CODICE NATIVO
– ViewControllers.xpt : descrive la componente logica di ogni schermata del-
l’applicazione per smartphone, ovvero la struttura dei ViewControllers. Al
suo interno vi sono tutti i metodi riguardanti il ciclo di vita della schermata,
dove si andranno ad inserire i vari widgets e una sezione dedicata ai protocolli
da implementare per il corretto funzionamento di tutti i componenti.
– ViewConstraints.xpt : descrive in un template dedicato il meccanismo dei
vincoli tra i widgets all’interno di ogni schermata, poiche a differenza del
sistema utilizzato per Android, i vincoli su iOS sono diversi rispetto a quelli
dichiarati su Protocode e non possono essere semplicemente elencati tutti
quanti con dei parametri true o false. I vincoli in contrasto fra di loro, non
sempre possono essere ignorati a run-time come avviene per Android e percio
vanno verificati secondo un ordine ben preciso, per poi essere correttamente
importati nel template della Storyboard.
– InterfaceStoryboard.xpt : descrive il file Interface.storyboard dell’applicazione
per smartwatch, contenente tutte le schermate e i relativi widgets. All’inter-
no di questo template, torna finalmente utile il parametro order assegnato ai
widgets per smartwatch in fase di prototipizzazione, in quanto basta sempli-
camente elencare in ordine i vari componenti per posizionarli verticalmente
nella schermata. Come gia detto, il sistema di posizionamento per watchOS
e estremamente semplificato rispetto ad AndroidWear, e soprattutto e at-
tualmente molto difficile trovare dei punti in comune fra i due sistemi, se
non per la semplice altezza e larghezza dei widgets.
– InterfaceControllers.xpt : descrive la componente logica di ogni schermata
dell’applicazione per smartwatch, ovvero la struttura degli InterfaceCon-
trollers. Al suo interno vi sono tutti i metodi riguardanti il ciclo di vita
della schermata, dove si andranno ad inserire i vari widgets e una sezione
dedicata ai protocolli da implementare per il corretto funzionamento di tutti
i componenti.
82
4. TRADUZIONE IN CODICE NATIVO
� android extensions: raccoglie le classi Java AndroidConstants e AndroidJa-
vaUtil contenenti i metodi relativi alla creazione e cancellazione di file sorgente
per Android, che vengono richiamati nei template di traduzione grazie alla classe
Xtend Java.ext
� ios extensions: raccoglie le classi Java iOSConstants e iOSJavaUtil contenenti
i metodi relativi alla creazione e cancellazione di file sorgente per iOS, la genera-
zione degli ID esadecimali per il file .xcodeproj e la traduzione dei colori da hex
a rgb, che vengono richiamati nei template di traduzione grazie alla classe Xtend
Java.ext
� app extensions: raccoglie la classe Java AppJavaUtil contenente i metodi rela-
tivi alla creazione e cancellazione dei file sorgente designati dall’utente in fase di
prototipizzazione, che vengono richiamati nei template di traduzione grazie alla
classe Xtend Java.ext
� workflow: raccoglie i file .mwe per l’avvio del processo di traduzione, Android-
Generator.mwe, iOSGenerator.mwe e iOSAndAndroidGenerator.mwe, che con-
tengono un riferimento all’istanza del modello, ai file Check per la sua validazio-
ne e la sequenza dei template di traduzione Xpand da eseguire per la specifica
piattaforma. Si descrive in seguito la struttura generale dei file .mwe:
<workflow>
<!-- istanza modello -->
<property name="model" value="../model/file.xmi"/>
<!-- cartella di output -->
<property name="src-gen" value="src-gen/piattaforma"/>
<bean class=".StandaloneSetup">
<platformUri value=".."/>
</bean>
83
4. TRADUZIONE IN CODICE NATIVO
<!-- riferimento metamodello -->
<bean id="mm emf" class=".EmfRegistryMetaModel"/>
<!-- lettura istanza modello -->
<component class=".Reader">
<uri value="platform:/resource/${model}"/>
<modelSlot value="model"/>
</component>
<!-- check vincoli istanza modello -->
<component class=".CheckComponent">
<metaModel id="mm" class=".EmfRegistryMetaModel"/>
<checkFile value="model checks::Checks"/>
<emfAllChildrenSlot value="model"/>
</component>
<!-- esecuzione n-esimo template xpand -->
<component class=".Generator">
<metaModel idRef="mm emf"/>
<expand value="n-esimo template xpand"/>
<outlet path="${src-gen}">
<postprocessor class=".JavaBeautifier"/>
</outlet>
<resourceManager class =".ResourceManagerDefaultImpl">
<fileEncoding value="ISO-8859-1"/>
</resourceManager>
</component>
...
...
...
</workflow>
84
4. TRADUZIONE IN CODICE NATIVO
Cartella utils
La cartella utils, contiene tutti i file che devono essere aggiunti come sorgenti di pro-
getto sia per smartphone che per smartwatch oltre che ai file relativi ad immagini,
video e audio che sono stati gia previsti in fase di prototipizzazione: in particolare, an-
droid default files e ios default files, contengono rispettivamente le icone per Android
e i file di build di Gradle, e tutti gli asset da importare in Xcode, mentre user files
contiene le immagini, i video e i sorgenti audio che l’utente vuole inserire all’interno
dell’applicazione.
Cartella src-gen
Infine, la cartella src-gen contiene tutti i file di progetto per Android e iOS: nel primo
caso bastera aprire Android Studio, fare click su “Open an existing Android Studio
project” e selezionare la cartella presente in src-gen/android/, mentre per iOS bastera
fare click sul file .xcodeproj nella cartella src-gen/ios/ e attendere l’avvio di Xcode.
85
4. TRADUZIONE IN CODICE NATIVO
4.2 Traduzione in codice nativo
In questa sezione viene presentato il risultato finale della traduzione in codice nativo,
con una panoramica sui progetti Android Studio e Xcode generati, e una descrizione
dettagliata della logica di tutti i componenti.
Per quanto riguarda Android, vengono generate nella directory src-gen/android/NOME-
APP le due cartelle mobile e wear contenenti tutti i file relativi rispettivamente all’ap-
plicazione mobile su smartphone e su smartwatch oltre che ad un file Gradle, che
all’avvio di Android Studio, scarichera tutte le librerie necessarie e avviera la com-
pilazione automatica del progetto. L’applicazione generata sara dunque compatibi-
le con le versioni Android dalla API 16 alla 23 sia per smartphone che per tablet,
e tramite l’applicazione dedicata di AndroidWear sara possibile connettere il dispo-
sitivo all’orologio e installare la controparte dell’applicativo. La scelta di limitarsi
al range di APIs sopra specificato, ha permesso di sfruttare tutti i componenti gra-
fici piu moderni, utilizzando semplicemente le librerie di retro-compatibilita fornite
da Google (com.android.support:support-v4:23.4.0 e com.android.support:appcompat-
v7:23.2.1 ) coprendo allo stesso tempo il 95.2% dei dispositivi attualmente attivi sul
Google Play Store (dati forniti direttamente da Android Studio). Fa eccezione solamen-
te il Timepicker, che nella sua ultima versione del Material Design, non e compatibile
con APIs inferiori alla 21, e dunque, per mantenere un aspetto coerente su tutti i
dispositivi, si e scelto di utilizzare una libreria esterna per istanziare un Timepicker
retro-compatibile chiamata com.github.ugurtekbas:dialTimePicker:9f4af78e90.
Per quanto riguarda iOS invece, vengono generate nella directory src-gen/ios/NOME-
APP le tre cartelle NOME-APP, NOME-APP Watchkit App e NOME-APP Watch-
Kit Extension contenenti tutti i file relativi rispettivamente all’applicazione mobile su
smartphone e su smartwatch (le due cartelle WatchKit) oltre che al file .xcodeproj
contenente tutti gli identificativi dei file di progetto. L’applicazione generata avra co-
me SO target iOS 9 sia per iPhone che per iPad, e tramite l’applicazione dedicata di
watchOS sara possibile connettere il dispositivo all’orologio e installare la controparte
86
4. TRADUZIONE IN CODICE NATIVO
dell’applicativo. I componenti generati per iOS sono tutti e soli i widgets disponibili
nativamente all’interno di Xcode, ad eccezione della CardView che e un componente
specifico della piattaforma Android, e che e stato replicato creando una View persona-
lizzata.
Si presenta in seguito una descrizione dettagliata della logica applicativa di tutti i
componenti generati al termine della traduzione con MobileCodeGenerator.
Widget Android iOS
Button
Dichiarazione di un oggetto
Button. Metodo onClick()
dichiarato all’interno di
onCreateView() oppure
onCreate() a seconda della
presenza o meno del menu, che
gestisce eventualmente la
navigazione tramite Intent.
Dichiarazione di un oggetto
UIButton. Metodi touchDown()
e touchUpInside() che
gestiscono l’interazione con il
bottone. La logica di
navigazione e a carico della
Storyboard.
EditTextDichiarazione di un oggetto
AppCompatEditText.
Dichiarazione di un oggetto
UITextField.
Spinner
Dichiarazione di un oggetto
AppCompatSpinner. Metodi
onItemSelected() e
onNothingSelected() dichiarati
all’interno di onCreateView()
oppure onCreate() e invocati
sui rispettivi eventi.
Dichiarazione di un oggetto
UIPickerView. Metodi
pickerView(...) per gestire il
contenuto dello Spinner e la
selezione di un elemento.
87
4. TRADUZIONE IN CODICE NATIVO
Switch
Dichiarazione di un oggetto
SwitchCompat. Metodo
onCheckedChanged() dichiarato
all’interno di onCreateView()
oppure onCreate() e invocato
nel momento in cui vi e un
cambio di stato dello Switch.
Dichiarazione di un oggetto
UISwitch. Metodo
valueChangedAction() per
rilevare lo stato dello Switch.
Slider
Dichiarazione di un oggetto
AppCompatSeekBar. Metodi
onProgressChanged(),
onStartTrackingTouch() e
onStopTrackingTouch()
dichiarati all’interno di
onCreateView() oppure
onCreate() e invocati sui
rispettivi eventi.
Dichiarazione di un oggetto
UISlider. Metodo
valueChangedAction() per
rilevare lo stato dello Slider.
WebView
Dichiarazione di un oggetto
WebView. Metodo
loadDataWithBaseURL()
dichiarato all’interno di
onCreateView() oppure
onCreate(), che carica il
contenuto HTML della
WebView.
Dichiarazione di un oggetto
UIWebView. Metodo
loadRequest() che carica il
contenuto HTML della
UIWebView.
88
4. TRADUZIONE IN CODICE NATIVO
ImageView
Dichiarazione di un oggetto
ImageView. Metodo ImageDo-
wnloadingTask().execute()
dichiarato all’interno di
onCreateView() oppure
onCreate(), che scarica
l’immagine nel caso sia di tipo
remoto e non fra le risorse di
progetto.
Dichiarazione di un oggetto
UIImageView. Metodo
ImageDownloadingTa-
sk().downloadImage() che
scarica l’immagine nel caso sia
di tipo remoto e non fra le
risorse di progetto.
VideoView
Dichiarazione di un oggetto
VideoView. Inizializzazione
all’interno di onCreateView()
oppure onCreate(), che carica il
file sorgente ed esegue la
riproduzione del video.
Dichiarazione di un oggetto
UIWebView. Inizializzazione
all’interno di viewDidAppear()
che carica un iFrame HTML
all’interno della WebView
contenente l’indirizzo del
filmato.
AudioPlayer
Dichiarazione di 3 oggetti
FloatingActionButton (play,
pause e stop) e un MediaPlayer.
Metodi onClick() per ciascun
bottone che richiamano i
metodi MediaPlayer.play(),
MediaPlayer.pause() e
MediaPlayer.stop(). Gestione
della riproduzione audio
all’interno di onResume() e
onPause() dell’Activity.
Dichiarazione di un oggetto
AVAudioPlayer inizializzato in
viewDidAppear(). Metodi
play(), pause() e stop() collegati
ai bottoni della Storyboard.
Gestione della riproduzione
audio all’interno di
viewDidAppear() e
viewDidDisappear() del
ViewController.
89
4. TRADUZIONE IN CODICE NATIVO
ListView
Dichiarazione degli oggetti
ListView e ListViewAdapter,
dichiarazione di array di Integer
e String a seconda degli
elementi che decorano la
ListView. Metodo
onItemClick() che gestisce
eventualmente la navigazione
tramite Intent.
Dichiarazione di un oggetto
UITableView, dichiarazione di
array di UIImage e String a
seconda degli elementi che
decorano la ListView. Metodi
tableView(...) per gestire il
contenuto della ListView, e
prepareForSegue() per
configurare i parametri da
passare eventualmente durante
la navigazione.
GridView
Dichiarazione degli oggetti
GridView e GridViewAdapter,
dichiarazione di array di Integer
e String a seconda degli
elementi che decorano la
GridView. Metodo
onItemClick() che gestisce
eventualmente la navigazione
tramite Intent.
Dichiarazione di un oggetto
UICollectionView, dichiarazione
di array di UIImage e String a
seconda degli elementi che
decorano la GridView. Metodi
collectionView(...) per gestire il
contenuto della GridView, e
prepareForSegue() per
configurare i parametri da
passare eventualmente durante
la navigazione.
90
4. TRADUZIONE IN CODICE NATIVO
Photocamera
Controller
Dichiarazione di un oggetto
Button o ImageButton. Metodo
onClick() dichiarato all’interno
di onCreateView() oppure
onCreate(), che gestisce
eventualmente l’accesso alla
fotocamera tramite Intent.
Metodi
copyImageInImagesFolder() e
onActivityResult() per gestire il
ritorno dalla fotocamera.
Metodi openPhotoCamera() e
imagePickerController() per
accedere alla fotocamera del
dispositivo, metodo UIImageW-
riteToSavedPhotosAlbum() per
salvare la fotografia.
Videocamera
Controller
Dichiarazione di un oggetto
Button o ImageButton. Metodo
onClick() dichiarato all’interno
di onCreateView() oppure
onCreate(), che gestisce
eventualmente l’accesso alla
videocamera tramite Intent.
Metodi
copyVideoInVideosFolder() e
onActivityResult() per gestire il
ritorno dalla videocamera.
Metodi openVideoCamera e
imagePickerController per
accedere alla videocamera del
dispositivo, metodo UISaveVi-
deoAtPathToSavedPhotosAlbum
per salvare il filmato.
91
4. TRADUZIONE IN CODICE NATIVO
Audio
Recorder
Dichiarazione di un oggetto
Button e un MediaRecorder.
Metodi setUpAudioRecorder(),
startRecording() e
stopRecording( ), richiamati in
maniera differente a seconda
della presenza o meno del menu
di navigazione. Gestione della
registrazione audio all’interno
di onResume() e onPause()
dell’Activity.
Dichiarazione degli oggetti
UIButton e AVAudioRecorder.
Metodo record() per richiamare
il microfono del dispositivo.
Gestione della registrazione
audio all’interno di
onResume(viewDidAppear) e
viewDidDisappear() del
ViewController.
Map
Dichiarazione degli oggetti
MapView e GoogleMap, il
primo utilizzato nei Fragment
in assenza di menu di
navigazione, il secondo nelle
normali Activities. Metodo
onMapReady() che inizializza la
mappa e la centra alle
coordinate stabilite.
Dichiarazione di un oggetto
MKMapView. Inizializzazione
all’interno di viewDidLoad() che
centra la mappa nelle
coordinate stabilite.
Datepicker
Dichiarazione di un oggetto
MaterialCalendarView. Metodo
onDateSelected() dichiarato
all’interno di onCreateView()
oppure onCreate(), che rileva la
data selezionata.
Dichiarazione di un oggetto
UIDatePicker. Metodo
valueChangedAction() per
rilevare la data selezionata.
92
4. TRADUZIONE IN CODICE NATIVO
Timepicker
Dichiarazione di un oggetto
Picker. Metodo timeChanged()
dichiarato all’interno di
onCreateView() oppure
onCreate() a seconda della
presenza o meno del menu di
navigazione, che rileva l’orario
selezionato.
Dichiarazione di un oggetto
UIDatePicker. Metodo
valueChangedAction() per
rilevare l’orario selezionato.
Card
Dichiarazione degli oggetti
CardView, ImageView e
Button. Metodo onClick()
dichiarato all’interno di
onCreateView() oppure
onCreate(), che rileva il click di
un bottone nella CardView.
Metodo setUpCardView() per
scalare correttamente la
CardView rispetto alla
dimensione dello schermo.
Dichiarazione di un oggetto
UIView, che ricalca l’aspetto
della CardView Android grazie
alla composizione di molteplici
Views all’interno della
Storyboard. Metodo
touchUpInside() per rilevare la
selezione di un particolare
bottone nella Card.
Alert
Dialog
Metodo show() invocato
all’interno di
setUserVisibilityHint() oppure
onCreate(), che richiama
l’oggetto AlertDialog.Builder e
il metodo AlertDialog.show()
Metodo
presentViewController()
invocato all’interno di
viewDidAppear() su di un
oggetto UIAlertController.
93
4. TRADUZIONE IN CODICE NATIVO
Progress
Dialog
Metodo show() invocato
all’interno di
setUserVisibilityHint() oppure
onCreate(), che richiama
l’oggetto ProgressDialog e il
metodo ProgressDialog.show()
Metodo
presentViewController()
invocato all’interno di
viewDidAppear() su di un
oggetto UIAlertController.
AsyncTask
Metodo
AsyncTask.execute(/*param1,
param2 ... */) invocato
all’interno di onCreateView()
oppure onCreate(), che
richiama i metodi
doInBackground(Void...
params),
onProgressUpdate(Void...
progress) e onPostExecute(Void
result)
Metodo dispatch async()
invocato all’interno di
viewDidLoad() che permette di
riprodurre dei task in maniera
asincrona e dunque proseguire
con le operazioni successive.
Tabella 4.1: Tabella dei widget smartphone tradotti con MobileCodeGenerator
94
4. TRADUZIONE IN CODICE NATIVO
Widget AndroidWear watchOS
WatchButton
Dichiarazione di un oggetto
Button. Metodo onClick()
dichiarato all’interno di
onLayoutInflated(), che gestisce
eventualmente la navigazione
tramite Intent.
Dichiarazione di un oggetto
WKInterfaceButton. Metodo
action() che gestisce
l’interazione col bottone.
WatchSwitch
Dichiarazione di un oggetto
Switch. Metodo
onCheckedChanged() dichiarato
all’interno di onLayoutInflated()
e invocato nel momento in cui
vi e un cambio di stato dello
Switch.
Dichiarazione di un oggetto
WKInterfaceSwitch. Metodo
valueChangedAction() per
rilevare lo stato dello Switch.
WatchSlider
Dichiarazione di un oggetto
SeekBar. Metodi
onProgressChanged(),
onStartTrackingTouch() e
onStopTrackingTouch()
dichiarati all’interno di
onLayoutInflated() e invocati
sui rispettivi eventi.
Dichiarazione di un oggetto
WKInterfaceSlider. Metodo
action() per rilevare lo stato
dello Slider.
95
4. TRADUZIONE IN CODICE NATIVO
WatchVoice
Message
Dichiarazione degli oggetti
Button, GoogleApiClient e
DelayedConfirmationView.
Metodi
displaySpeechRecognizer() che
visualizza il traduttore
speech-to-text di Google,
displayDelayedViewContainer()
che visualizza il Dialog animato
per l’invio del messaggio
registrato, e infine
sendMessage(String message)
che invia il messaggio al
dispositivo associato
all’orologio.
Dichiarazione di un oggetto
WCSession, inizializzato
all’interno di willActivate() per
stabilire se l’orologio sia
connesso o meno allo
smartphone. Metodo
send(messageId: String) che
mostra il traduttore
speech-to-text di watchOS e
invia il messaggio al dispositivo
associato.
Tabella 4.2: Tabella dei widget smartwatch tradotti con MobileCodeGenerator
Come evidenziato in tabella, l’inizializzazione dei componenti Android e fortemente in-
fluenzata dalla presenza o meno del menu di navigazione, poiche i gruppi di Fragments
hanno un ciclo di vita differente rispetto alle normali Activities: non e possibile infatti
riportare tutto cio che viene normalmente inizializzato all’interno del metodo onCreate
delle Activities all’interno dell’onCreateView dei Fragments, poiche questo permette-
rebbe ad esempio ad un Fragment appena creato ma non ancora visibile sullo schermo,
di riprodurre una traccia audio/video o mostrare dei Dialog che niente hanno a che
fare con il Fragment che viene realmente mostrato. Casi come quello appena descritto,
hanno fatto sı che per ciascun componente, si e dovuto analizzare quale fosse il modo
migliore possibile per inizializzarlo senza intaccare le schermate adiacenti a quella cor-
rentemente attiva, ad esempio verificando se il Fragment fosse realmente visibile (oltre
che attivo) tramite il metodo setUserVisibilityHint(). Nonostante questo abbia reso il
96
4. TRADUZIONE IN CODICE NATIVO
meccanismo di traduzione decisamente piu complesso rispetto a quello sviluppato in
Swift per iOS, si e riusciti dunque ad ottenere un comportamento pressoche identico
su entrambe le piattaforme.
Per quanto riguarda gli smartwatch, si e cercato di creare dei componenti che non
fossero soltanto rilegati alla dimensione dell’orologio, ma che fossero gia in grado di
comunicare con lo smartphone associato: in particolare, il WatchVoiceMessage e un
bottone che permette di inviare un messaggio registrato dall’orologio tramite il mec-
canismo dei Messages di AndroidWear, oppure delle WCSessions di watchOS. In en-
trambi i casi, quando lo smartphone o in generale il dispositivo cosiddetto handheld si
connettera con lo smartwatch e avviera l’applicazione, ricevera tutti i messaggi inviati
dall’orologio e li manterra in memoria fino alla chiusura dell’applicazione, a meno che
non vengano salvati in maniera persistente nel database del dispositivo.
Infine si vuole precisare che, l’interfaccia grafica dei componenti, ricalca perfettamen-
te la descrizione gia affrontata nella sezione relativa a Protocode, ed e stata percio
volutamente esclusa dalla precedente tabella di riepilogo; nel prossimo capitolo verra
mostrata un’analisi qualitativa e quantitativa dello sviluppo di un’applicazione mobile
tramite l’utilizzo della toolchain descritta fino ad ora, al fine di dimostrare le reali
capacita di questo strumento nella fase iniziale dello sviluppo di applicazioni mobili.
97
Capitolo 5
Valutazione
In questo capitolo vengono presentati due esempi di processo di sviluppo di un’ap-
plicazione mobile tramite gli strumenti Protocode e MobileCodeGenerator: nel primo
caso, viene valutata la quantita di codice sorgente che e stato possibile generare per
un’applicazione di medie dimensioni creata da zero, mentre nel secondo caso si e cer-
cato di riprodurre il piu fedelmente possibile l’interfaccia grafica di un’applicazione gia
presente sul mercato, per valutare la qualita degli strumenti sviluppati.
5.1 Analisi quantitativa
Per analizzare i risultati prodotti della toolchain Protocode/MobileCodeGenerator e
stata creata un’applicazione mobile per smartphone e smartwatch chiamata ParkTrai-
ning : si tratta di un’applicativo dedicato all’allenamento all’aria aperta, che permette
all’utente di raccogliere una serie di esercizi, di registrare fotografie e filmati dell’alle-
namento e di salvare delle posizioni relative ai luoghi di allenamento preferiti. Tramite
lo smartwatch, l’utente e in grado di aggiungere nuovi esercizi, semplicemente selezio-
nando il numero di ripetizioni e pronunciando il nome del nuovo esercizio, che verra
automaticamente inviato allo smartphone e salvato in maniera persistente. Si descrive
in seguito il modello dell’applicazione ParkTraining generato tramite Protocode.
98
5. VALUTAZIONE
Figura 5.2: Modello dell’applicazione ParkTraining su smartwatch
Come e possibile intuire dal modello appena proposto, l’applicazione e composta sostan-
zialmente da 4 schermate, tutte racchiuse nel menu di navigazione principale: ognuna
di queste, mostra l’elenco di esercizi, foto, video e luoghi salvati all’interno dell’applica-
zione, alcuni sottoforma di lista, altri sottoforma di griglia; inoltre, ciascuna schermata
contiene un bottone in grado di aggiungere un nuovo elemento dello stesso tipo, ovvia-
mente secondo meccanismi differenti.
Innanzitutto la schermata degli esercizi, e quella che verra mostrata per prima al-
l’avvio dell’applicazione, e contiene appunto una lista di tutti gli esercizi, con nome e
numero di ripetizioni; facendo click su un elemento della lista, viene creata una nuova
schermata che consente di modificare le ripetizioni o il nome dell’esercizio. Premendo
invece sul bottone presente nella schermata principale, e possibile aggiungere un nuovo
esercizio tramite una schermata contenente un campo di testo e un paio di spinner che
indicano il numero di serie e di ripetizioni.
100
5. VALUTAZIONE
Nel caso di foto e video invece, premendo sul bottone presente in basso nello schermo,
viene creata una nuova schermata contenente il bottone che richiama rispettivamente
la fotocamera o la videocamera dello smartphone, e la relativa ImageView o Video-
View che mostrano il file catturato dal dispositivo: e quindi possibile salvare il file
appena creato, oppure semplicemente tornare alla schermata precedente. Nella scher-
mata principale delle foto, naturalmente, viene mostrata una griglia contente tutte le
immagini in anteprima, mentre in quella dei video, la griglia mostra il primo frame di
ogni filmato e la sua durata totale.
Per quanto riguarda i luoghi di allenamento, e possibile aggiungere nuove posizioni
facendo click sul bottone in basso nella schermata, che recupera le attuali coordinate
dell’utente tramite GPS e le salva direttamente nel database dell’applicazione; cliccan-
do su di uno dei luoghi presenti nella lista principale invece, viene mostrata la posizione
del luogo di allenamento selezionato all’interno di una mappa.
Le schermate presenti su smartwatch infine sono solamente 3, e permettono di sele-
zionare in questo ordine, il numero di serie, il numero di ripetizioni e il nome dell’eser-
cizio da aggiungere alla raccolta presente sullo smartphone: cliccando sul bottone rec
presente nell’ultima schermata, verra richiamata la funzionalita speech-to-text dell’oro-
logio, che traduce in una stringa di testo l’input vocale registrato dall’utente e la invia
direttamente allo smartphone per salvarla in maniera persistente.
101
5. VALUTAZIONE
Figura 5.3: Applicazione ParkTraining simulata su Apple Watch 42mm
Figura 5.4: Applicazione ParkTraining simulata su iPhone6s Plus - 1
102
5. VALUTAZIONE
5.1.1 Android
Una volta tradotto il modello dell’applicazione in un progetto Android Studio tramite
MobileCodeGenerator, e stato necessario effettuare alcune modifiche preliminari al co-
dice sorgente, per correggere il comportamento di alcuni componenti dell’applicativo:
innanzitutto, e stata creata una Google Map API key tramite la Developers Console
di Google (http://console.developers.google.com) ed e stata inserita all’interno
del file Manifest dell’applicazione, per poter inizializzare la Google Map all’interno
dell’Activity Locations. Quindi, sono stati spostati i metodi show() relativi ai Dialog
di conferma per la cancellazione di esercizi, foto, video e luoghi, all’interno della fun-
zione che viene evocata quando l’utente clicca appunto sul bottone di cancellazione;
in origine infatti, i Dialogs creati su Protocode e tradotti in codice sorgente, venivano
semplicemente visualizzati all’apertura della relativa Activity. Infine, sono stati sosti-
tuiti tutti i testi come “add” o “delete” presenti sui bottoni, con le rispettive icone di
salvataggio e cancellazione.
A questo punto, l’applicazione necessitava dell’introduzione di uno strato di dati per-
sistente, in maniera da divenire concretamente utilizzabile: per fare cio, sono state
create le classi Java che permettono all’applicazione di interfacciarsi con il database
SQLite del dispositivo, ovvero le classi relative agli oggetti Exercise.java, Photo.java,
Video.java e Location.java oltre che al SQLiteHelper.java e al DatabaseAdapter.java
necessari per la gestione delle operazioni CRUD (Create Read Update Delete) sulla
base di dati.
Infine, e stato modificato il WearableListenerService.java, ovvero la classe incarica-
ta di gestire la ricezione dei messaggi dallo smartwatch, in maniera tale che questi
venissero converiti in oggetti Exercise.java e inseriti nel database; d’altra parte, non
e stato necessario intervenire pesantemente sul codice sorgente generato per lo smart-
watch, che e risultato essere completo quasi al 100%, se non per il semplice passaggio
di parametri da una scherma all’altra, che ha necessitato di pochissime righe di codice.
104
5. VALUTAZIONE
Si presenta di seguito una tabella relativa alle Logical SLOC del progetto Android Stu-
dio (ovvero le righe di codice che compongono il progetto senza considerare i commenti
e gli spazi vuoti fra gli statementes) sia cosı come generato da MobileCodeGenerator
e sia cosı come si presenta nella sua forma finale, al termine delle modifiche descritte
sopra.
App Generata App Completa Percentuale
Mobile Java SLOC 1254 1967 63.8%
Mobile XML 1591 1591 100%
Wear Java SLOC 285 295 96.6%
Wear XML 761 761 100%
Tabella 5.1: Copertura codice sorgente ParkTraining Android Studio
5.1.2 iOS
Per quanto riguarda la generazione del progetto Xcode tramite MobileCodeGenerator,
sono state effettuate anche in questo caso alcune modifiche preliminari, del tutto simili
alle precedenti introdotte per Android: sono stati spostati i metodi relativi alla visua-
lizzazione dei Dialogs di cancellazione di esercizi, foto, video e luoghi, all’interno della
funzione che viene evocata quando l’utente clicca appunto sul bottone di cancellazione,
e sono stati sostituiti tutti i testi come “add” o “delete” presenti sui bottoni, con le
rispettive icone di salvataggio e cancellazione.
A questo punto, per poter creare e manipolare gli oggetti dell’applicazione in ma-
niera persistente, e stato necessario introdurre la libreria Core Data all’interno del
progetto: essa fa si che i dati vengano manipolati utilizzando degli oggetti ad alto
livello (NSManagedObject), che rappresentano le relazioni e gli attributi tra le entita
del modello dell’applicazione, interfacciandosi direttamente con SQLite e slegando il
105
5. VALUTAZIONE
programmatore dalla gestione a basso livello della base di dati. In altre parole, e sta-
to importato un riferimento alla libreria Core Data nell’ApplicationDelegate.swift del
progetto, e sono stati scritti tutti i metodi necessari per gestire le operazioni CRUD.
Anche in questo caso, il codice generato per la parte smartwatch dell’applicazione
e risultato essere completo quasi al 100% se non per il semplice passaggio di parametri
da una scherma all’altra, che ha necessitato di pochissime righe di codice; naturalmen-
te, all’interno dell’ApplicationDelegate dello smartphone, e stato modificato il codice
relativo alla ricezione dei messaggi, per poter salvare in maniera persistente gli esercizi
inviati dallo smartwatch.
Si presenta di seguito una tabella relativa alle Logical SLOC del progetto Xcode, sia
cosı come generato da MobileCodeGenerator e sia cosı come si presenta sua forma fi-
nale, al termine delle modifiche descritte sopra.
App Generata App Completa Percentuale
App Swift SLOC 951 1167 81.5%
App Storyboard 1059 1059 100%
Tabella 5.2: Copertura codice sorgente ParkTraining Xcode
5.1.3 Considerazioni finali
I risultati raccolti al termine di questo esperimento, permettono di trarre una serie
di conclusioni sugli strumenti sviluppati: in primo luogo, come previsto all’inizio della
progettazione, tutto cio che riguarda il funzionamento dell’interfaccia grafica dell’appli-
cazione non ha necessitato in alcun caso di un intervento successivo tramite gli IDE di
sviluppo nativi, confermando la qualita dello strumento di prototipizzazione. In buona
sostanza, sia per Android che per iOS, e stato necessario semplicemente configurare le
106
5. VALUTAZIONE
classi e i metodi necessari all’applicazione per creare e manipolare le informazioni in
maniera persistente, tramite il database SQLite del dispositivo: di conseguenza, sono
stati modificati gli statements che servivano a popolare i componenti come le ListView
e le GridView in maniera che ricevessero le informazioni in maniera dinamica tramire
i records contenuti nelle tabelle dell’applicazione.
Risulta evidente come la copertura di codice generata automaticamente per iOS sia
nettamente superiore a quella generata per Android, ma questo e in larga misura do-
vuto al fatto che per configurare il Core Data di iOS, e stato sufficiente popolare un
file di estensione .xcdatamodeld con la lista delle tabelle del database e i loro attributi,
mentre per Android sono state create ben 6 classi Java per lo stesso obiettivo. Per
l’esattezza, sono state conteggiate 411 SLOC Java relative al SQLAdapter, al Databa-
seAdapter e alle 4 classi dei modelli, di conseguenza, se si sottraggono queste righe di
codice al totale delle SLOC conteggiate in tabella, otteniamo solamente 1556 SLOC
Java: questo significa sostanzialmente una copertura di codice sorgente pari all’ 80.6%,
risultato molto simile a quello ottenuto per iOS.
Il nuovo risultato tiene comunque in considerazione tutte le modifiche introdotte per
richiamare i metodi necessari a manipolare gli oggetti dell’applicazione in maniera per-
sistente, ma lascia in disparte tutto il codice Java che non ha una precisa controparte
Swift, in quanto appunto la configurazione dello strato dati dell’applicativo avviene
quasi totalmente tramite il file .xcdatamodeld e senza utilizzare nuove classi Swift ad-
hoc, come invece avviene per Android.
Per quanto riguarda invece il tempo necessario allo sviluppo dell’applicazione, si puo
innanzitutto escludere quello necessario all’integrazione tra l’applicativo e il database
del dispositivo, poiche si tratta di una fase inevitabile sia con il normale approccio
tramite IDE, sia utilizzando la toolchain Protocode/MobileCodeGenerator: dunque,
sarebbe possibile in linea teorica, valutare quantomeno il tempo necessario a produrre
lo stesso risultato ottenuto con la suddetta toolchain, utilizzando solamente gli IDE di
sviluppo nativi.
107
5. VALUTAZIONE
Tuttavia, si tratta di una valutazione che risulta estremamente legata alle capacita dello
sviluppatore e alle dimensioni dell’applicazione, percio ci si limita a sottolineare che per
questa particolare applicazione e stato sufficiente un arco di tempo fra i 60-90 minuti
utilizzando Protocode/MobileCodeGenerator, e che per produrre la stessa interfaccia
grafica con Android Studio e Xcode e stata necessaria una quantita di tempo pressoche
identica per ciascun IDE, senza pero ottenere automaticamente tutta la controparte
logica Java e Swift. Questo dato ci porta ad affermare con assoluta certezza, che i
tempi di sviluppo tramite la toolchain Protocode/MobileCodeGenerator sono inferiori
almeno del 50% rispetto al normale approccio tramite gli IDE nativi.
108
5. VALUTAZIONE
5.2 Analisi qualitativa
In questa sezione si propone un’analisi qualitativa della toolchain Protocode e Mobile-
CodeGenerator, andando a replicare l’interfaccia grafica di un’applicazione gia esistente
sul mercato e confrontando il risultato finale della traduzione del modello astratto, con
l’applicativo vero e proprio. Per fare cio si e scelta l’applicazione WhatsApp [75], ov-
vero la ben nota app di instant messaging disponibile su entrambe le piattaforme, iOS
e Android, che chiunque oggigiorno possiede sul proprio smartphone: si sottolinea an-
cora una volta, che non e intenzione di questo esempio riprodurre un’applicazione di
messaggistica istantanea completa e funzionante, ma semplicemente stabilire se e pos-
sibile creare un ottimo punto di partenza per l’applicazione WhatsApp almeno sotto il
punto di vista puramente estetico.
Vengono di seguito riportate alcune immagini che mettono a confronto le scherma-
te realizzate con Protocode e MobileCodeGenerator con quelle reali dell’applicazione
WhatsApp.
Figura 5.6: Immagini a confronto della schermata chat di WhatsApp
109
5. VALUTAZIONE
Figura 5.7: Immagini a confronto della schermata dettaglio chat di WhatsApp
Figura 5.8: Immagini a confronto della schermata impostazioni di WhatsApp
La prima immagine da sinistra, rappresenta la schermata catturata direttamente da
Protocode in fase di prototipizzazione, mentre l’ultima immagine sulla destra, rap-
presenta la schermata originale di WhatsApp catturata su di un dispositivo reale; la
schermata centrale dunque, e quella che viene generata tramite MobileCodeGenerator,
alla quale e stato semplicemente cambiato il colore e il testo della Tool Bar all’interno
di Android Studio, senza modificare ovviamente tutto il resto dei contenuti.
110
5. VALUTAZIONE
In questo esempio, si e scelto di riprodurre solamente una porzione dell’intera applica-
zione, soprattutto poiche buona parte della navigazione dei contenuti viene gestita in
maniera differente nelle versioni Android e iOS di WhatsApp. Ecco alcuni commenti
ai risultati ottenuti:
� Tutte le ListView che sono state create sono piuttosto simili a quelle originali, ed
e comunque possibile con poche e semplici modifiche ai file di layout di Android
o alla Storyboard di iOS, ottenere un risultato identico all’originale.
� Il menu di navigazione e solamente parziale, poiche nello specifico su Android,
alcune funzioni sono state rilegate a dei bottoni nella Tool Bar in alto: per fare
cio sarebbe sufficiente introdurre questi bottoni e aggiungere i collegamenti alle
relative schermate, mentre su iOS si tratterebbe di proseguire la navigazione
al’interno della Bottom Bar.
� La schermata di dettaglio di una conversazione e composta da elementi grafici
molto semplici, e anche se sono stati riprodotti solo con discreta fedelta, bisogna
sottolineare che sia il collegamento alla fotocamera che quello al microfono, sono
gia perfettamente funzionanti.
In generale dunque, si puo affermare che effettivamente l’utilizzo della toolchain svi-
luppata permetta di creare un ottimo punto di partenza per la realizzazione di un’ap-
plicazione mobile di questo tipo, producendo in un colpo solo ben due progetti nativi,
pronti ad essere continuati (eventualmente in direzioni differenti) senza alcun tipo di
criticita. Quello che appare evidente e la scarsa possibilita di accedere alla Tool Bar di
Android gia in fase di prototipizzazione, ma e comunque un risultato che ci si aspetta,
nel momento in cui si considera che il modello originale deve essere il piu possibile
uniforme e trasparente alle due piattaforme Android e iOS, per non vincolare nessuna
delle due ad elementi esclusivi dell’altra.
111
Capitolo 6
Conclusioni
Il lavoro svolto in questo progetto di tesi ha permesso di creare uno strumento estre-
mamente potente nello sviluppo di applicazioni mobile native iOS, Android e le loro
piattaforme wearable, dimostrando che la soluzione model-driven adottata, puo risulta-
re vantaggiosa rispetto ai metodi di progettazione tradizionali sotto molti punti di vista.
L’interfaccia grafica delle applicazioni prodotta grazie a Protocode e sicuramente equi-
parabile a quella dei maggiori tool di prototipizzazione presenti oggi sul web, e com-
prende tutti i widgets disponibili all’interno degli ambienti di sviluppo nativi Xcode e
Android Studio con l’ulteriore vantaggio di poter decidere se modellare un componente
nella stessa maniera per entrambe le piattaforme, oppure rispettare l’aspetto tipico del
sistema operativo finale. Grazie alla sua semplicita e immediatezza, l’editor grafico di
Protocode permette di realizzare un’interfaccia grafica all’avanguardia, praticamente
con la stessa velocita degli editor presenti negli IDE di sviluppo nativi, e laddove natu-
ralmente non e stato possibile raggiungere lo stesso livello di dettaglio, e stata invece
garantita la generazione automatica di ogni singolo componente sotto il punto di vista
della sua logica applicativa.
112
6. CONCLUSIONI
Il risultato prodotto dalla toolchain per quanto riguarda gli smartwatch, puo consi-
derarsi gia un ottimo punto di partenza per il futuro, in quanto non solo sono presenti
tutti i maggiori widgets dedicati agli orologi, ma e anche gia possibile generare auto-
maticamente un primo meccanismo di comunicazione verso gli smartphones. Poiche si
tratta di una realta in continua evoluzione, sara presto necessario migliorare la qualita
delle interfacce e provare a generare piu meccanismi di comunicazione, che al momento
sono disponibili in una sola direzione.
Sebbene sia oggettivamente impossibile stabilire numericamente, quanto tempo sia
possibile risparmiare tramite la toolchain Protocode/MobileCodeGenerator, poiche sa-
rebbe necessario un grosso campione di applicazioni e sviluppatori, e senza dubbio
evidente che anche soltanto la generazione delle interfacce permetta di risparmiare il
50% del tempo necessario, per il semplice fatto che da un unico modello vengono ge-
nerati ben due applicativi. Inoltre, qualunque siano le capacita di uno sviluppatore,
e ragionevole pensare che non possa che impiegare una buon quantita di tempo piu
o meno rilevante per descrivere la logica applicativa di ogni singolo componente, che
invece viene generata in pochissimi secondi grazie a MobileCodeGenerator. Infine, sara
sı necessaria una piu o meno consistente fase di testing e debugging dell’applicazione,
ma quantomeno per i singoli componenti e stato gia “garantito” il loro corretto fun-
zionamento, dai lunghi mesi di verifica che sono stati spesi durante la realizzazione di
MobileCodeGenerator.
L’utilizzo di questi strumenti nello sviluppo di applicazioni mobili native, risulta van-
taggiosa sia per un team di sviluppatori esperti, che possono risparmiare un’enorme
quantita di tempo nella definizione della struttura portante dell’applicativo, sia per
gli sviluppatori in erba, poiche mette a disposizione un intero progetto Android o
iOS e una serie di meccanismi piuttosto avanzati, senza doversi preoccupare di svi-
lupparli dal principio. Per tutti questi motivi, si ritiene che la toolchain realizzata
secondo l’approccio model-driven, possa essere davvero uno strumento in grado di sup-
portare concretamente lo sviluppo di applicazioni mobili native, rendendo la fase di
prototipizzazione parte integrante nella stesura del codice sorgente.
113
6. CONCLUSIONI
6.1 Sviluppi futuri
Per quanto riguarda gli eventuali sviluppi futuri degli strumenti realizzati, e possibile
definire delle linee guida su cio che sarebbe necessario approfondire ulteriormente per
continuare a mantenere il passo con le applicazioni mobili piu moderne, ed evidenziare
una soluzione relativa alla generazione dello strato di dati dell’applicativo, che come
visto in precedenza, necessita di una configurazione piuttosto lunga e ripetitiva, so-
prattutto per la piattaforma Android.
Per quanto riguarda l’interfaccia grafica delle applicazioni su smartphone, e possibile
identificare 3 elementi che sono sicuramente il punto di partenza per rimanere al passo
con la continua evoluzione dei layout delle due piattaforme:
� I containers, ovvero delle view vuote in cui organizzare una serie di widgets del-
l’applicazione: sebbene sia abbastanza semplice raggruppare piu elementi all’in-
terno degli editor forniti dagli IDE nativi, introdurre un componente del genere
gia all’interno di Protocode, permetterebbe di risparmiare molto tempo nella
ridefinizione dei vincoli di posizionamento.
� Le liste o griglie di CardViews, che possano essere scrollate in orizzontale o in
verticale dall’utente, per racchiudere parecchie funzionalita all’interno di un unico
componente particolarmente elaborato ma estremamente intuitivo.
� Il menu laterale di navigazione, che sebbene sia un elemento nativo dell’ambiente
Android, e possibile introdurre anche per iOS tramite l’utilizzo di librerie di terze
parti, e rappresenta un elemento ormai molto comune per molte applicazioni
mobili multipiattaforma.
Introdurre gli elementi sopra descritti, rappresenterebbe gia di per se un notevole sfor-
zo nell’aggiornamento della toolchain Protocode/MobileCodeGenerator ma porterebbe
sicuramente un contributo sostanziale nel miglioramento dell’applicazione.
114
6. CONCLUSIONI
Come gia detto nella sezione relativa all’analisi quantitativa degli strumenti, sareb-
be interessante anche provvedere ad introdurre una sezione all’interno di Protocode,
che permetta all’utente di elencare le tabelle SQLite e le loro proprieta relazionali, per
poi generarle automaticamente tramite MobileCodeGenerator: questo porterebbe sicu-
ramente ad aumentare la copertura di codice sorgente soprattutto per quanto riguarda
il mondo Android, liberando lo sviluppatore dalla necessita di creare le relative classi
Java manualmente.
Infine, relativamente alla generazione del software per smartwatch, si ritiene che i
widget attualmente disponibili siano piuttosto validi ma che sarebbe opportuno appro-
fondire il loro livello di modellazione e successivamente introdurre anche delle ListView
in versione wearable per un supporto piu completo. L’interazione fra orologi e smart-
phone, risulta in generale un meccanismo strettamente collegato all’applicazione che
si intende sviluppare e difficile da modellare in maniera del tutto generale: sulla falsa
riga di quanto detto per i database SQLite, si potrebbe pensare di modellare in par-
tenza alcuni oggetti che in futuro potrebbero essere utilizzati sia su smartwatch che su
smartphone, secondo i principi di sincronizzazione implementati dalle due piattaforme
mobili.
115
Bibliografia
[1] Apple Inc. - Cupertino, California, USA
http://www.apple.com
[2] Samsung Group - Samsung Town, Seoul, Corea del Sud
http://www.samsung.com
[3] Huawei Technologies Co. Ltd. - Shenzhen, Guandong, Cina
http://www.huawei.com
[4] International Data Corporation - Top Five Smartphone Vendors, Shipments,
Market Share and Year-Over-Year Growth, Q1 2016. 27 Aprile 2016
http://www.idc.com/getdoc.jsp?containerId=prUS41216716
[5] iOS - Apple Inc. - http://www.apple.com/ios/
[6] Android - Google Inc. - http://www.android.com
[7] Google Inc. - Mountain View, California, USA
http://www.google.com
[8] Windows Phone Operating System - Microsoft Corporation
http://www.microsoft.com/it-it/windows/phones
[9] BlackBerry Operating System - BlackBerry Ltd.
http://global.blackberry.com/en/software/smartphones/
blackberry-10-os.html
[10] Gartner - Gartner Says Worldwide Smartphone Sales Grew 3.9 Percent in First
Quarter of 2016. 19 Maggio 2016.
http://www.gartner.com/newsroom/id/3323017
[11] Apple Watch - Apple Inc. -
http://www.apple.com/watch
116
BIBLIOGRAFIA
[12] Samsung Gear Line - Samsung Electronics -
http://www.samsung.com
[13] Strategy Analytics - Apple Watch Slips to 52% Global Smartwatch Marketshare
in Q1 2016. 28 Aprile 2016.
http://bit.ly/strategy-analytics-press-releases-20160428
[14] LG Corporation - Seoul, Corea del Sud - http://www.lg.com
[15] Motorola Inc. - Schaumburg, Illinois, USA - http://www.motorola.com
[16] ASUSTeK Computer Inc. - Beitou District, Taipei, Taiwan
http://www.asus.com
[17] Tizen - Tizen Association, Samsung, Intel - http://www.tizen.org/
[18] Android Wear - Google Inc. - http://www.android.com/wear/
[19] Apple Watch - Apple Inc. - http://www.apple.com/watch
[20] Material Design - Google Inc. - http://material.google.com/
[21] FluidUI - Fluid Software - http://www.fluidui.com
[22] Proto.io - Labs Division of SNQ Digital - http://proto.io
[23] InvisionApp - InVision - http://www.invisionapp.com
[24] Pixate - Google Inc. - http://www.pixate.com
[25] Microsoft Windows - Microsoft Corporation - http://www.microsoft.com
[26] OSX - Apple Inc. - http://www.apple.com/osx
[27] AngularJS - Google Inc. - http://www.angularjs.org
[28] Apache Cordova - Apache Cordova - http://cordova.apache.org
[29] Microsoft Visual Studio - Microsoft Corporation -
http://www.visualstudio.com
117
BIBLIOGRAFIA
[30] Xamarin - Microsoft Corporation - http://www.xamarin.com
[31] V8 Javascript Engine - The Chromium Project -
http://developers.google.com/v8/
[32] Titanium Studio - Appcelerator Inc.
http://www.appcelerator.com/developers
[33] Appcelerator Titanium - Appcelerator Inc. -
http://www.appcelerator.com/developers
[34] React Native - Facebook Inc. - http://facebook.github.io/react/
[35] NativeScript - Telerik - http://www.nativescript.org/
[36] Ionic Framework - Drifty - http://ionicframework.com
[37] Android Studio - Google Inc. - http://developer.android.com/studio
[38] Xcode - Apple Inc. - http://developer.apple.com/xcode/
[39] Eric Umuhoza, Hamza Ed-douibi, Marco Brambilla, Jordi Cabot, Aldo Bongio.
“Automatic code generation for cross-platform, multi-device mobile apps: some
reflections from an industrial experience”. In Proceedings of the 3rd International
Workshop on Mobile Development Lifecycle, ACM, 2015.
[40] Brambilla Marco, Andrea Mauri, and Eric Umuhoza. “Extending the Interaction
Flow Modeling Language (IFML) for Model Driven Development of Mobile Appli-
cations Front End”. In Mobile Web Information Systems, Springer International
Publishing, 2014.
[41] md2 - Model-driven Mobile Development - http://wwu-pi.github.io/md2-web/
[42] Heitkotter, Henning, Tim A. Majchrzak, and Herbert Kuchen. “Cross-platform
model-driven development of mobile applications with md2””. In Proceedings of
the 28th Annual ACM Symposium on Applied Computing, ACM, 2013.
[43] Neonto Studio - Neonto Ltd. - http://www.neonto.com/
118
BIBLIOGRAFIA
[44] Protocode - Mattia Natali
http://www.github.com/deib-polimi/protocode
[45] Ember.js - Ember Core Team - http://www.emberjs.com/
[46] Ember Data - Ember Core Team - http://www.emberjs.com/
[47] Yeoman.io - Google Chrome Developer Relations team -
http://www.yeoman.io/
[48] Yo - Google Chrome Developer Relations Team - http://www.yeoman.io/
[49] Compass - CSS Authoring Framework - http://www.compass-style.org/
[50] Grunt - Grunt Development Team - http://www.gruntjs.com/
[51] Bower - Twitter - http://www.bower.io/
[52] Bootstrap - Twitter - http://www.getbootstrap.com/
[53] Ember Data Local Storage Adapter - Ricardo Mendes -
https://www.github.com/locks/ember-localstorage-adapter
[54] JQuery - JQuery Team - http://www.jquery.com/
[55] Font Awesome - Dave Gandy - http://www.fontawesome.io/
[56] Ember.js - Eli Grey - http://www.github.com/eligrey/Blob.js/
[57] FileSaver - Eli Grey - http://www.github.com/eligrey/FileSaver.js/
[58] vkBeautify - Vadim Kiryukhin -
http://www.github.com/vkiryukhin/vkBeautify
[59] Node.js - Node.js Developers - http://www.nodejs.org
[60] MobileCodeGenerator - Gregorio Perego, Stefania Pezzetti
http://www.github.com/deib-polimi/mobilecodegenerator
[61] Greekbench 3 - Primate Labs, 03 Dicembre 2014
http://www.primatelabs.com/blog/2014/12/swift-performance/
119
BIBLIOGRAFIA
[62] An analysis of sorts between Objective-C and Swift
Jesse Squires, 06 Agosto 2014
http://www.jessesquires.com/apples-to-apples-part-two/
[63] Friday Q&A 2014-07-04: Secrets of Swift’s Speed - Mike Ash
http://mikeash.com/pyblog/
friday-qa-2014-07-04-secrets-of-swifts-speed.html
[64] Mjolnic Bootstrap Colorpicker - Javier Aguilar
http://www.github.com/mjolnic/bootstrap-colorpicker
[65] Prototipizzazione Rapida per Applicazioni Mobili Multipiattaforma -
Mattia Natali, 2013
[66] Un Approccio Model-Driven per lo sviluppo di Applicazioni Mobili
Native - Gregorio Perego, Stefania Pezzetti, 2012
[67] Eclipse - Eclipse Foundation - http://www.eclipse.org
[68] Eclipse Modeling Framework - Eclipse Foundation -
http://www.eclipse.org/modeling/emf/
[69] openArchitectureWare - openArchitectureWare -
http://oawbranch.pluginbuilder.org/releases/
[70] Xpand - oAW - https://wiki.eclipse.org/Xpand
[71] Xtend - oAW - http://www.eclipse.org/xtend/
[72] Check - oAW - https://wiki.eclipse.org/Xpand
[73] Modeling Workflow Engine - oAW -
https://wiki.eclipse.org/Modeling Workflow Engine (MWE)
[74] Gradle - http://www.gradle.org/
[75] WhatsApp - WhatsApp Inc.
http://www.whatsapp.com/
120
Appendice A
Lista degli acronimi
API Application Programming Interface
CRUD Create Read Update Delete
CSS Cascading Style Sheets
DOM Document Object Model
EMF Eclipse Modeling Framework
HTML Hyper-Text Markup Language
IDE Integrated Development Environment
MWE Modeliing Workflow Engine
oAW openArchitectureWare
SDK Software Development Kit
UML Unified Modeling Language
XML eXtensible Markup Language
121