theses

Transcript

theses
Università degli Studi Mediterranea di Reggio Calabria
Dipartimento di Ingegneria dell’Informazione, delle Infrastrutture e
dell’Energia Sostenibile
Corso di Laurea Magistrale in Ingegneria Informatica e dei Sistemi per le
Telecomunicazioni
Tesi di Laurea
Progettazione e implementazione di un’app ibrida per il
supporto al turismo nella città di Reggio Calabria: la
componente di front-end
Relatori
Candidato
Prof. Domenico Ursino
Maurizio Rizzo
Dott. Antonio Quattrocchi
Anno Accademico 2014-2015
Indice
Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Analisi dei requisiti e studio di fattibilità . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1 Analisi dei requisiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1 L’applicazione multipiattaforma EnjoyRC . . . . . . . . . . . . . . . . .
1.1.2 Requisiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Studio di fattibilità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 La situazione attuale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2 Progetto di massima della soluzione . . . . . . . . . . . . . . . . . . . . . .
1.2.3 Analisi dei rischi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.4 Modalità di attuazione del progetto . . . . . . . . . . . . . . . . . . . . . . .
1.2.5 Analisi dei tempi e delle risorse umane . . . . . . . . . . . . . . . . . . . .
1.2.6 Analisi di impatto: Costi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
7
8
12
12
12
13
13
14
14
Tecnologie ibride di seconda generazione: AppGyver . . . . . . . . . . . . . . . .
2.1 La rivoluzione del mobile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 Mobile application: app nativa, ibrida e webApp . . . . . . . . . . .
2.1.2 I principali ambienti di sviluppo di app ibride . . . . . . . . . . . . . .
2.2 Framework di prima generazione: Cordova e Appcelerator . . . . . . . . .
2.2.1 Apache Cordova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 Titanium Appcelerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Framework di seconda generazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1 Ionic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 AppGyver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.1 Il Composer di AppGyver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.2 Steroids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.3 Supersonic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.4 AngularJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
15
16
18
18
18
21
23
24
26
27
28
32
39
Funzionalità e Mockup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1 Funzionalità del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Funzionalità relative alla Mobile Application . . . . . . . . . . . . . . .
3.1.2 Funzionalità relative alla Web Application . . . . . . . . . . . . . . . . .
41
41
41
45
IV
Indice
3.2 Mockup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Mockup relativo alla Home Page e al Drawer Menu . . . . . . . . .
3.2.2 Mockup relativo alla sezione “Ricerca” . . . . . . . . . . . . . . . . . . . .
3.2.3 Mockup relativi alla sezione “Punti di interesse” . . . . . . . . . . . .
3.2.4 Mockup relativi alla sezione “Ristorazione” . . . . . . . . . . . . . . . .
3.2.5 Mockup relativi alla sezione “Percorsi turistici” . . . . . . . . . . . .
3.2.6 Mockup relativi alla sezione “Svaghi” . . . . . . . . . . . . . . . . . . . . .
3.2.7 Mockup relativi alla sezione “Eventi” . . . . . . . . . . . . . . . . . . . . .
3.2.8 Mockup relativo alla sezione “La città” . . . . . . . . . . . . . . . . . . . .
47
47
48
49
51
53
53
54
54
Progettazione delle funzionalità di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1 Architettura dell’applicazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Progettazione della componente applicativa . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Diagrammi dei casi d’uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.2 Diagrammi di attività . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.3 Diagrammi di sequenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
57
59
59
61
63
Implementezione delle funzionalità di base . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1 Strumenti a supporto dell’implementazione . . . . . . . . . . . . . . . . . . . . . .
5.1.1 IDE di sviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.2 IDE JetBrains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.3 Sistemi di versioning e Bitbucket . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Problemi affrontati e scelte implementative effettuate . . . . . . . . . . . . .
5.2.1 Premessa: architettura del framework e librerie realizzate . . . .
5.2.2 Implementazione del macro-blocco “Punti di interesse” . . . . . .
5.2.3 Implementazione del macro-blocco “La città” . . . . . . . . . . . . . .
69
69
69
69
70
73
73
79
84
Progettazione e implementazione dei percorsi tematici . . . . . . . . . . . . . . 87
6.1 Progettazione della componente applicativa . . . . . . . . . . . . . . . . . . . . . . 87
6.2 Implementazione delle funzionalità lato client . . . . . . . . . . . . . . . . . . . . 94
6.3 Implementazione delle funzionalità lato server . . . . . . . . . . . . . . . . . . . . 99
6.3.1 Implementazione della funzionalità relativa all’inserimento
di un waypoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.3.2 Implementazione della funzionalità relativa all’inserimento
di un percorso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Manuale utente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.2 La Home Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.3 Il Drawer Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.4 La sezione “Ricerca” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.5 La sezione “Punti di interesse” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.6 Le macro-aree relative alle attività commerciali . . . . . . . . . . . . . . . . . . . 117
7.6.1 La sezione “Ristorazioni” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
7.6.2 Le sezioni “Pernottamenti” e “Svaghi” . . . . . . . . . . . . . . . . . . . . 119
7.7 La sezioni “Percorsi turistici statici” . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.8 La sezioni “Servizi primari” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.9 La sezioni “Eventi” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Indice
V
7.10 La sezione “La città” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Confronto con sistemi correlati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
8.1 Punti di forza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
8.2 Punti di debolezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
8.3 Confronto con sistemi correlati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.3.1 Tutto Calabria in App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
8.3.2 Bergamo City Tour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
8.3.3 Venezia Unica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
8.3.4 Neslo Barcellona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
8.3.5 Dubai Travel Guide and Offline Map . . . . . . . . . . . . . . . . . . . . . . 140
8.3.6 World Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Conclusioni e sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9.1 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9.2 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Ringraziamenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Riferimenti bibliografici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Elenco delle figure
1.1
Il diagramma di Gantt iniziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12
2.13
2.14
2.15
Apache Cordova e PhoneGap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Architettura di Apache Cordova . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Logo di Titanium Appcelerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Architettura di Alloy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il logo di Ionic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il meccanismo di interazione tra i tre framework . . . . . . . . . . . . . . . . . . .
L’AppGyver Accademy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il tool visuale del Composer di AppGyver. . . . . . . . . . . . . . . . . . . . . . . . .
Il servizio Connect di AppGyver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La console di gestione dei log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La sezione relativa alla gestione della documentazione . . . . . . . . . . . . . .
La sezione relativa alla gestione dei servizi cloud . . . . . . . . . . . . . . . . . .
La sezione relativa alla gestione dei contenuti . . . . . . . . . . . . . . . . . . . . .
L’architettura delle directory di un progetto Supersonic . . . . . . . . . . . .
Le principali differenze tra Supersonic e Ionic . . . . . . . . . . . . . . . . . . . . .
19
21
22
23
24
25
27
29
30
31
31
32
33
36
38
Il mockup di primo livello relativo alla Home Page e al Drawer Menu
Il mockup di secondo livello relativo alla Home Page e al Drawer
Menu, con relative “gesture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Il mockup di primo livello relativo alla sezione “Ricerca” . . . . . . . . . . .
3.4 Il mockup di secondo livello relativo alla sezione “Ricerca”, con
relative “gesture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Il mockup di primo livello relativo alla sezione “Punti di interesse” . .
3.6 Il mockup di secondo livello relativo alla sezione “Punti di interesse”,
con relative “gesture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.7 Il mockup di primo livello relativo alla sezione “Ristorazione” . . . . . . .
3.8 Il mockup di secondo livello relativo alla sezione “Ristorazione”, con
relative “gesture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.9 Il mockup di primo livello relativo alla sezione “Percorsi turistici” . . .
3.10 Il mockup di secondo livello relativo alla sezione “Percorsi turistici”
con relative gesture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.1
3.2
49
50
50
51
51
52
52
53
54
VIII
Elenco delle figure
3.11 Il mockup di primo livello relativo alla sezione “Svaghi” . . . . . . . . . . . .
3.12 Il mockup di secondo livello relativo alla sezione “Svaghi” con
relative gesture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.13 Il mockup di secondo livello relativo alla sezione “Eventi”, con
relative “gesture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.14 Il mockup di secondo livello relativo alla sezione “La città”, con
relative “gesture” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
4.1
4.2
58
55
55
56
4.8
4.9
L’architettura dell’applicazione EnjoyRC . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma dei casi d’uso relativo al macro-blocco “Punti di
interesse” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma dei casi d’uso relativo al macro-blocco “La città” . . . . . .
Il diagramma di attività relativo al macro-blocco “Punti di interesse”
Il diagramma di attività relativo al macro-blocco “La città” . . . . . . . .
Il diagramma di attività relativo al recupero delle informazioni
riguardanti la città . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma di attività relativo al recupero delle informazioni
riguardanti il menù del macro-blocco “La città” . . . . . . . . . . . . . . . . . . .
Il diagramma di sequenza relativo al macro-blocco “Punti di interesse”
Il diagramma di sequenza relativo al macro-blocco “La città” . . . . . . .
5.1
5.2
5.3
Il funzionamento dell’operazione di commit in Git . . . . . . . . . . . . . . . . . 71
La dashboard di un progetto Bitbucket . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
L’architettura dei package del sistema EnjoyRC . . . . . . . . . . . . . . . . . . . 74
6.1
Il diagramma dei casi d’uso relativo al macro-blocco “Percorsi
turistici” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma di attività riguardante la navigazione all’interno del
macro-blocco “Percorsi turistici” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma di attività relativo al recupero delle categorie dei
percorsi turistici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma di attività relativo al recupero delle categorie dei
percorsi turistici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma di sequenza riguardante la navigazione all’interno del
macro-blocco “Percorsi turistici” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Il diagramma di sequenza relativo alla creazione di un percorso . . . . . .
4.3
4.4
4.5
4.6
4.7
6.2
6.3
6.4
6.5
6.6
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
60
61
62
64
65
66
67
68
88
89
90
92
93
95
La Home Page dell’applicazione EnjoyRC . . . . . . . . . . . . . . . . . . . . . . . . 110
Il Drawer Menu dell’applicazione EnjoyRC . . . . . . . . . . . . . . . . . . . . . . . 111
Le sezioni Credits e Manual, accessibili dal Drawer Menu
dell’applicazione EnjoyRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Le sezioni di ricerca dell’applicazione EnjoyRC . . . . . . . . . . . . . . . . . . . . 113
Le pagina contente i filtri per la ricerca personalizzata . . . . . . . . . . . . . 114
Le pagina contenente le categorie dei punti di interesse . . . . . . . . . . . . . 115
La pagina contenente la lista dei punti di interesse associati ad una
categoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Le pagina contenente il dettaglio di un punto di interesse . . . . . . . . . . . 116
La pagina contenente la mappa relativa ad un punto di interesse . . . . 117
Elenco delle figure
1
7.10 La pagina contenente le categorie dei punti di ristorazione . . . . . . . . . . 118
7.11 La pagina contenente i punti di ristorazione associati ad una
determinata categoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
7.12 La pagina di dettaglio relativa ad un punto di ristorazione . . . . . . . . . . 119
7.13 La pagina contenente la mappa relativa ad un punto di ristorazione . . 120
7.14 La pagina contenente la categorie dei pernottamenti . . . . . . . . . . . . . . . 120
7.15 La pagina contenente la categorie degli svaghi . . . . . . . . . . . . . . . . . . . . . 121
7.16 La pagina contenente le categorie dei percorsi turistici . . . . . . . . . . . . . 121
7.17 La pagina contenente la lista dei percorsi turistici associati ad una
specifica categoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
7.18 La pagina contenente il dettaglio di un percorso turistico . . . . . . . . . . . 123
7.19 La pagina contenente il dettaglio di una delle tratte in cui è
suddiviso un percorso turistico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.20 La pagina contenente il dettaglio di un servizio primario . . . . . . . . . . . . 124
7.21 La pagina contenente le categorie degli eventi . . . . . . . . . . . . . . . . . . . . . 125
7.22 La pagina contenente la lista degli eventi . . . . . . . . . . . . . . . . . . . . . . . . . 125
7.23 La pagina contenente il dettaglio di un evento . . . . . . . . . . . . . . . . . . . . . 126
7.24 La Home Page della sezione “La città” . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
7.25 La pagina contenente le indicazioni stradali per raggiungere la città . . 127
7.26 La pagina contenente le informazioni utili a visitare la città . . . . . . . . . 128
7.27 La pagina contenente l’elenco dei negozi di prodotti tipici presenti
in città . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
7.28 La pagina contenente la lista delle tradizioni calabresi . . . . . . . . . . . . . . 129
8.1
8.2
8.3
8.4
8.5
8.6
Il menù laterale dell’applicazione Tutto Calabria in App . . . . . . . . . . . . 134
La Home Page dell’applicazione Bergamo City Tour . . . . . . . . . . . . . . . 136
Una schermata dell’applicazione Venezia Unica . . . . . . . . . . . . . . . . . . . . 138
La Home Page dell’applicazione Neslo Barcellona . . . . . . . . . . . . . . . . . . 139
La lista dei contenuti più popolari dell’applicazione Dubai Travel
Guide and Offline Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
La Home Page dell’applicazione World Explorer . . . . . . . . . . . . . . . . . . . 143
Introduzione
Da qualche anno a questa parte i dispositivi mobili stanno cambiando in modo
radicale la comunicazione. Si parla di “Mobile First” per indicare non solo la tecnologia di riferimento, ma anche, e soprattutto, quello che ormai è diventato un
vero e proprio stile di vita. Periodicamente nuovi studi e ricerche forniscono delle
statistiche che evidenziano quanto sia importante dedicare agli utenti in mobilità
un’attenzione che, fino a poco tempo fa, si era per lo più concentrata sugli utenti
desktop.
Il mobile rappresenta una forza rivoluzionaria in grado di modificare le attuali modalità di scambio delle informazioni. Utenti sempre più esperti ed esigenze
sempre più in crescita hanno sensibilmente modificato i modelli di servizio. Le attività usufruibili tramite smartphone sono destinate a crescere e stanno, quindi,
aumentando anche le aspettative in termini di funzionalità aggiuntive.
Per rimanere competitive le aziende si trovano a dover affrontare tale fenomeno,
introducendo modalità più efficaci di sviluppo delle applicazioni per soddisfare le
esigenze degli utenti in mobilità. Infatti, il costante aumento dell’utenza porta a una
continua proposta di nuove tecnologie migliorative rispetto a quelle già esistenti.
Negli ultimi anni lo sviluppo di schermi ad elevata risoluzione, la diminuzione
dei costi delle memorie e l’aumento di capacità computazionale hanno portato alla
nascita di nuovi dispositivi mobili con alte prestazioni. Se a questo si aggiunge una
crescita del livello di conoscenza da parte degli utenti rispetto alle possibilità offerte
dalla tecnologia, si comprende come il numero di servizi a disposizione sia in continuo
aumento; ciò riguarda, in modo particolare, i servizi Internet. Il successo dei servizi
Internet basati sul protocollo IP si affianca al grande beneficio dell’evoluzione dei
dispositivi mobili portando ad avere un bacino di utenza e, più in generale, uno
spettro di utilizzo molto più ampio di tali tecnologie.
Grazie alla mobilità dell’utente possono, inoltre, nascere diversi servizi, dedicati
specificamente a dispositivi di mobile computing, come smartphone, basati anche
sulle informazioni aggiuntive fornite proprio dal protocollo IP, come, ad esempio, la
geolocalizzazzione. Uno smartphone, in italiano “cellulare intelligente”, è un dispositivo portatile che abbina le funzionalità proprie di un telefono cellulare con quelle
di un gestore di dati per migliorare la produttività personale ed aziendale; costruito
su una piattaforma di mobile computing, esso presenta capacità computazionali e
livelli di connettività elevati rispetto ai comuni telefoni cellulari.
4
Introduzione
Tutto questo ha permesso di definire un livello ancora più elevato di “intelligenza” nei dispositivi, dove la geolocalizzazione, basata su differenti tecnologie, come
GPS, WiFi ed LTE, si presenta, ora, come una funzionalità indispensabile; i sistemi operativi associati a questa fascia di prodotti offrono tutti un market-place o
uno store da dove poter scaricare applicazioni di ogni tipo e per qualsiasi utilizzo,
cambiando radicalmente la percezione che l’utente finale ha di tali dispositivi: da
semplici cellulari si giunge a considerarli veri e propri computer in miniatura.
Uno degli aspetti peculiari per gli smartphone è la possibilità di installarvi ulteriori applicazioni, aggiungendo, cosı̀, nuove funzionalità. Tali dispositivi si differenziano, inoltre, per l’adozione di API (Application Programming Interfaces)
avanzate, permettendo alle applicazioni di terze parti una migliore integrazione con
il loro sistema operativo.
Le applicazioni mobili giocano un ruolo trainante nel panorama software attuale,
portando il loro sviluppo ad assumere un ruolo simile a quello che ha avuto lo
sviluppo del Web negli anni novanta. Basti pensare al numero di app presenti sui
diversi market-place, nonché alla varietà di piattaforme disponibili per categorie
di dispositivi in continua evoluzione: da iOS ad Android, da Windows Phone a
Blackberry OS.
Questa evoluzione, d’altra parte, rende sempre più difficile, per ogni singolo sviluppatore, imparare a lavorare contemporaneamente su tutte le piattaforme. Inoltre,
anche per un’azienda, avere un team di sviluppatori specializzati in ognuna delle
principali piattaforme esistenti può essere oneroso. Al giorno d’oggi vi è la necessità di realizzare prodotti “performanti”, ma allo stesso tempo, di ridurre i costi di
produzione.
Di fronte a tali necessità è risultato utile valutare una nuova visione unificata
delle diverse piattaforme, seguendo una strada che passa per le tecnologie Web; da
questa idea è nato il cosiddetto approccio ibrido alla programmazione mobile. Esso
sfrutta gli strumenti di gestione di interfacce HTML, come le web app, per creare
applicazioni multi-piattaforma, rendendo più semplice la realizzazione di uno stesso
software per dispositivi differenti.
Un’app ibrida è, tipicamente, un’pp nativa contenente una componente web.
Essa si adatta facilmente alle diverse piattaforme e ai diversi dispositivi mobili. Il
vantaggio principale delle app ibride risiede nel fatto che il codice necessario alla
loro realizzazione viene scritto con un linguaggio comune a tutti i dispositivi ed
è solo il contenitore a dover essere cambiato in funzione del dispositivo che deve
ospitare l’applicazione. Questo significa che, per la realizzazione di un’app ibrida, ci
sono tempi e costi più bassi rispetto a quelli necessari per le applicazioni native. Le
app ibride, grazie ai potenti framework realizzati nel corso degli anni, presentano
delle prestazioni paragonabili a quelle realizzate tramite un approccio nativo.
Il mobile, al giorno d’oggi, viene utilizzato in tantissimi contesti molto comuni,
quali il commercio elettronico, l’accesso alle social network e l’utilizzo di sistemi di
navigazione. Oltre a tali contesti, esso ricopre un ruolo molto importante nel settore
dedicato al turismo.
La valorizzazione dei beni culturali e ambientali e lo sviluppo turistico, per una
città come Reggio Calabria, sono temi strettamente connessi, in quanto la nostra
città dispone di un ingente patrimonio culturale e ambientale.
Introduzione
5
Tale patrimonio possiede molteplici punti di forza che possono tornare utili allo sviluppo del turismo; citando ad esempio, i siti archeologici di antiche civiltà
mediterranee della Magna Grecia, che possono dar luogo ad itinerari turistici di rilevanza eccezionale, le coste marine, che offrono spiagge sul Mediterraneo, le foreste
dell’Aspromonte, per il turismo di montagna, la valorizzazione di prodotti enogastronomici tipici, che possono fungere da attrattori turistici e dare luogo ad itinerari
enogastronomici per le specialità locali.
Reggio Calabria soffre di una serie di punti di debolezza che gravano sullo sviluppo del turismo. Essa, infatti, non offre un servizio di comunicazione informativa
adeguata a distanza, limita l’accesso fisico ai punti di interesse a causa della scarsità
di vie e mezzi di trasporto, non offre una adeguata accessibilità al bene artistico
con informazioni in loco e consente una limitata visione del bene culturale.
In accordo con il Comune di Reggio Calabria si è deciso di sfruttare le potenzialità offerte dalle tecnologie web e mobile per realizzare un sistema in grado di
risolvere, o ridurre al minimo, gli svantaggi introdotti da questa serie di problematiche. Abbiamo deciso di chiamare tale sistema EnjoyRC. Esso è costituito da
un’applicazione mobile multipiattaforma e da un server di supporto dedicato alla
gestione dei contenuti.
Il sistema in esame fornisce tutte le principali funzionalità necessarie a supportare il turismo nella città di Reggio Calabria. Ciascuna funzionalità è resa possibile
grazie al portale a cui l’applicazione si appoggia. EnjoyRC implementa una serie di
funzionalità che permetteranno ad un utente di visualizzare delle liste di punti di
interesse opportunamente organizzate per categorie. Egli avrà la possibilità di accedere al dettaglio di un punto di interesse, visualizzando le informazioni generali dello
stesso e, tramite un opportuna mappa, le informazioni stradali per raggiungerlo.
Oltre a quelle relative ai punti di interesse, verranno implementate una serie di
funzionalità che permettono di esporre, in maniera analoga, i dati relativi ai punti
di ristorazione, ai punti di pernottamento e agli svaghi offerti dalla città.
Oltre a tali sezioni, l’utente potrà accedere a quelle in cui sono riportati tutti
gli eventi svolti in città, nonchè le informazioni riguardanti i servizi primari, tra cui
mezzi pubblici e servizi sanitari. L’applicazione realizzerà un’area secondaria, che
mira a mostrare le tradizioni e i prodotti tipici reggini, includendo all’interno della
stessa le informazioni stradali che permettono di raggiungere la città e quelle che
permettono di spostarsi al suo interno.
Infine, EnjoyRC darà maggiore rilievo all’implementazione di due particolari
sezioni, ovvero quella dei percorsi turistici e quella della ricerca dei contenuti. La
prima offrirà all’utente la possibilità di conoscere quante più informazioni possibili
riguardanti ogni percorso tematico, sia che questo sia stato organizzato da qualcuno,
sia che corrisponda, semplicemente, ad una sequenza di punti di interesse consigliati.
La seconda, invece, offrirà la possibilità ad un utente di effettuare una ricerca, sia
generica che personalizzata, all’interno di tutti i contenuti. Il sistema, ad esempio,
offrirà consentirà ad un utente di ricercare i punti di ristorazione ancora aperti o
quelli che offrono servizi per celiaci, di conoscere i punti di interesse più vicini alla
sua posizione o i punti di pernottamento che rientrano in una determinata fascia di
prezzo.
Il presente lavoro di tesi è strutturato come di seguito specificato:
6
•
•
•
•
•
•
•
•
•
Introduzione
Nel Capitolo 1 vengono illustrate le fasi di analisi dei requisiti e di studio di fattibilità, necessarie alla progettazione e all’implementazione del sistema, specificando le principali motivazioni che ci hanno spinto a realizzarlo. Nello specifico,
vengono analizzati i requisiti raccolti e tutte le problematiche che si potranno
riscontrare in fase di produzione, offrendo delle possibili soluzione nel caso in cui
queste ultime dovessero presentare.
Nel Capitolo 2 vengono descritte le differenze principali tra la programmazione
nativa, quella orientata alle web app e quella ibrida; di quest’ultima vengono
descritti i framework più diffusi, soffermandosi, maggiormente, sulla piattaforma
adottata nella presente tesi, ovvero AppGyver, e giustificandone la scelta.
Nel Capitolo 3 vengono illustrate nel dettaglio le funzionalità che riguardano sia
l’applicazione mobile che il server. Vengono illustrati, inoltre, sia i mockup di
primo livello che quelli di secondo livello.
Nel Capitolo 4 viene illustrata la progettazione delle funzionalità di base dell’applicazione EnjoyRC. Nello specifico, vengono prese in considerazione la struttura
del client e la fase di progettazione della componente applicativa.
Nel Capitolo 5 viene analizzata l’implementazione delle funzionalità di base di
EnjoyRC. Nello specifico, vengono analizzati gli strumenti utilizzati e le porzioni
di codice che hanno soddisfatto i requisiti citati in precedenza.
Nel Capitolo 6 vengono illustrate la fase di progettazione e quella di implementazione della sezione relativa ai percorsi turistici tematici. Nello specifico,
vengono prese in considerazione la fase di progettazione della componente applicativa nonchè l’implementazione delle funzionalità riguardanti sia la componente
client che quella server.
Nel Capitolo 7 viene presentato il manuale utente dell’applicazione.
Nel Capitolo 8 vengono analizzati i punti di forza e di debolezza del sistema
realizzato; viene, inoltre, effettuato un confronto con altri sistemi esistenti in
commercio, evidenziando, per ciascuno di essi, le analogie e le differenze rispetto
al nostro sistema.
Nel Capitolo 9 vengono tratte le conclusioni del presente lavoro di tesi e, infine,
vengono analizzate le linee evolutive ed alcuni possibili sviluppi futuri.
1
Analisi dei requisiti e studio di fattibilità
Questo capitolo illustra le fasi di analisi dei requisiti e di studio di fattibilità necessarie alla progettazione e all’implementazione di un sistema a supporto del turismo
della città di Reggio Calabria. Si esporranno, inoltre, i motivi che ci hanno spinto
alla realizzazione di questo progetto.
1.1 Analisi dei requisiti
1.1.1 L’applicazione multipiattaforma EnjoyRC
Nella realtà di un comune come quello di Reggio Calabria, il turismo rappresenta
l’aspetto più importante del suo rapporto con il resto del mondo e funge, o dovrebbe
fungere, da traino per tutti i settori della sua fragile economia. La posizione geografica, il clima mite, le località naturali, le tradizioni, le ricchezze storiche e artistiche
che la città possiede sarebbero, in sè, sufficienti ad accrescere l’appeal che essa esercita sui turisti del resto d’Italia e del mondo. Ciò che però limita profondamente il
turismo reggino è la quasi totale assenza di una buona organizzazione e, in molti
casi, l’incapacità di valorizzare le bellezze della provincia, anche con l’aiuto delle
nuove tecnologie. Per questo motivo si è deciso di realizzare un sistema, in accordo
con gli enti comunali, che permettesse di superare i problemi appena citati.
L’obbiettivo del sistema oggetto della presente tesi è quello di fornire un supporto
al turismo della città di Reggio Calabria cercando, allo stesso tempo, di promuovere
le sue potenzialità tra i cittadini stessi, in quanto, troppo spesso, si corre il rischio
di non guardare con attenzione cosa ci accade intorno, dando poca importanza e
tenendo in cattiva considerazione i luoghi e gli ambienti che ci hanno visto nascere
e crescere.
Il sistema che verrà realizzato sarà una sorta di guida turistica smart, semplice ed
intuitiva, che permetterà, a chiunque lo desideri, di organizzare in maniera autonoma
il proprio soggiorno sul territorio reggino; allo stesso tempo essa rappresenterà una
vetrina per i punti di maggiore interesse turistico e per le attività distribuite sul
territorio, i servizi primari offerti dal comune e gli eventi organizzati in città. Il
nome del sistema è stato opportunamente pensato e concordato con gli stackholder
principali, effettuando sondaggi e interviste. Dopo una serie di proposte, si è scelto
8
1 Analisi dei requisiti e studio di fattibilità
di associare all’applicativo il nome EnjoyRC, che richiama in sè la protagonista vera
del progetto, cioè la città di Reggio Calabria e sottolinea l’obiettivo principale del
sistema, cioè rendere gradevole al turista il soggiorno presso la nostra città.
Tale sistema consisterà in un’applicazione mobile multi-piattaforma e in un server di supporto ad essa. Dato il contesto e la natura dell’applicazione che si svilupperà, è stato chiesto che essa sia multi-lingua e che sia suddivisa in una serie di
macro-aree di riferimento, ciascuna inerente ad uno specifico aspetto o funzionalità
dell’applicazione.
Per quanto riguarda il server di supporto, si è scelto di realizzare un sito web
“responsive” tramite l’utilizzo di un CMS, in modo da permettere una facile gestione
dei contenuti che saranno visualizzati sui dispositivi mobili e in modo tale creare
una predisposizione ad-hoc per i prospetti futuri.
1.1.2 Requisiti
Il punto di partenza per la realizzazione del sistema è stata una fase preliminare di
interviste e incontri con gli stackholder (enti comunali, negozianti, comuni cittadini,
etc.) che ci hanno permesso di realizzare la stesura dei documenti fondamentali
alla base della progettazione. Il primo documento realizzato, previa definizione di
un template base ufficiale, è stato quello relativo all’analisi dei requisiti. Come
già anticipato nel precedente paragrafo, il sistema dovrà essere necessariamente
usufruibile in tre differenti lingue opportunamente scelte dagli stakeholder, ovvero:
Inglese, Spagnolo e Italiano. Per una più accurata e completa descrizione dei requisiti
raccolti, gli stessi sono stati suddivisi in una serie di macro-aree di riferimento,
ciascuna delle quali inerente ad un task da informatizzare. Le macro-aree individuate
sono le seguenti:
•
•
•
•
•
•
•
•
•
•
Macro-area
Macro-area
Macro-area
Macro-area
Macro-area
Macro-area
Macro-area
Macro-area
Macro-area
Macro-area
1, relativa ai punti di interesse;
2, relativa ai punti di ristorazione;
3, relativa ai pernottamenti;
4, relativa agli svaghi;
5, relativa ai percorsi turistici statici;
6, relativa alle informazioni di base sulla città;
7, relativa ai servizi primari;
8, relativa agli eventi;
9, relativa alla ricerca dei contenuti;
10, relativa alla gestione dei contenuti..
É opportuno definire con chiarezza ciascuna macro-area poichè queste costituiscono il punto di partenza per la progettazione del sistema. Tutti i requisiti
descriveranno ciò che il sistema dovrà fare, ma non come dovrà farlo.
Sezione relativa ai punti di interesse
Con il termine “punti interesse” definiamo una serie di location, costruzioni e opere,
presenti sul territorio reggino, che possiedono una particolare importanza dal punto
di vista turistico. La macro-area in esame dovrà contenere, ed opportunamente
catalogare, questi ultimi, in modo da garantire una semplice e veloce consultazione
1.1 Analisi dei requisiti
9
da parte dell’utente. Sulla base delle indicazioni raccolte durante la fase di confronto
con gli stackholder si è deciso di adottare la seguente tassonomia:
•
•
•
•
•
•
•
•
•
Monumenti Religiosi;
Funivie/scale mobili;
Monumenti e siti storici;
Strutture centenarie;
Musei;
Teatri;
Località balneari;
Natura;
Parchi.
Inizialmente il sistema visualizzerà la lista delle categorie alle quali è stato associato almeno un punto di interesse; a questo punto l’utente potrà selezionare un’opportuna categoria e visualizzare la lista completa dei punti ad essa associati. Attraverso la selezione di uno di essi si potrà accedere all’area relativa al suo dettaglio,
in cui saranno presenti le informazioni necessarie per conoscerlo e raggiungerlo.
Sezione relativa ai punti di ristorazione
Tale sezione conterrà i punti di ristorazione dislocati sul territorio comunale e provinciale. Anche in questo caso l’organizzazione dei contenuti si baserà sulla categorizzazione degli esercizi da visualizzare. Nel caso dei punti di ristorazione si è scelto
di prevedere le seguenti categorie:
•
•
•
•
•
•
Pizzerie;
Pub;
Ristoranti;
Paninoteche;
Cucina tradizionale calabrese;
Bar/pasticcerie/gelaterie.
L’utente potrà, dunque, selezionare una specifica tipologia di ristorazione e scegliere tra le varie alternative visualizzate quella che più si adatta alle sue esigenze;
per esempio, saranno evidenziati gli esercizi ancora aperti rispetto all’orario corrente
o che offrono un servizio piuttosto che un altro.
Sezione relativa ai pernottamenti
Questa sezione fornirà informazioni accurate sulle varie strutture alberghiere e i
B&B presenti in città. L’utente avrà la possibilità di consultare la lista fornita e
di valutare quale struttura risponde meglio a ciò che cerca. Tra le informazioni
riportate, assumono particolare importanza la fascia di prezzo nella quale ricade
quello specifico albergo o B&B, la posizione e le indicazioni stradali per raggiungere
la struttura.
10
1 Analisi dei requisiti e studio di fattibilità
Sezione relativa agli svaghi
All’interno della sezione relativa agli svaghi saranno incluse le attività che hanno a
che fare con il tempo libero, gli hobby e il divertimento. Esse avranno la seguente
tassonomia:
•
•
•
•
•
•
Cinema;
Centri benessere;
Villaggi Turistici;
Sport;
Stabilimenti balneari;
Disco;
Come nelle sezioni precedenti, sarà presente un’area di dettaglio in cui l’utilizzatore finale avrà a disposizione le informazioni necessarie per conoscere più nello
specifico uno svago e per raggiungere il luogo in cui la corrispettiva location si trova.
Sezione relativa ai percorsi turistici statici
Una delle macro-aree più importanti dell’intero sistema riguarda i percorsi turistici
statici, che hanno lo scopo di valorizzare le bellezze della provincia reggina e facendole scoprire all’utente. Essi saranno creati dagli amministratori del sistema e
non potranno essere personalizzati dagli utilizzatori finali. I vari percorsi forniti dal
sistema saranno suddivisi in tre categorie:
•
•
•
Percorso enogastronomico, relativo al turista che ama conoscere i sapori, i
profumi e le tradizioni dei luoghi che sta visitando.
Percorso storico/culturale, relativo al turista che ama scoprire la storia e il
fascino culturale della provincia di Reggio Calabria.
Percorso naturalistico, relativo al turista che vuole godersi le bellezze paesaggistiche e naturalistiche della provincia.
Ogni percorso potrà essere suddiviso in un numero variabile di tratte delle quali
saranno fornite informazioni legate alle modalità e al tempo di percorrenza.
Sezione relativa alle informazioni di base sulla città
All’interno del sistema sarà dedicata una sezione nella quale saranno fornite tutte
le informazioni di carattere generale:
•
•
•
•
Come arrivarci;
Come visitarla;
Negozi di prodotti tipici;
Tradizioni.
1.1 Analisi dei requisiti
11
Sezione relativa ai servizi primari
Tale area sarà una guida per l’utente per usufruire dei servizi principali forniti dal
comune di Reggio Calabria; tra questi i servizi sanitari, i trasporti, il Wi-Fi pubblico,
etc. I servizi saranno organizzati in tipologie e queste ultime in categorie. Di seguito
viene mostrata la corrispettiva tassonomia:
•
•
•
Servizi sanitari:
– Guardia Medica;
– Ospedali;
– Farmacie/Parafarmacie.
Trasporti:
– Aereoporti;
– Stazioni ferroviarie;
– Taxi;
– Traghetti;
– Bus e pullman.
Parcheggi:
– Parcheggi pubblici;
– Parcheggi privati.
Sezione relativa agli eventi
Questa macro-area del sistema avrà l’obbiettivo di sponsorizzare gli eventi che si
svolgono nella provincia di Reggio Calabria. L’utente potrà consultare la lista degli
eventi disponibili categorizzati secondo la seguente tassonomia:
•
•
•
Culturale;
Musica e spettacolo;
Sport.
Il sistema dovrà visualizzare solo gli eventi ancora in corso e quelli futuri.
Sezione relativa alla ricerca dei contenuti
Attraverso questo requisito funzionale, un utente dovrà poter effettuare una ricerca
tra tutti i contenuti disponibili per individuare quelli capaci di soddisfare le proprie
esigenze. I risultati della ricerca porteranno ad una lista che conterrà tutti quei
contenuti che rispondono ai criteri di ricerca inseriti. A questo punto, l’applicazione consentirà l’accesso ad un’area di dettaglio, in cui verranno riportate tutte le
informazioni riguardanti il singolo contenuto. In particolare, si distingueranno due
tipologie di ricerca:
•
•
Ricerca generica: potrà permettere all’utente di ricercare un contenuto generico
senza specificare nessun filtro;
Ricerca avanza: potrà permettere all’utente di ricercare un contenuto generico
specificando il contesto di riferimento e utilizzando opportuni filtri.
12
1 Analisi dei requisiti e studio di fattibilità
Sezione relativa alla gestione dei contenuti
I contenuti visualizzati sui dispositivi mobili non dovranno essere memorizzati localmente, ma risiederanno su un sistema esterno, il quale verrà amministrato tramite
un sito “web responsive”. Tale scelta è stata fatta per creare un facile accesso all’area di gestione (attività CRUD) e per una predisposizione ad-hoc per le future
release.
1.2 Studio di fattibilità
Dopo la fase preliminare di raccolta dei requisiti è stato necessario produrre un
documento esplicativo dello studio di fattibilità che raccogliesse tutti gli aspetti
relativi ai possibili rischi che si potranno incontrare in fase di produzione ed eventuali
anomalie e/o eventuali aspetti non fattibili. In questa sezione parleremo proprio di
questo studio di fattbilità prendendo in considerazione i seguenti quattro aspetti:
•
•
•
•
Progetto di massima della soluzione: specifiche e modalità di realizzazione.
Analisi dei rischi: fattori di rischio e modalità di gestione del rischio.
Modalità di attuazione del progetto: segmentazione, realizzazioni previste, piano
di massima, tempi e risorse, comprese, naturalmente, le risorse umane.
Analisi di impatto: stima dei costi e analisi di investimenti necessari ed eventuali.
1.2.1 La situazione attuale
Il prodotto finale, come già definito nel documento di analisi dei requisiti, sarà costituito da un’applicazione mobile multi-piattaforma di supporto ai turisti e fungerà
da vetrina per la città di Reggio Calabria. Il sistema commissionato dovrà fornire
una serie di servizi agli utenti finali; questi potranno essere: turisti, cittadini, esercenti e amministratori comunali. L’obbiettivo finale sarà, dunque, la pubblicazione
dell’applicativo sui principali marketplace (Apple Store e Play Store) e la fornitura
di un pannello di amministrazione per la gestione dei contenuti.
1.2.2 Progetto di massima della soluzione
Il punto di partenza per la produzione di una soluzione è quello di individuare
le specifiche applicative che riguardano l’architettura dei dati, l’architettura applicativa e l’interfaccia utente. Dal punto di vista tecnologico, l’architettura dei dati
sarà gestita mediante un DBMS relazionale. L’architettura applicativa e l’interfaccia
utente, per quanto riguarda gli user administrator, saranno gestite tramite un sito
web “responsive”, mentre, per la fruizione dei servizi da parte degli utenti passivi,
sarà utilizzata un’applicazione mobile multipiattaforma.
L’architettura verrà realizzata in maniera modulare, in modo tale da permettere
il riutilizzo di ciascun modulo per tutti gli aspetti comuni risparmiando in termini
di tempi di sviluppo e mantenendo una buona scalabilità e una buona gestione del
software.
1.2 Studio di fattibilità
13
1.2.3 Analisi dei rischi
La dimensione progettuale e la complessità generale non implicano rischi sulla fase
di produzione in quanto la fase di analisi ha ben chiarito tutti i task da realizzare.
La modalità di attuazione del progetto prevede una segmentazione indipendente
che faciliterà la parallelizzazione del lavoro.
Fattori di rischio trasversali
I fattori di rischio trasversale che si possono individuare nel presente progetto sono
i seguenti:
•
•
•
•
la mancata partecipazione degli enti comunali nel fruire dati necessari al sistema;
la scarsa disponibilità di risorse in quanto il progetto non prevede alcun tipo di
finanziamento;
l’utilizzo di un unico server centralizzato che potrebbe bloccare il processo di
sviluppo in caso di mal funzionamento;
la possibilità di guasto o malfunzionamento dei calcolatori personali utilizzati
dagli sviluppatori, che può provocare rallentamenti di produzione dei singoli
task.
Per fronteggiare tali problematiche si cercherà di creare una struttura il meno
dipendente possibile dai contenuti, che si appoggia su strutture di testing fornite
dall’Università Mediterranea di Reggio Calabria, dando la priorità allo sviluppo
di componenti software lato server. Inoltre, per gestire le richieste di modifiche e
aggiunte durante la fase di produzione, si creeranno dei check-point con cadenza
settimanale. I tempi di sviluppo sono stati valutati con un ampio margine di tolleranza. La scelta di adottare strumenti innovativi per lo sviluppo potrà rappresentare
un fattore di rallentamento in fase iniziale di produzione. Quantificando il rischio
in termini di impatto, questo può considerarsi basso.
1.2.4 Modalità di attuazione del progetto
Segmentazione del progetto
Come già sottolineato nella fase di analisi dei requisiti, si è suddiviso il sistema in
una serie di macro-aree. La segmentazione del progetto consiste nella progettazione
e nell’implementazione separata di esse. La struttura e le funzionalità delle singole
macro-aree sono state discusse e concordate in seguito a colloqui ed interviste con
gli stakeholder.
Problemi sui singoli segmenti
Dopo aver analizzato la macro-area 10, riguardante la gestione dei contenuti, sono state riscontrate alcune problematiche di carattere implementativo, gestionale e
legate alle regole del libero mercato. Il punto focale del problema era relativo all’impossibilità di attingere in maniera automatica e programmata ad informazioni
relative ad enti privati (ristorazioni, pernottamenti e svaghi) e a quelle legate ad
14
1 Analisi dei requisiti e studio di fattibilità
eventi comunali e non. Oltre a questo, l’inserimento di una particolare attività (effettuato dall’amministratore) rispetto ad un’altra potrebbe portare al non rispetto
delle normali regole di equità di mercato.
Per questa serie di motivi è stato fissato un nuovo incontro con gli stakeholder
(nello specifico con un rappresentante dell’amministrazione comunale), durante il
quale è stata proposta una soluzione alternativa. La soluzione individuata ha richiesto la realizzazione di una nuova funzionalità, grazie alla quale gli esercenti, previo
acquisto di opportune credenziali, potranno accedere al pannello di amministrazione
e inserire i dati relativi alla propria attività o all’evento da loro organizzato. Tale
soluzione sarà disponibile nella seconda release del sistema.
Un altro aspetto di cui si è discusso durante il secondo incontro con gli stakeholder è stato quello relativo alla macro-area riguardante i servizi primari; più
nello specifico, in fase preliminare, si era pensato di fornire informazioni dettagliate
legate ai servizi offerti da varie aziende dei trasporti. Una soluzione di questo tipo
non sarebbe stata possibile in quanto alcune aziende avevano già progettato di realizzare delle proprie applicazioni. Per questo motivo si è deciso di ridurre il livello
di dettaglio.
Gli altri macro blocchi non presentano altri limiti temporali o implementativi.
1.2.5 Analisi dei tempi e delle risorse umane
Nella Figura 1.1 vediamo il diagramma di Gantt che illustra in maniera generale la
stima dei tempi di produzione del progetto.
Figura 1.1. Il diagramma di Gantt iniziale
Le risorse umane necessarie per la realizzazione del progetto sono due figure di
analisti e programmatori.
1.2.6 Analisi di impatto: Costi
L’analisi di impatto relativo ai costi ha portato ad individuare due differenti fonti
di spesa. Da una parte risulta necessario prendere in considerazioni i costi base per
il rilascio dell’applicativo mobile, ovvero 25 e per Android (una tantum) e 100 e
per iOS (all’anno); e dall’altra i costi relativi al server (non stimati in questa fase del progetto in quanto, per il momento, ospitati presso il SIAT dell’Università
Mediterranea di Reggio Calabria.).
2
Tecnologie ibride di seconda generazione:
AppGyver
Questo capitolo presenterà la tecnologia software che è stata adottata per la realizzazione della componente client-side del sistema. Verranno descritte le differenze
principali tra programmazione nativa, quella orientata al web e quella ibrida; di
quest’ultima si analizzeranno i framework più diffusi e, infine, ci si soffermerà sulla
piattaforma scelta per il progetto di tesi, ovvero AppGyver.
2.1 La rivoluzione del mobile
L’Italia è al primo posto in Europa per il numero di smartphone posseduti dalla
popolazione e si presenta come la cartina di tornasole per analizzare il mercato
tecnologico che interessa l’intero pianeta. La grande rivoluzione è avvenuta tra il
2009 e il 2012 con il boom degli smartphone la cui percentuale di possesso da parte
della popolazione è passata dal 15% al 27,7%. Il 2011 rappresenta un’altra data
cruciale; esso è, infatti, l’anno in cui è avvenuto lo storico sorpasso dei dispositivi
mobili sui PC; i 100 milioni di dispositivi mobili venduti in tutto il mondo, contro i
93 milioni di PC, non rappresentano soltanto una semplice inversione di tendenza a
livello di mercato, ma una vera e propria svolta tecnologica e sociale, l’inizio di una
nuova era. Questa rivoluzione ha comportato un cambio nella modalità di accesso
e fruizione dei contenuti, nel modo di pensare degli utenti, nel modo di interagire
tra loro e di effettuare tutte quelle operazioni quotidiane che prima richiedevano, se
non la presenza fisica in un determinato luogo, almeno l’utilizzo di un dispositivo
fisso, o relativamente ingombrante, come computer e notebook.
Il successo dei dispositivi mobili si diffonde di pari passo con la crescita delle
cosiddette app, sostantivo, questo, che è ormai entrato a far parte del vocabolario
comune di milioni di persone, nonostante, fino a pochi anni fa non avesse alcun
rilevante significato. Il termine app deriva dal termine inglese “application”; tecnicamente si tratta di applicazioni di vario genere, gratuite o meno, che è possibile
scaricare sui propri smartphone o tablet, direttamente dai principali marketplace.
Il vero punto di forza delle applicazioni mobili è, sicuramente, rappresentato facilità
di utilizzo e dalla vasta gamma di servizi che possono essere consumati mediante il
loro utilizzo.
16
2 Tecnologie ibride di seconda generazione: AppGyver
Parallelamente alla diffusione sul mercato delle applicazioni mobili si è avuta
una crescita esponenziale delle aziende che hanno focalizzato il loro core business
sullo sviluppo software delle app. Per la creazione di un’applicazione, le aziende
del settore, ma anche gli sviluppatori indipendenti, si trovano di fronte almeno
tre possibilità: sviluppare su una specifica piattaforma e rilasciare la propria app
soltanto per essa, lavorare su più piattaforme per garantirsi un pubblico più vasto
oppure adottare l’approccio ibrido o cross-platform.
2.1.1 Mobile application: app nativa, ibrida e webApp
Dopo aver introdotto il concetto di applicazione mobile, vediamo quali sono le tecnologie utilizzate per il loro sviluppo, evidenziandone le differenze, compresi i vantaggi
e gli svantaggi. In generale, è possibile scegliere tra diversi approcci per la realizzazione di applicazioni per smartphone e tablet. Più specificatamente, nel panorama
attuale è possibile individuare le seguenti soluzioni:
•
•
•
applicazioni native;
web app;
applicazioni ibride.
Queste saranno esaminate più in dettaglio nelle prossime sottosezioni.
Applicazioni native
Le app native sono applicazioni create appositamente per un certo sistema operativo
mobile, scritte con il linguaggio della piattaforma su cui dovranno girare e installabili
sul dispositivo. Ad esempio, nel caso del sistema operativo iOS, un’app nativa sarà
scritta in linguaggio Objective-C o Swift e sarà scaricabile da App Store; invece,
un’app per Android sarà scritta in Java e sarà possibile eseguire il download su
Google Play Store.
Web app
Le web app sono pagine web orientate ai dispositivi mobili scritte in un linguaggio
cross-platform come HTML. Essendo pagine web, esse sono accessibili da qualsiasi
dispositivo mobile che, però, supporti le più recenti tecnologie web (come HTML5
e CSS3). C’è da dire, però, che le web app hanno un accesso parziale all’hardware
del dispositivo. Esse, infine, hanno velocità ragionevoli e non posseggono uno store
dedicato.
Applicazioni ibride
Le app ibride sono applicazioni scritte in un linguaggio cross-platform (in genere,
Javascript + HTML5), come le web app; a differenze di queste ultime, però, esse
possono essere incapsulate tramite web view nel linguaggio nativo di una determinata piattaforma. Si possono, quindi, scaricare dagli store di riferimento ed installare
sui rispettivi dispositivi: esse presentono un discreto accesso al sistema operativo
2.1 La rivoluzione del mobile
17
anche se non sono state scritte interamente nel linguaggio specifico della piattaforma. Questa soluzione è un giusto compromesso tra sviluppo web standard e app
native, in quanto permette l’accesso e il controllo all’hardware sviluppando, però, il
cuore dell’applicazione in linguaggi standard dedicati al web.
Vantaggi e svantaggi delle tre tecnologie
Ogni tecnologia precedentemente descritta ha aspetti positivi e negativi e la scelta di
una di esse deve essere fatta valutando attentamente le diverse condizioni ed il contesto in cui si va ad operare. Descriviamo, adesso, gli aspetti positivi e negativi delle
tecnologie sopra descritte. Le applicazioni native sono quelle che si interfacciano al
sistema operativo mobile nel modo più completo. Essendo sviluppate per quella specifica piattaforma possono interfacciarsi del tutto con le API della stessa, andando,
cosı̀, ad interagire totalmente con l’hardware e il software (o, comunque, con le parti
hardware e software rese accessibili dal gestore della piattaforma). Ne consegue che
esse potranno sfruttare le funzioni più importanti del dispositivo, integrandole e
potenziandole: stiamo parlando dell’accesso alla fotocamera, alla geolocalizzazione,
al file system, alla rubrica, alle funzioni di pinch-to-zoom, e molto altro ancora.
In questo modo, le applicazioni native riescono ad offrire una maggiore velocità
di esecuzione e, quindi, prestazioni elevate. Senza dubbio, tale approccio fornisce una
user experience sensazionale, ma ha anche dei punti negativi. Più specificatamente:
•
•
Le applicazioni native sono legate alla piattaforma per la quale vengono sviluppate.
Se si vuole rendere disponibile il software su più piattaforme, esso dovrà essere
realizzato tramite l’utilizzo di tecnologie differenti; per questo motivo il tempo
di sviluppo sarà molto lungo poiché, nonostante il risultato finale sia più o meno
lo stesso in tutte le piattaforme, l’app dovrà essere scritta in linguaggi diversi.
Le web app hanno lo svantaggio di non potersi interfacciare con le API del sistema operativo e di non poter, quindi, accedere ad hardware e software del dispositivo
(ad esempio, non sono in grado di accedere al file system). Esse non sono installate
sul dispositivo ma su un server web, quindi sono accessibili soltanto in modalità
online “responsive”.
Il loro grande vantaggio è quello di non incidere particolarmente sulla memoria
RAM e sulla capacità di calcolo del dispositivo in uso; in sostanza, una web app
funziona con le medesime prestazioni su smartphone che possiedono processori con
performance differenti. Ciò che influenzerà le prestazioni sarà la connessione internet più o meno veloce. Tale approccio è perfetto per applicazioni per cui non è
strettamente necessario accedere alle funzioni “fisiche” del dispositivo o in casi in
cui i tempi di rilascio sono molto brevi.
Le app ibride fondono i vantaggi delle web app con quelle delle app native,
con la conseguenza di un time-to-market molto ridotto. In altre parole esse offrono
la possibilità di programmare una sola volta per poi incapsulare il codice, tramite opportune operazioni, negli specifici “gusci” costituiti dai sorgenti di ciascuna
piattaforma. Esse offrono, atresı̀, la possibilità di interagire con le funzioni software
e hardware del dispositivo. Un’app ibrida non sarà mai fluida e ottimizzata come
un’app nativa, e comunque richiederà un tempo di sviluppo superiore a un’app web.
18
2 Tecnologie ibride di seconda generazione: AppGyver
Le app ibride, però, abbattono i costi di sviluppo, avendo un costo di produzione
più contenuto rispetto a quello delle app native, e offrono una curva di apprendimento migliore. Infine, esse non implicano la conoscenza di tutti i linguaggi di
programmazione delle piattaforme mobili.
Anche nel caso di sviluppo di applicazioni mobili tramite tecnologie ibride si
incontrano degli svantaggi; il loro livello di rilevanza varia in maniera differente
anche in base al tipo di piattaforma utilizzata. I principali svantaggi da considerare riguardano la minore efficienza nel rendering grafico, non confrontabile con
quello effettuato tramite la tecnologia nativa, la potenziale lentezza di esecuzione
nell’accesso alle risorse locali e, infine, in base ai framework utilizzati, l’aspetto
dell’interfaccia grafica che potrebbe non risultare abbastanza omogenea rispetto a
quella nativa della piattaforma. In linea di massima, le app ibride si pongono a metà
strada tra le app native e le web app, rappresentando un buon compromesso per la
creazione di applicazioni mobili multipiattaforma con un supporto nativo.
Le precedenti considerazioni sono alla base della nostra scelta di sviluppare la
componente mobile del sistema oggetto della presente tesi utilizzando un approccio
ibrido. Nello specifico, abbiamo deciso di adottare la piattaforma per lo sviluppo di
applicazioni mobile ibride AppGyver.
2.1.2 I principali ambienti di sviluppo di app ibride
Nello sviluppo delle applicazioni mobili, la scelta del framework e della modalità di
sviluppo del progetto, che si adatta meglio alle esigenze di mercato del cliente, è un
elemento critico che deve essere valutato con grande attenzione visti gli impatti sul
business nel medio e breve termine. Quando si parla di framework per lo sviluppo
di applicazioni mobili ibride si intende un insieme di librerie sulle quali un software
può essere progettato, realizzato e distribuito su più piattaforme scrivendo il codice
sorgente una sola volta. Il compito del framework è infatti quello di ricompilare il
codice in modo che si adatti automaticamente a sistemi operativi diversi come ad
esempio iOS, Android e Windows Phone. In ambito mobile, è possibile identificare
due possibili tipologie di framwork:
•
•
Wrapper, framework di prima generazione;
Librerie, framework di seconda generazione.
2.2 Framework di prima generazione: Cordova e
Appcelerator
Per quanto riguarda i framework di prima generazione, in questa sezione si è scelto
di analizzare Apache Cordova e Titanium Appcelerator. Tali framework sono stati
nel passato, e continuano a rappresentare nel presente, una delle scelte principali,
per aziende e sviluppatori indipendenti, nella creazione di app cross-platform.
2.2.1 Apache Cordova
Apache Cordova (Figura 2.1) nasce dal progetto PhoneGap avviato da un’azienda
canadese, Nitobi Software, e venduto nel 2011 ad Abobe. Contestualmente alla
2.2 Framework di prima generazione: Cordova e Appcelerator
19
trattativa con Adobe, Nitobi ha donato alla fondazione Apache il progetto che in un
primo tempo aveva assunto il nome di Apache Callback e, successivamente, il nome
attuale di Apache Cordova. Si tratta, quindi, un software open source distribuito
con licenza Apache 2.0.
Figura 2.1. Apache Cordova e PhoneGap
Aspetti tecnici e architettura del framework
Apache Cordova è un framework di sviluppo per applicazioni mobili open source.
Esso fornisce gli strumenti necessari a sviluppare software per i dispositivi mobili
che utilizzano JavaScript, HTML5 e CSS3, senza che questi ultimi debbano utilizzare API specifiche della piattaforma, come quelle di Android, iOS o Windows Phone.
Anche se Cordova è un framework multipiattaforma, i requisiti software variano in
base alla piattaforma mobile di riferimento. Ad esempio, per sviluppare un’applicazione e compilarla per Android possiamo usare indifferentemente un PC Linux,
Windows o un Mac, mentre possiamo sviluppare un’app iOS solo su Mac. Questo
perché, per ciascuna piattaforma mobile di riferimento, dobbiamo avere installato il
relativo SDK di sviluppo. Il codice HTML, CSS, JavaScript scritto non è compilato
da Apache Cordova nel linguaggio nativo del dispositivo scelto. Sostanzialmente,
l’architettura di Apache Cordova si presenta come una sorta di contenitore di applicazione web eseguita localmente. Cordova è, infatti, costituita da una web view che
occupa l’intero schermo del dispositivo all’interno della quale vendono “renderizzati” l’HTML e CSS, e viene eseguito il codice JavaScript. L’utilizzo di quest’ultimo
permette di sfruttare le API necessarie per far comunicare la web view con il dispositivo che lo occupa. In altre parole, le applicazioni vengono eseguite in un wrapper
specifico per ogni piattaforma, il quale utilizza le API messe a disposizione dagli
ambienti specifici per accedere alle risorse hardware e software di ogni dispositivo.
Nonostante il framework si basi sul principio di unicità del codice è, comunque,
inevitabile che la fase ultima di deploy dell’applicazione debba essere effettuata su
una piattaforma di sviluppo nativa. Una volta completato lo sviluppo basato su
HTML, JS e CSS, la fase finale prevede la creazione, su X-Code per iOS e su Eclipse per Android, di un progetto che, sfruttando le librerie native di Cordova (una
20
2 Tecnologie ibride di seconda generazione: AppGyver
per ogni tipo di piattaforma) permetterà la fruizione e l’interoperabilità con l’applicativo scritto in linguaggio universale. Per la creazione di tali progetti, necessari
al porting dell’applicazione, non è richiesta alcuna conoscenza di linguaggio nativo
in quanto i passaggi sono illustrati nel dettaglio sul sito di Apache Cordova. Per
utilizzare le funzionalità native dei dispositivi, il framework in questione mette a
disposizione dei componenti software che prendono il nome di plugin. Essi consistono in porzioni di codice implementate da una web view che permette di “mappare”
una funzione Java Script su una funzione nativa. Tali plugin sono usufruibili tramite
un’interfaccia JavaScript la quale fornisce diverse implementazioni dipendenti dalla
specifica piattaforma. Tutti i plugin di sistema sono contenuti nel Cordova Registry,
uno specifico repository messa a disposizione dal framework. Tramite tali plugin,
specifici per ogni esigenza, è possibile accedere alle seguenti classi di funzionalità:
•
•
•
•
•
•
•
•
•
Accelerometro: questo plugin consente di accedere all’accelerometro del dispositivo. Quest’ultimo è un sensore di movimento che rileva il cambiamento (delta) nel
movimento relativo all’orientamento corrente del dispositivo in tre dimensioni
lungo gli assi x, y e z.
Camera: tale plugin definisce un oggetto globale navigator.camera, il quale
permette l’accesso alla fotocamera, fornendo la possibilità di salvare l’immagine
scattata come file oppure di ottenerla con codifica base64 (codifica utilizzata
per la trasmissione tramite chiamate http). Esso fornisce, per la maggior parte
delle piattaforme, anche la possibilità di accedere alle immagini già presenti nella
libreria fotografica del dispositivo.
Capture: questo plugin è più generico rispetto al plugin Camera. Esso permette
l’acquisizione di file multimediali di tipo audio, immagine o video, offrendo la
possibilità di specificare diversi formati di acquisizione.
Connection: Tale plugin ci permette di accedere alle informazioni relative alla
connettività attuale del dispositivo; è possibile sapere se essa non è presente, se
è di tipo ETHERNET, WIFI, 2G, 3G o 4G.
Contacts: esso consente di accedere alle informazioni relative ai contatti, permettondo anche, di crearne di nuovi o di modificare quelli esistenti.
Device: tale plugin permette di accedere alle informazioni hardware e software
del dispositivo in uso.
Events: tale plugin permette di gestire gli eventi che si verificano sul dispositivo.
Gli eventi che è possibile gestire sono:
– dispositivo pronto (quando l’applicazione è completamente caricata);
– dispositivo in pausa (quando l’applicazione va in background);
– dispositivo online (quando viene rilevata la connettività);
– dispositivo offline (quando viene rilevata mancanza di connettività);
– pressione tasto back (se presente);
– rilevato livello critico o basso livello batteria;
– dispositivo offline (rilevata mancanza di connettività);
– rilevata pressione di pulsanti hardware vari.
File: questo plugin permette di interfacciarsi con il file system e consente
l’accesso in lettura e scrittura ai file e alle cartelle che risiedono sul dispositivo.
Geolocation: tale plugin consente di utilizzare il sensore GPS e, quindi, di rilevare
la posizione corrente del dispositivo anche quando quest’ultimo è in movimento. La posizione restituita corrisponderà alle coordinate fornite dal sensore o,
2.2 Framework di prima generazione: Cordova e Appcelerator
•
•
•
21
nel caso in cui queste ultime non fossero presenti, alle coordinate calcolate in
base alle specifiche W3C delle API di geolocalizzazione. Le coordinate vengono
restituite sotto forma di latitudine e longitudine.
Globalization: tale plugin permette di avere informazioni riguardo le lingue e le
impostazioni internazionali correnti del dispositivo (lingua attuale, separatore
delle migliaia, decimali, formato per la data, etc.).
Notification: questo plugin permette di gestire le azioni di notifica, come visualizzazione di messaggi (alert), alla vibrazione, ai suoni; a tal fine esso utilizza
audio e grafica nativi del dispositivo utilizzato.
Storage: esso permette l’utilizzo dello storage del dispositivo basato sulla specifica W3C dei database SQL web.
Nella Figura 2.2 viene rappresentata l’architettura che si è appena descritta.
Figura 2.2. Architettura di Apache Cordova
2.2.2 Titanium Appcelerator
Titanium Appcelerator (Figura 2.3), introdotto nel dicembre 2008, è una piattaforma software open source di sviluppo, che permette la creazione di applicazioni
multipiattaforma per dispositivi mobili utilizzando i linguaggi tipici dello sviluppo
web come Javascript, HTML e CSS. Questa peculiarità fornisce, ai programmatori
provenienti dallo sviluppo su web, una possibilità di riutilizzare le proprie competenze anche in ambito mobile, producendo applicazioni native (cioè che non girano
dentro una WebView) e multipiattaforma. Ad oggi, Titanium supporta lo sviluppo
sulle più importanti piattaforme mobile.
22
2 Tecnologie ibride di seconda generazione: AppGyver
Figura 2.3. Logo di Titanium Appcelerator
Aspetti tecnici e architettura del framework
Titanium viene definito come un framework di tipo “write once adapt everywhere”,
cioè un framework in cui gran parte della logica di business, delle funzioni di base,
della gestione degli eventi può essere considerata al 100% “cross-platform”, ma allo
stesso tempo permette di scrivere del codice dedicato ad aspetti relativi ad una
specifica piattaforma e non disponibile su altre. Ad esempio, le User Interface di
Android e iOS hanno entrambe a disposizione oggetti grafici come etichette (Label)
e pulsanti (Button), ma iOS ne utilizza altri che non sono presenti su Android.
Titanium permette di scrivere app in grado di sfruttare le peculiarità di ciascuna piattaforma su cui è previsto il rilascio; sarà possibile, ad esempio, utilizzare
l’ActionBar, se l’app gira su Android, oppure la NavigationBar, se l’app gira su
iOS.
Titanium funge da mediatore tra il codice sorgente dell’applicazione e il sistema
operativo nativo. Le applicazioni, scritte in JavaScript, non usano il DOM ma effettuano chiamate all’API esposta dall’SDK di Titanium. Quando si implementano
funzionalità che necessitano di interfacciarsi col sistema operativo, ad esempio per
disegnare un pulsante o per interrogare il GPS, sarà necessario richiamare specifiche
funzioni dell’SDK che, attraverso l’uso di oggetti Proxy, permetteranno di effettuare
il mapping tra richieste effettuate attraverso JavaScript e le equivalenti chiamate
in codice nativo. Il medesimo meccanismo continua a valere anche nel caso in cui il
sistema operativo ha la necessità di notificare un evento all’applicazione, ad esempio un evento scatenato dall’interazione dell’utente con la User Interface. In questo
caso, esso segue il percorso inverso e verrà gestito all’interno del codice JavaScript.
Il sistema dei proxy permette alle applicazioni Titanium di avere il “look and feel”
delle applicazioni native (perchè la UI è disegnata attraverso chiamate ai metodi
nativi del sistema operativo) con il vantaggio, per lo sviluppatore, di dover gestire
un solo progetto e una sola base di codice per più piattaforme, per di più utilizzando
un linguaggio semplice e potente come JavaScript.
Le applicazioni realizzate sfruttando tale framework saranno, come ipotizzabile,
leggermente più lente delle equivalenti native, ma, allo stesso tempo, si avrà un
guadagno in termini di tempi e costi di sviluppo. Titanium è un framework gratuito ma è disponibile anche una versione enterprise a pagamento, per sistemi OSX,
Windows e Linux. Può essere usato sia con la IDE proprietaria (Titanium Studio)
che con una CLI (Command Line Interface) basata su Node.js e personalizzabile.
Mediante Titanium Studio è possibile effettuare un debug del codice durante l’ese-
2.3 Framework di seconda generazione
23
cuzione dell’applicazione sia sul simulatore che sul dispositivo fisico; quest’ultimo
risulta indispensabile nel caso di sviluppo su Android (dal momento che l’emulatore
di Google non presenta una performance elevata).
Alloy: il framework di Titanium
Alloy è il framework di sviluppo open source creato per rendere più rapida l’implementazione delle applicazioni Titanium. Esso adotta un’architettura basato sul
pattern MVC e, tramite l’utilizzo di file XML e CSS-like, permette di separare la
logica di business dalla User Interface e dal modello dei dati. In un progetto Titanium Alloy la relazione tra una view e il suo controller è data dal nome dei file che,
ad esclusione dell’estensione, deve essere lo stesso per entrambi. Quindi, se abbiamo chiamato una view example.xml, il suo controller si chiamerà necessariamente
example.js. I due file però non verranno salvati nella stessa cartella, perchè Alloy
prevede che view e controller abbiano una directory a loro dedicata.
In Figura 2.4 viene descritta l’archittettura di Alloy, basata sul pattern MVC.
Figura 2.4. Architettura di Alloy
2.3 Framework di seconda generazione
In questa sezione si descriveranno le caratteristiche principali dei framework mobile
di seconda generazione e si approfondirà lo studio su Ionic, uno degli ultimi nati
nell’ambito di sviluppo per applicazioni mobile. Si tratterà di un punto di partenza
per il successivo approfondimento della piattaforma AppGyver, utilizzata per la
realizzazione della componente mobile del sistema oggetto della presente tesi.
I framework di seconda generazione sono formati da un insieme di librerie che
offrono, tramite i linguaggi del web, gli strumenti per riprodurre e simulare i comportamenti tipici delle interfacce native sia in termini di grafica sia in termini di
interattività con le interfacce utente. Essi facilitano la manipolazione del DOM
(Document Object Model), l’utilizzo di librerie AJAX e la gestione degli eventi,
fornendo gli strumenti necessari a semplificare lo sviluppo delle web app.
Tali framework consentono di adattare automaticamente il layout dell’app al
display del dispositivo, seguendo le regole di RWD (Responsive Web Design) che
24
2 Tecnologie ibride di seconda generazione: AppGyver
permettono di adattare l’app all’ambiente nel quale verrà eseguita supportando una
vasta gamma di dispositivi con differenti risoluzioni dello schermo e modalità di interazione. Alcune di queste librerie permettono di sfruttare il pattern architetturale
MVC (Model-View-Controller); esse sono tutte più o meno compatibili con uno o
più wrapper, e gratuite.
2.3.1 Ionic
Ionic (Figura 2.5) è un framework open source di seconda generazione che permette
di sviluppare la componente front-end di applicazioni mobile ibride. È stato realizzato da Ben Sperry, Adam Bradley Lynch del team Drifty ed è considerato dagli
autori stessi il “Bootstrap per le applicazioni ibride”. Se Bootstrap ha rivoluzionato
la creazione di interfacce per siti web, Ionic è nato con l’obbiettivo di diventare lo
strumento principe per la creazione di app mobile ibride. Tale framework è nato
nel Novembre del 2013 e la sua popolarità è cresciuta molto rapidamente fino al
raggiungimento di numeri importanti: basti pensare che vengono create migliaia di
applicazioni con Ionic ogni mese.
Figura 2.5. Il logo di Ionic
Aspetti tecnici e architettura del framework
Per lo sviluppo di applicazioni tramite questo framework, si fa riferimento ad altri
due componenti essenziali per il processo di sviluppo, ovvero:
•
•
AngularJS;
Apache Cordova.
L’utilizzo cooperativo di queste due tecnologie con Ionic rende la costruzione
dell’app ibrida veloce e facile. Nella Figura 2.6 viene mostrato come queste tecnologie collaborino tra di loro, anche se il meccanismo di interazione dei tre framework
rimane trasparente all’utente.
2.3 Framework di seconda generazione
25
Figura 2.6. Il meccanismo di interazione tra i tre framework
Nello specifico, è possibile identificare quattro differenti figure chiave, ciascuna
delle quali ricopre un ruolo specifico e fondamentale. In particolare:
•
•
•
•
Il dispositivo carica l’applicazione Ionic di cui l’utente ha deciso di fare utilizzo.
Esso contiene il sistema operativo, che gestisce l’installazione delle applicazioni e
fornisce un set di API da usare per accedere alle diverse caratteristiche hardware,
come la localizzazione GPS, l’elenco dei contatti e la fotocamera.
L’applicazione, una volta caricata, altro non è che un contenitore nativo (wrapper), realizzato con Cordova, al cui interno è presente l’applicazione web e la
cosiddetta Web View. Cordova rappresenta lo strumento necessario per creare
un ponte tra la piattaforma e l’applicazione web e ha accesso a quest’ultima
attraverso le API Javascript.
L’applicazione web, eseguita dentro la Web View, viene creata attraverso AngularJS, un framework JavaScript basato sul pattern MVC.
L’interfaccia utente dell’applicazione è curata da Ionic, che riesce a fornisce
controlli ottimizzati in grado di garantire un’esperienza di utilizzo piacevole.
Tali controlli vengono eseguiti direttamente all’interno della Web View.
Ionic fornisce un insieme di componenti legati all’interfaccia utente di cui
HTML5 non dispone. Tali componenti presentano una struttura costituita da una
combinazione di CSS, HTML e Javascript e si comportano in modo molto simile a
quanto avviene quando si utilizzano i controlli nativi. I componenti Ionic sono utilizzati tutti insieme per creare un’efficace User Interface. Ionic è la dimostrazione
che non è vero che le app native sono l’unica via per ottenere applicazioni veloci e
con supporto alle caratteristiche hardware.
Punti di forza del framework
È possibile individuare i seguenti punti di forza del framework Ionic:
•
•
Performance e reattività: la velocità, la reattività, e in generale le performance
del prodotto, rappresentano gli aspetti principali nello sviluppo di un’applicazione. Ionic è stato costruito per garantire alti livelli di prestazione. Tale framework
elimina la necessità di modificare direttamente il DOM nonchè di utilizzare librerie di terze parti per le animazioni e le transizioni. Quest’ultimo aspetto è
possibile grazie al supporto dell’accelerazione grafica hardware.
Combinazione perfetta con AngularJS: in Ionic la logica di business è gestita
da AngularJS. Il connubio tra le potenzialità offerte da AngularJS e le ricche
26
•
•
2 Tecnologie ibride di seconda generazione: AppGyver
funzionalità grafiche messe a disposizione da Ionic produce uno degli strumenti
più adatti alla creazione di applicazioni mobili.
Orientamento nativo: le componenti grafiche di Ionic sono state progettate per
non discostarsi troppo da quelle native delle piattaforme mobili permettendo,
cosı̀, di garantire all’applicazione un look and feel molto simile a quello di un’applicazione nativa. In questo modo il programmatore non dovrà preoccuparsi dell’aspetto che il sistema avrà sui vari dispositivi mobili, in quanto ogni Web View
è totalmente “responsive”.
Command Line-Interface (CLI) dedicata, Ionic permette di eseguire numerose
funzioni attraverso la digitazione di semplici comandi nella CLI dedicata come
la creazione di un nuovo progetto, l’anteprima dell’applicazione nel browser o la
compilazione di un progetto già esistente.
2.4 AppGyver
La storia di AppGyver inizia solo cinque anni fa quando gli imprenditori Marko
Lehtimäki e Henri Vähäkainu ebbero l’idea di sviluppare applicazioni mobili per i
propri clienti, ma si resero presto conto che non esisteva una piattaforma completa
che permettesse tutto ciò. È possibile racchiudere la mission aziendale di AppGyver
nella volontà di rendere le applicazioni HTML5 ibride indistinguibili dalle applicazioni native e, allo stesso tempo, puntare alla realizzazione di una piattaforma
completa per lo sviluppo e che permetta la creazione di applicazioni nel modo più
rapido possibile.
Questo si può tradurre nel fornire un set di strumenti completi, sia per principianti che per esperti sviluppatori, per costruire rapidamente, testare e distribuire le
proprie applicazioni mobili. In una fase iniziale, i fondatori provarono ad utilizzare
altre soluzioni preesistenti, ma non raggiunsero la qualità che si erano prefissati per
le loro app. L’unica opzione rimasta era quella di costruirsi la propria piattaforma
personale ed è proprio adottando tale scelta che venne costruita AppGyver. AppGyver Inc. fornisce un nuovo strumento per lo sviluppo di applicazioni mobili che
possiede funzionalità multi-piattaforma in grado di garantire prestazioni paragonabili a quelle derivate dagli approcci nativi; esso garantisce, altresı̀, la capacità di
creare rapidamente applicazioni completamente funzionali senza scrivere tantissime
righe di codice.
Le applicazioni mobili realizzate tramite approcci ibridi sono viste come un compromesso per la creazione di applicazioni native, introdotte per superare i problemi
di quest’ultime, principalmente legati a tempi e costi elevati impiegati per lo sviluppo. Esse sono in grado di ottenere prestazioni accettabili utilizzando la tecnologia
web. L’approccio ibrido, anche se utilizza tecnologie orientate al web, fornisce gli
strumenti per accedere a funzioni native attraverso wrapper e web view.
AppGyver ha trovato una soluzione perspicace al problema delle scarse prestazioni delle applicazioni scritte in HTML5, le quali sono state sovrastate dalle
applicazioni native che presentano, generalmente, una performance molto migliore.
Esso offre due opzioni differenti per la costruzione di applicazioni ibride, l’utilizzo di Steroids o del più semplice, ma allo stesso tempo limitato, Composer. Questa piattaforma, rispetto alle tecnologie che la precedono, presenta alcuni vantaggi
importanti:
2.4 AppGyver
•
•
•
27
Data Binding; consiste nella gestione dell’integrazione dei dati. Utilizzando la
struttura classica delle web app, Steroids possiede un supporto per built.io, Parse
e l’integrazione con ogni REST API, tutto mediante l’utilizzo di un’interfaccia
utente point-and-click che vedremo a breve.
Non solo un framework e un compilatore; la maggior parte delle altre soluzioni
per la creazione di app ibride sono o framework di interfaccia utente o piattaforme che permettono l’utilizzo di API native e la compilazione. AppGyver invece
è una piattaforma indipendente dal linguaggio, che permette l’integrazione dei
dati e la distribuzione con un notevole supporto per plug-in.
Prestazioni native; le applicazioni ibride sono spesso criticate per non riuscire
a raggiungere sia la performance che la completezza grafica delle applicazioni
native, soprattutto quando si tratta di transizioni tra viste e animazioni. AppGyver offre tutti gli strumenti per rendere le applicazioni ibride completamente
indistinguibili da quelle native.
La piattaforma mette a disposizione degli sviluppatori gli strumenti necessari a costruire applicazioni cross-platform e pubblicarle nei marketplace, come, ad
esempio “l’AppGyver’s Academy” (Figura 2.7) , che fornisce soluzioni su tematiche
comuni e guide sui framework a disposizione.
Figura 2.7. L’AppGyver Accademy.
2.4.1 Il Composer di AppGyver
Uno dei più recenti strumenti messi a disposizione della comunity di AppGyver è il
Composer. Esso è uno strumento visuale basato sul browser che permette l’avvio e
la modifica di applicazioni in modo rapido, semplice e senza un’eccessiva esperienza
di programmazione. Esso è dotato di un modello di programmazione “drag-anddrop”, che permette di realizzare app mobile iOS e Android; esso fornisce, altresı̀,
28
2 Tecnologie ibride di seconda generazione: AppGyver
un’interfaccia flessibile che consente, a chi possiede conoscenze tecniche limitate, di
costruire applicazioni di alta qualità, sia dal punto di vista della logica di business
che dal punto di vista della user interface.
Il Composer è un tool gratuito, integrato con Adobe PhoneGap, messo a disposizione degli sviluppatori, in cui sono presenti i servizi di base. Tramite acquisto è
possibile utilizzare i componenti aggiuntivi, come un proxy di dati e i servizi cloud.
Questo risulta essere un approccio sempre più in crescita, portando, cosı̀, a una
nuova classe di sviluppo di applicazioni mobili, dove non è più necessario avere una
forte conoscenza di linguaggi di programmazione specifici.
Questo tool è intuitivo e presenta una curva di apprendimento relativamente
bassa.
Ogniqualvolta si crea un progetto viene fornita una libreria di componenti comuni per l’interfaccia utente; tra questi troviamo numerosi elementi dei moduli, immagini, pannelli, elenchi, pulsanti. Allo stesso tempo, viene garantita la possibilità
di aggiungere codice HTML personalizzato.
Tutti questi componenti prendono vita tramite un editor di logica visiva in cui è
possibile configurare numerosi controlli di interazione e logica condizionale. Basta,
infatti, una conoscenza di base dei principi di programmazione per creare una logica
relativamente complessa.
Il Composer consente agli sviluppatori di utilizzare le API REST per aggiungere
un back-end personalizzato o per integrare i servizi cloud di terze parti, come Parse
e Kimono. Esso utilizza il framework JavaScript AngularJS assieme al framework
Ionic.
La compagnia di AppGyver sostiene che sono state realizzate più di 10.000
applicazioni grazie agli strumenti che essa fornisce, sponsorizzando un nuovo livello
per lo sviluppo di applicazioni mobili ibride.
Tramite l’utilizzo del Composer di AppGyver è possibile quindi, gestire la logica
applicativa, anche se complessa, semplicemente effettuando un drag-and-drop visivo. Il prodotto realizzato tramite questo strumento può essere esportato come un
progetto AppGyver Steroids per affrontare uno sviluppo più complesso. In Figura
2.8 vediamo il pannello del Composer fornito tramite browser.
2.4.2 Steroids
La società informatica odierna sostiene che l’approccio basato su CSS e JavaScript
non si avvicini abbastanza ai vantaggi offerti dal mondo nativo. Per questo motivo, AppGyver ha rilasciato Steroids Hybrid UI. Esso permette di usufruire di
una programmazione più avanzata, legata in maniera più stringente con la logica
di business, grazie alla “Steroids Command-Line Interface (CLI) hybrid UI”, con
l’obbiettivo di raggiungere le prestazioni tipicamente garantite dalle app native. Il
framework Steroids è nato con lo scopo di migliorare sostanzialmente la tecnologia
PhoneGap ponendosi l’obiettivo di creare applicazioni costruite, tramite l’utilizzo di
HTML5 e strumenti proprietari, non distinguibili da applicazioni native. Esso consente di utilizzare i componenti nativi dell’interfaccia utente relativi all’app HTML5
attraverso delle semplici API JavaScript. AppGyver Steroids colma ampiamente il
divario tra le applicazioni ibride HTML5 e le applicazioni native.
2.4 AppGyver
29
Figura 2.8. Il tool visuale del Composer di AppGyver.
Steroids UI consente di includere componenti dell’interfaccia utente nativi in
un’app HTML5 utilizzando una API JavaScript di base.
AppGyver utilizza un approccio ibrido per la realizzazione della UI, creando
animazioni e funzionalità non vincolate in maniera stringente con CSS o JavaScript.
Steroids mette a disposizione la navigazione nativa, i side menù, le animazioni, le
transazioni, e tanto altro ancora. In parallelo, il Composer utilizza l’approccio dragand-drop per aiutare lo sviluppatore a creare applicazioni e integrare API in maniera
semplice e guidata.
Steroids richiede l’integrazione di una serie di librerie esterne, che risultano essere
essenziali per il suo utilizzo. I tool esterni da integrare in fase di installazione sono
i seguenti:
•
•
•
Git; si tratta di un sistema open source di versioning distribuito, pensato per
gestire progetti di piccole o medie dimensioni
Node.js; è un framework per la realizzazione di applicazioni web in JavaScript, che permette di utilizzare questo linguaggio, tipicamente adottato per
applicazioni client-side, anche per la scrittura di applicazioni server-side.
Steroids CLI; è un’interfaccia, usufruibile lato terminale, che permette di creare,
compilare e gestire un progetto Supersonic.
Nella fase preliminare e di creazione del progetto è possibile scegliere di configurare l’applicazione come un’app single-page o multi-page (file HTLM multipli).
Steroids è in grado di generare un progetto che presenta delle impostazioni e delle
configurazioni standard e di base ma che possono essere personalizzate utilizzando il
proprio codice, oppure importando delle specifiche componenti Web, disponibili grazie all’utilizzo di un gestore di pacchetti, come Bower, un “Power tool” che permette
di affrontare lo sviluppo front-end di applicazioni single page, mobile, o comunque
di app moderne, adottando un approccio più strutturato, quasi enterprise.
30
2 Tecnologie ibride di seconda generazione: AppGyver
In seguito alla personalizzazione del progetto originario, l’esecuzione del codice
avverrà su un server locale sul quale Steroids rileverà le modifiche apportate e
ricaricherà l’applicazione su un dispositivo reale o su un emulatore iOS o Android.
Il framework in questione offre un’interfaccia grafica basata su browser che
permette di usufruire dei seguenti servizi aggiuntivi:
•
•
•
•
•
connect;
logs;
documentation;
cloud;
data.
Tali servizi verrano illustrati in dettaglio nelle prossime sottosezioni.
Connect
Connect rappresenta il servizio “build distribution”, il quale permette la distribuzione della pre-release dell’app tramite l’utilizzo di un codice QR e dell’applicazione
Scanner AppGyver. Utilizzando quest’ultima applicazione, scaricabile gratuitamente sia per iOS che per Android, sarà possibile condividere e testare facilmente le
applicazioni. Ogni applicazione avrà associato un QR Code accessibile via web.
Nella Figura 2.9 è presentato il servizio Connect di AppGyver.
Figura 2.9. Il servizio Connect di AppGyver
2.4 AppGyver
31
Logs
Steroids fornisce una pipeline integrata per l’invio di eventi di log a Steroids CLI,
“bypassando” l’utilizzo del Web Inspector di Safari o del debuger di Chrome. Tale
servizio, tramite l’istruzione console.log, permette di visualizzare i messaggi in
base alla loro classe di appartenenza. Le classi disponibili sono le sequenti:
•
•
•
•
info;
errors;
warning;
debug.
Nello specifico, è possibile visualizzare i messaggi di log anche direttamente sul
dispositivo mobile, tramite l’istruzione steroids.logger. Nella Figura 2.10 viene
mostrata la console relativa alla gestione dei log di AppGyver.
Figura 2.10. La console di gestione dei log
Documentation
Questa sezione (Figura 2.11) permette di accedere a tutta la documentazione presente relativa al framework Supersonic e a tutte le API a disposizione; oltre a ciò,
essa fornisce la documentazione necessaria a sottoscrivere il codice prodotto per
renderlo disponibile a tutta la comunità.
Figura 2.11. La sezione relativa alla gestione della documentazione
32
2 Tecnologie ibride di seconda generazione: AppGyver
Cloud
In quest’area (Figura 2.12) è possibile distribuire la propria applicazione sull’AppGyver Cloud e gestire le impostazioni della stessa. Nello specifico, tramite il “Build
Services”, è possibile creare la versione dell’applicazione necessaria per la sua distribuzione sui vari market-place, o creare distribuzioni ad hoc, nonchè applicazioni
scanner personalizzate che includono plugin personalizzati e altre configurazioni.
Figura 2.12. La sezione relativa alla gestione dei servizi cloud
Data
Questa area (Figura 2.13) fornisce gli strumenti necessari alla gestione dei contenuti.
Il framework permette di integrare qualsiasi back-end a supporto dell’applicazione
mobile. AppGyver fornisce anche un “Sandbox Database”, situato sul cloud, per
la memorizzazione e la gestione dei dati, utile nel caso in cui non si disponga di
un back-end esterno. Questo tipo di servizio risulta essere vantaggioso nel caso in
cui l’organizzazione dei dati non necessiti di una struttura particolare, in quanto è
possibile personalizzare le richieste sui dati tramite questo pannello utilizzando gli
strumenti forniti dallo stesso.
Risulta apparentemente impossibile integrare l’applicazione mobile direttamente
con un back-end senza migrare i dati attraverso il cloud. Questo problema può essere
aggirato non configurando la connessione tramite questo servizio ma gestendola
direttamente lato codice tramite l’utilizzo del framework AngularJS o delle librerie
Ajax.
2.4.3 Supersonic
AppGyver Steroids offre una splendida soluzione per integrare un’applicazione
HTML5 con funzionalità native del dispositivo. Tale soluzione è rappresentata da
2.4 AppGyver
33
Figura 2.13. La sezione relativa alla gestione dei contenuti
Supersonic. Esso è un framework “agnostico” che permette di estendere il codice
HTML tramite l’introduzione di nuovi tag grazie ai quali è possibile utilizzare oggetti grafici ed effetti nativi. Tale framework mette a disposizione degli sviluppatori
un vasto insieme di componenti, tra cui librerie che permettono di usufruire di oggetti grafici nativi, come Side Menu, Tab Bar, Nav Bar, e una serie di classi CSS
combinate con blocchi di codice HTML per la modellizzazione completa della UI.
Come citato nelle sezioni precedenti, Supersonic permette, tramite opportune
istruzioni, di usufruire degli oggetti grafici e degli effetti delle piattaforme Android
e iOS. Di seguito elenchiamo alcuni componenti dell’interfaccia utente che vengono
implementati in modo nativo in Supersonic:
•
•
•
tab bar;
navigation bar;
drawer.
Questi verranno illustrati in dettaglio nelle prossime sottosezioni.
Tab bar
La tab bar è una speciale barra ancorata nella parte inferiore dell’app, che permette
di raggiungere facilmente le principali view dell’applicazione. La tab bar fornita da
Supersonic è implementata tramite codice nativo; essa, quindi, è sempre situata al
di sotto dei contenuti e non interferisce né risulta influenzata dal posizionamento
degli elementi HTML. Ogni tab mantiene la propria pila di livelli (pila di view),
in modo che tutti questi e i loro contenuti siano separati dai corrispettivi presenti
nelle pile differenti.
34
2 Tecnologie ibride di seconda generazione: AppGyver
Definizione delle tab
Il ciclo di vita delle tab è strettamente collegato a quello dell’applicazione, in quanto, quando quest’ultima viene terminata, le tab vengono deallocate. Esse vengono
definite all’interno del file structure.coffee, attraverso uno speciale array. La
definizione di un tab ha tre proprietà, ovvero:
•
•
•
title;
id;
location.
Nel file structure.coffee avviene la dichiarazione di un array di tab. Tale
dichiarazione è riportata nel Listato 2.1.
tabs: [
{
title: "Index"
id: "index"
location: "example#getting-started"
}
]
Listato 2.1. Dichiarazione di un array di tab
Navigation Bar
La navigation bar è posizionata al di sopra del codice HTML. Dal momento che
essa è realizzata in maniera nativa, non sarà influenzata dai vari CSS presenti nè
dai contenuti. La navigation bar ha due funzioni principali, ovvero:
•
•
offre la possibilità di mostrare un titolo o dei pulsanti opzionali per la vista
corrente.
offre automaticamente dei pulsanti che permettono di spostarsi all’interno della
pila di navigazione.
La navigation bar viene creata in maniera dichiarativa all’interno del codice
HTML grazie all’utilizzo del tag <super-navbar>. Nello specifico, attraverso l’utilizzo del tag figlio <super-navbar-title>, è possibile impostare il titolo alla pagina
corrente. Un esempio è mostrato nel Listato 2.2:
<super-navbar>
<super-navbar-title>
Titolo
</super-navbar-title>
</super-navbar>
Listato 2.2. Dichiarazione di una navigation bar
Drawer Menu
Un drawer è un container che si trova, in genere, sulla parte sinistra della view e può
essere richiamato facendo scorrere lo schermo tramite opportune gesture o utilizzando le API di Supersonic. Nel maggior parte dei casi questo oggetto grafico nativo
2.4 AppGyver
35
viene utilizzato per realizzare il “side menu”, ovvero un menu che per impostazione
predefinita, rimane nascosto fino a quando non vi è necessità di usarlo, come, ad
esempio, per accedere ad un’altra view.
La view del drawer può visualizzare codice HTML come qualsiasi altra view.
Quest’oggetto risponde alle interazioni dell’utente con la view proprio come un
drawer nativo, cosı̀ da favorire la sua apertura e la sua chiusura.
Definizione del drawer menu
I drawer vengono definiti all’interno del file /config/structure.coffee prima
di essere utilizzati all’interno dell’applicazione. Per potere abilitare un drawer, si
definisce un oggetto drawer con le seguenti tre proprietà:
•
•
•
left: per la definizione del drawer a sinistra;
right: per la definizione del drawer a destra;
location: per la definizione della configurazione condivisa dei drawer, come, ad
esempio l’animazione da utilizzare per la loro visualizzazione.
Nel Listato 2.3 possiamo osservare il codice necessario per la creazione di un
drawer menu:
drawers:
left:
id: "leftDrawer"
location: "example#drawer"
showOnAppLoad: false
options:
animation: "swingingDoor"
Listato 2.3. Dichiarazione di un drawer menu
Le proprietà left e right definiscono la posizione in cui sarà visualizzato il
drawer menu. Esse, a loro volta, possiedono a sua volta altre tre proprietà, ovvero:
•
•
•
id: utilizzata per associare un identificativo univoco al drawer in modo da poterlo
richiamare all’interno di altre web view.
location: rappresenta la view a cui riferisce la voce del drawer menù corrispondente.
showAppLoad: determina se il drawer menu dovrebbe essere visibile sullo schermo
quando l’applicazione si avvia. Tale proprietà può essere usata ad esempio per
creare un menù fisso laterale per l’applicazione.
Supersonic Native API Bridge
Per poter far comunicare le Web Views scritte in HTML5 e il codice nativo, è
necessario che ci sia un “API bridge”, che gestisca tale comunicazione. Il ponte
nativo lavora in maniera asincrona. La chiamata API viene attivata e passata al
gestore “native-side”, che si occuperà di attivare una callback appropriata.
Supersonic riesce, inoltre, a migliorare tale meccanismo avvolgendo le stesse API
JavaScript nelle cosı̀ddette “promises”. Una promise è un oggetto proxy per un
evento che non è necessariamente ancora avvenuto. Una funzione callback relativa
al successo o al fallimento può essere assegnata ad una promise e, una volta che la
promise si risolve o viene rifiutata, il callback corrispondente viene chiamato.
36
2 Tecnologie ibride di seconda generazione: AppGyver
La funzionalità di base del ponte nativo è dimostrata tramite la funzione
supersonic.debug.ping, che restituisce, semplicemente, una stringa “Pong!”.
Architettura di un progetto Supersonic
In questa sezione verrà descritta in modo dettagliato la struttura di un progetto
Supersonic; allo stesso tempo verranno introdotti altri concetti importanti, come
l’architettura MVC e il concetto di vista parziale.
Nella Figura 2.14 si osserva la struttura di un progetto Supersonic di default, nel
quale sono presenti una serie di directory differenti. In particolare saremo interessati
alle directory /app e /config.
•
•
/app presenta, al proprio interno, tutto il contenuto dell’applicazione creato. Ciò
significa che tutti i file HTML, CSS e script saranno in tale cartella.
/config presenta, al proprio interno, file speciali per la configurazione e la definizione del comportamento dell’applicazione. Tali file includono la definizione
delle operazioni iniziali, la configurazione per il comportamento predefinito e il
codice per abilitare e disabilitare lo scroll per tutte le view dell’app.
Figura 2.14. L’architettura delle directory di un progetto Supersonic
Le restanti cartelle contengono dipendenze di terze parti richiesti dal framework
e varie altre cose. La cartella /dist non esiste in un progetto completamente nuovo,
viene creato solo una volta nel momento in cui l’applicazione viene compilata.
Architettura MVC
Le applicazioni Supersonic utilizzano di default il pattern MVC; ciò significa che
l’interfaccia utente (View), la logica (Controller) e il modello dei dati (model) sono tenuti separati l’uno dall’altro, con ognuno la propria area di responsabilità
nel gestire le funzionalità dell’applicazione. Utilizzando il pattern MVC si riesce a
promuovere la leggibilità del codice e il suo riutilizzo.
Le responsabilità di base dei diversi componenti MVC sono di seguito elencate:
•
Model: gestisce gli oggetti di dati di uno specifico modulo. Ciò significa che un
model non ha influenza diretta sulla User Interface dell’applicazione o sulla sua
logica, ma può essere “osservato” dagli altri componenti del pattern. In progetti
Supersonic il model sarà generalmente fornito da Supersonic Data (l’oggetto
$scope di Angular).
2.4 AppGyver
•
•
37
View: altro non è che il componente del modulo rivolto verso l’esterno e che fornisce l’interfaccia attraverso la quale gli utenti possono interagire con l’applicazione. Una View, generalmente, gestisce gli input forniti dall’utente e visualizza
i corrispettivi risultati.
Controller: rappresenta il collante tra la view e il model e contiene la maggior
parte della logica dell’applicazione. Esso è responsabile dell’aggiornamento di
una view in seguito alla modifica di un model, nonchè dell’aggiornamento del
model in base all’input fornito dall’utente.
Le viste parziali
Qualsiasi file HTML che viene creato in un progetto Supersonic, per esempio
/applicazione/views/index.html, non è un documento HTML completo; al suo
interno viene dichiarato solo un elemento <div> che si lega ad un controller mediante
l’attributo ng-controller. Tale aspetto è noto come vista parziale. Per rendere il
documento HTML valido, è necessario collegarlo ad un file speciale, detto di layout,
che, al suo interno, conterrà tutte le dichiarazioni mancanti.
Quando una specifica applicazione viene compilata, il CLI di Steroids cerca
il file layout.html nel modulo di riferimento e completa la vista parziale per la
visualizzazione della pagina HTML.
Il file layout.html specifica gli script e i fogli di stile che devono essere abbinati ad una specifica vista parziale. Esso presenta, anche, una logica speciale per
l’integrazione di Angualar.
Alcune differenze con Ionic
Il framework Supersonic presenta una serie di differenze con il framework Ionic.
Quest’ultimo viene eseguito all’interno di un’unica Web View, dove tutto viene
“renderizzato” tramite CSS. La navigazione, i menu laterali e tutte le schede sono
implementate tramite direttive AngularJS; in questo modo, se si verifica una condizione per la quale vi è la necessità di modifcare la struttura del DOM, basterà
modificare il Controller.
Supersonic, invece, sfrutta lo stack nativo di navigazione per includere più Web
View che rappresentano documenti HTML diversi, come, ad esempio, index.html
e show.html. Ciò significa che, passando da una view a quella successiva, quella
principale rimane ancora allocata e presente al livello inferiore dello stack, mentre
la nuova view si trova in cima alla pila e viene animata sullo schermo del dispositivo.
Grazie all’utilizzo di tale stack di navigazione non vi è la necessità di specificare i
percorsi espliciti.
Inoltre, Supersonic include componenti nativi dell’interfaccia utente utilizzando
i web component, riuscendo a mantenere la loro posizione originale senza dover
necessariamente creare un container che includa la logica applicativa necessaria a
realizzarli.
Supersonic sfrutta il tool Steroids di AppGyver, che fornisce emulatori Android
e iOS facilitando il debbugging, il logging cross-platform che permette la creazione
stand-alone dell’APK e dell’IPA senza la necessità di utilizzare Android Studio e
XCode.
38
2 Tecnologie ibride di seconda generazione: AppGyver
La comunity di AppGyver fornisce un elenco (Figura 2.15) in cui sono presenti
le principali differenze tecniche tra i due framework.
Figura 2.15. Le principali differenze tra Supersonic e Ionic
AngularJS e Supersonic
Supersonic utilizza AngularJS come impostazione predefinita per garantire all’applicazione una struttura basata sul pattern MVC. Ogni view all’interno di
un modulo dichiara un Controller che ne gestisce la logica. Ad esempio nel file
index.html, la View verrà associata al proprio Controller mediante l’istruzione:
<div ng-controller=‘‘IndexController’’>
Il Controller è realizzato all’interno di un file JavaScript mediante l’istruzione
riportata nel Listato 2.4.
angular
.module(’superhero’)
.controller("IndexController", function($scope, Superhero) {
!!logica!!
});
Listato 2.4. Istruzione per la realizzazione di un Controller
In questo caso, la dipendenza “Superhero” viene iniettata all’interno del Controller.
2.4 AppGyver
39
2.4.4 AngularJS
AngularJS è un framework JavaScript client-side di ultima generazione rilasciato
per la prima volta nel 2012, per lo sviluppo di applicazioni Web client-side. Esso si
basa su un’infrastruttura che incoraggia l’organizzazione del codice e la separazione
dei compiti nei vari componenti. Ciascun componente del framework opera con tutti
gli altri in maniera interconnessa garantendo alte performance.
AngularJS si basa principalmente sul pattern MVC, risultando totalmente
estendibile. Esso, pertanto, non necessità di altre librerie.
AngularJS può anche essere visto come un’infrastruttura per la creazione di
applicazioni, composta da un insieme di funzionalità. Esso potenzia l’approccio
dichiarativo dell’HTML nella definizione dell’interfaccia grafica fornendo strumenti
per la costruzione di un’architettura modulare.
Essendo basato su codice JavaScript puro, AngularJS è perfetto per creare Single
Page Application, cioè applicazioni le cui risorse vengono caricate dinamicamente
su richiesta, senza necessità di ricaricare l’intera pagina. Per fare ciò, AngularJS
richiede solo linguaggi client-side come HTML, CSS e JavaScript.
Funzionalità principali
AngularJS è un framework avanzato che possiede funzionalità di rilievo utili non
solo per gli sviluppatori ma anche per i designer. Le principali funzionalità che
permettono di sfruttare al meglio questo strumento di sviluppo sono:
•
•
•
•
•
•
•
il binding bidirezionale (two-way binding);
la dependency injection;
il supporto al pattern MVC;
il supporto ai moduli;
la separazione delle competenze;
la testabilità del codice;
la riusabilità dei componenti.
Essendo AngularJS un framework, esso ha una sua infrastruttura ed un suo modello di esecuzione all’interno del quale viene inserito il codice scritto dal programmatore. Il suo funzionamento generale prevede una serie di fasi. La prima riguarda
il caricamento del framework. Il passo successivo riguarda la creazione dell’oggetto
globale angular e l’avvio del cosiddetto bootstrap, cioè il processo di inizializzazione del framework e di analisi dell’applicazione. In questa fase, AngularJS scandisce
il codice HTML della pagina corrente alla ricerca della direttiva ng-app che individua la root della nostra applicazione. Tutti gli elementi figli dell’elemento marcato
con ng-app verranno analizzati da AngularJS alla ricerca di direttive ed espressioni da valutare. Al termine di queste inizializzazioni, Angular rimane in attesa del
verificarsi di un evento.
AngularJS basa la propria logica di funzionamento sul design pattern MVC
(Model-View-Controller) e, dunque, segue il principio di separazione delle competenze.
3
Funzionalità e Mockup
Questo capitolo fornisce una descrizione dettagliata delle funzionalità che riguardano sia l’applicazione che il server. Verranno illustrati, inoltre, sia i mockup di
primo livello che quelli di secondo livello.
3.1 Funzionalità del sistema
Come conseguenza dell’analisi dei requisiti e dello studio di fattibilità descritti nei
capitoli precedenti, è stato possibile stilare l’elenco delle funzionalità che, una volta
realizzate, daranno vita al sistema EnjoyRC.
Il sistema da realizzare presenterà una struttura ben definita, derivante da
una suddivisione in macro blocchi; ciacuno di questi rappresenterà una specifica
area tematica e racchiuderà un insieme più o meno complesso di funzionalità che
riguarderanno sia la componente mobile che la quella server.
3.1.1 Funzionalità relative alla Mobile Application
Le funzionalità che verrano descritte nella presente sezione riguarderanno esclusivamente quelle necessarie a realizzare la componente client-side del sistema. Nello
specifico, esse avranno il compito di prelevare i dati memorizzati sul server, utilizzarli
come base per la creazione dell’interfaccia e, infine, renderli usufruibili dall’utente.
Allo stesso tempo, si farà una distinzione tra funzionalità verticali e funzionalità
orizzontali.
Funzionalità orizzontali
Le funzionalità orizzontali rappresentano tutti quegli aspetti che prevedono un flusso
logico indipendente rispetto agli altri task del sistema. Di seguito riportiamo tutte
le funzionalità orizzontali relative alla componente client-side del sistema:
•
•
•
realizzazione della Home Page;
realizzazione del Drawer Menu;
realizzazione dell’area relativa ai punti di interesse;
42
•
•
•
•
•
•
•
•
3 Funzionalità e Mockup
realizzazione
realizzazione
realizzazione
realizzazione
realizzazione
realizzazione
realizzazione
realizzazione
dell’area
dell’area
dell’area
dell’area
dell’area
dell’area
dell’area
dell’area
relativa
relativa
relativa
relativa
relativa
relativa
relativa
relativa
alle ristorazioni;
ai pernottamenti;
agli svaghi;
ai servizi primari;
ai percorsi turistici statici;
alle informazioni di base riguardanti la città;
agli eventi;
alla ricerca dei contenuti.
Nel seguito esamineremo più nel dettaglio ciascuna di queste funzionalità.
Realizzazione della Home Page
La Home Page rappresenta, per l’utente, la pagina di accesso ai vari contenuti del
sistema. Tramite la visualizzazione di un opportuno menu, essa permetterà di accedere a tutte le aree nelle quali l’applicazione mobile è suddivisa. Per la realizzazione
della Home Page sarà necessario prevedere l’interazione della componente clientside con il server di supporto, nel quale risiedono le informazioni utili alla creazione
delle voci di menu. Al suo interno verrà, inoltre, integrata una Navigation Bar con
lo scopo di gestire le seguenti problematiche:
•
•
•
accesso al Drawer Menu;
accesso all’area relativa alla ricerca dei contenuti;
gestione del flusso di navigazione attraverso la creazione di uno stack di view.
Realizzazione del Drawer Menu
Il Drawer Menu è un pannello a scorrimento che permetterà all’utente di accedere a
quelle aree dell’applicazione che contengono le informazioni generali. Nello specifico,
le voci di menu che esso dovrà contenere sono le seguenti:
•
•
•
•
Credits: permetterà all’utente di accedere all’area nella quale sono contenute le informazioni relative a coloro che hanno contribuito alla realizzazione
dell’applicazione.
Manual: questa voce di menù dovrà permettere l’accesso all’area relativo al
manuale utente. Questa conterrà le descrizione delle varie aree dell’applicazione.
Rate EnjoyRC: questa voce di menù permetterà all’utente di accedere alla
sezione del market-place relativa al rilascio delle recensioni e alle votazioni.
Exit: questa voce di menù permetterà di uscire dall’applicazione.
Realizzazione dell’area relativa ai punti di interesse
L’area relativa ai punti di interesse dovrà essere realizzata mediante una serie di
funzionalità che creeranno una struttura di navigazione sui più livelli. Ad ogni livello
dovrà essere prevista l’interazione tra la componente client-side e il server. In queste
fasi verranno prelevati i dati relativi alla categorizzazione dei punti di interesse e
al loro dettaglio; allo stesso tempo si gestirà l’organizzazione dei contenuti e la loro
rappresentazione personalizzata in base al livello di riferimento.
3.1 Funzionalità del sistema
43
Realizzazione dell’area relativa alle ristorazioni, ai pernottamenti e agli svaghi
Per la realizzazione delle aree relative alle attività commerciali, quali ristorazioni,
pernottamenti e svaghi, è risultato necessario realizzare un insieme di funzioni tra
loro eterogenee che, nel complesso, permettono l’interscambio di dati tra il server e
la componente client-side, con lo scopo di creare una gerarchia di view che comporrà
la struttura di navigazione.
Tale distribuzione dovrà permettere di categorizzare i contenuti sul primo livello
della gerarchia, fino ad arrivare ad un ultimo livello di dettaglio relativo all’elemento
scelto (ovvero, una ristorazione, un punto di pernottamento o uno svago), in cui dovranno essere visualizzate tutte le informazioni indispensabili che lo caratterizzano.
In quest’ultimo livello ricoprono un ruolo fondamentale le informazioni relative ai
servizi offerti dalla specifica attività.
Realizzazione dell’area relativa ai servizi primari
Le funzionalità legate alla realizzazione dell’area relativa ai servizi primari permettono, tramite l’utilizzo dei Web Service offerti dalla componente server-side del
sistema, di effettuare una doppia categorizzazione degli elementi appartenenti a differenti contesti di riferimento. A differenza delle precedenti aree descritte, quella in
questione non prevede un livello di dettaglio per il singolo servizio. L’ultimo livello
sarà costituito da una lista contenente tutte le informazioni in maniera sintetica ma
esaustiva.
Realizzazione dell’area relativa ai percorsi turistici statici
Le funzionalità relative alla realizzazione di quest’area dovranno essere tali da permettere all’utente di ricevere quante più informazioni possibili riguardanti gli itinerari turistici offerti dalla città. Anche in questo caso, l’utilizzo dei servizi dispensati dalla componente server-side permetterà di associare una tassonomia alle
informazioni da visualizzare.
Rispetto all’architettura a livelli, descritta nelle sezioni precedenti, quella dei
percorsi turistici statici presenterà un ulteriore livello di dettaglio nel quale verrà
descritta ogni singola tratta in cui un dato percorso è suddiviso. Tra le funzionalità presenti saranno utilizzate quelle relative ai servizi di Google Map. Esse
permetteranno di visualizzare su mappa l’intero itinerario da percorrere, aggiungendo informazioni di geolocalizzazione, che faciliteranno l’utente ad orientarsi per
intraprendere il percorso scelto.
Realizzazione dell’area relativa alle informazioni di base riguardanti la città
Le funzionalità necessarie per la realizzazione dell’area contenente le informazioni
di base della città dovranno essere tali da garantire la creazione di una Home Page
dalla quale partirà un flusso di navigazione secondario. La Home Page secondaria
sarà costituita da un opportuno menu con struttura a tile; ciascun tile permetterà l’accesso ad un specifica sezione. Di seguito sono elencate e descritte le aree
accessibili da questa sezione:
44
•
•
•
•
3 Funzionalità e Mockup
Come arrivarci: in tale sezione saranno riportate le informazioni utili a raggiungere la città di Reggio Calabria, sfruttando le funzionalità offerte da Google
Maps;
Come visitarla: in tale sezione verranno elencate le modalità con le quali è
possibile spostarsi in città;
Negozi di prodotti tipici: in tale sezione verrà contenuta una lista con le informazioni relative ai negozi di prodotti tipici presenti sul territorio;
Tradizioni: in tale sezione saranno elencate e descritte le principali tradizioni
reggine.
Realizzazione dell’area relativa agli eventi
Le funzionalità necessarie alla realizzazione di quest’area dovranno consentire ad
un utente di entrare a conoscenza delle informazioni relative agli eventi organizzati
nella città di Reggio Calabria. La lista degli eventi visualizzati dovrà essere opportunamente ordinata in modo da sponsorizzare maggiormente quelli più prossimi
alla data corrente. Per facilitarne la consultazione, gli eventi saranno organizzati
secondo una specifica tassonomia; inoltre, per ogni singolo evento, in aggiunta alle
informazioni di carattere generale, sarà fornita la locandina corrispondente.
Realizzazione dell’area relativa alla ricerca dei contenuti
Attraverso questo requisito funzionale, un utente, dovrà poter effettuare una ricerca
tra tutti i contenuti disponibili per individuare quelli capaci di soddisfare le proprie
esigenze. I risultati della ricerca verranno organizzati in una opportuna lista, la quale permetterà di accedere ad uno specifico elemento; in questo modo l’utente verrà
reindirizzato alla corrispondente pagina di dettaglio e potrà consultare le informazioni presenti. Tali funzionalità saranno realizzate in modo tale da non far gravare
le operazioni di ricerca sulla componente mobile ma solo sul server. Le operazioni da
gestire lato client saranno l’invio delle chiavi di ricerca (ed eventualmente l’aggiunta
di opportuni filtri) e la ricezione e l’organizzazione dei risultati.
Il sistema garantirà due modalità differenti per effettuare la ricerca dei contenuti:
•
•
ricerca generica dei contenuti; tale modalità utilizzerà un unico parametro per
ricercare i contenuti su tutto il set di dati del sistema;
ricerca personalizzata dei contenuti; tale modalità offrirà all’utente la possibilità
di inserire più parametri per effettuare la ricerca dei contenuti, specificando il
contesto di interesse e impostando una serie di filtri.
Funzionalità verticali
Le funzionalità verticali saranno quelle utilizzate per realizzare gli aspetti comuni
ai task del sistema. Esse verranno utilizzate per creare una sorta di struttura di
supporto per le funzionalità relative alle singole macro-aree gia descritte nei paragrafi precedenti. Il loro scopo sarà quello di dividere la logica applicativa, necessaria
alla realizzazione delle aree del sistema, con la gestione di aspetti generali che non
riguardano la logica di business. Tali funzionalità non sono quindi associabili ad
una specifica macro-area ma sono utilizzate in maniera indiscriminata e a volte
trasparente in tutte le sezioni dell’applicazione.
Di seguito sono elencate le funzionalità verticali:
3.1 Funzionalità del sistema
•
•
•
•
45
Gestione del “multi-lingua”: tale funzionalità avrà l’obiettivo di gestire le operazioni di globalizzazione. Esse permettono di ottenere informazioni legate alla
lingua, al fuso orario e alla località geografica in cui l’utente si trova. Tali informazioni verranno utilizzate all’interno della libreria dei servizi in modo da
comunicare al server in che lingua dovranno essere restituiti i contenuti.
Integrazione dei servizi di Google Map: le funzionalità legate ai servizi di Google
Map risulteranno essere di fondamentale importanza per il sistema da realizzare;
esse ci permetteranno di creare una libreria interna che fornirà, oltre agli strumenti necessari per la visualizzazione di un percorso turistico su mappa, anche
un supporto alla navigazione mediante opportune indicazioni.
Gestione del caching dei dati: tale funzionalità permetterà di memorizzare temporaneamente in locale i contenuti prelevati dal server; in questo modo si renderanno disponibili in maniera più rapida, i dati da visualizzare e si ridurranno
le richieste HTTP, ottimizzando le prestazioni e il consumo di banda.
Gestione della connessione alla rete: tale funzionalità ci permetterà di verificare
se il dispositivo mobile sia o meno interconnesso con la rete. In caso di riscontro
negativo ogni comunicazione con il server verrà inibita e verrà opportunamente
comunicato all’utente che, per usufruire dei servizi, sarà necessario attivare una
connessione.
3.1.2 Funzionalità relative alla Web Application
In questa sezione verranno descritte le funzionalità legate alla componente serverside del sistema. Nel complesso, esse formeranno un’infrastruttura in grado di gestire
i contenuti e, nello stesso tempo, di collegare l’applicazione mobile con la base di dati
sottostante. Per favorire una descrizione più chiara ed esaustiva, possiamo dividere
le funzionalità nella seguente tassonomia:
•
•
•
•
funzionalità
funzionalità
funzionalità
funzionalità
CRUD;
legate alla realizzazione dei Web Service;
legate all’integrazione dei servizi di Google Map;
legate alla gestione delle immagini.
Esse verranno descritte in dettaglio nelle prossime sottosezioni.
Funzionalità CRUD
Tali funzionalità permetteranno la gestione e la manipolazione dei contenuti relativi
a quelle specifiche tabelle che rappresentano la realtà di interesse; nello specifico il
sistema dovrà:
•
•
•
•
•
fornire un modulo di autenticazione per gli amministratori;
permettere all’amministratore di inserire i dati relativi ad un punto di interesse;
permettere all’amministratore di visualizzare la lista dei punti di interesse;
permettere la modifica e la cancellazione di un punto di interesse;
permettere all’amministratore di inserire i dati relativi ad un punto di ristorazione, di pernottamento e di svago;
46
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
3 Funzionalità e Mockup
permettere all’amministratore di visualizzare la lista dei punti di ristorazioni,
dipernottamento e degli svagho;
permettere la modifica e la cancellazione di un punto di ristorazione, di pernottamento o di svago;
permettere all’amministratore di inserire un percorso turistico statico;
permettere la modifica e la cancellazione di un way point;
permettere all’amministratore di visualizzare la lista dei percorsi turistici;
permettere all’amministratore di visualizzare la lista delle tratte;
permettere la modifica e la cancellazione di un percorso turistico statico;
permettere la modifica e la cancellazione di un way point;
permettere all’amministratore di inserire i dati relativi ad un servizio primario;
permettere all’amministratore di visualizzare la lista dei servizi primari;
permettere la modifica e la cancellazione di un servizio primario;
permettere all’amministratore di inserire i dati relativi ad un negozio di prodotti
tipici;
permettere all’amministratore di visualizzare la lista dei negozi di prodotti tipici;
permettere la modifica e la cancellazione di un negozio di prodotti tipici;
permettere all’amministratore di inserire i dati relativi ad una tradizione;
permettere all’amministratore di visualizzare la lista delle tradizioni;
permettere la modifica e la cancellazione dei dati relativi ad una tradizione;
permettere all’amministratore di inserire i dati relativi ad un evento;
permettere all’amministratore di visualizzare la lista degli eventi;
permettere la modifica e la cancellazione di un evento;
permettere all’amministratore di inserire i dati relativi al manuale utente;
permettere all’amministratore di visualizzare le informazioni contenute nel manuale utente;
permettere la modifica e la cancellazione delle informazioni contenute nel manuale utente;
permettere all’amministratore di inserire una nuovo elemento nella Home Page
dell’applicazione mobile;
permettere all’amministratore di visualizzare gli elementi della Home Page
dell’applicazione mobile;
permettere la modifica e la cancellazione di un un elemento della Home Page
dell’applicazione mobile;
permettere all’amministratore di inserire una nuovo elemento nel Drawer Menu
dell’applicazione mobile;
permettere all’amministratore di visualizzare gli elementi del Drawer Menu
dell’applicazione mobile;
permettere la modifica e la cancellazione di un un elemento del Drawer Menu
dell’applicazione mobile;
permettere di effettuare una ricerca all’interno dei contenuti del database.
Funzionalità legate alla realizzazione dei Web Service
Le funzionalità relative ai Web Service permetteranno di esporre i dati che verranno visualizzati dall’applicazione. Per la realizzazione di ciascun Web Service sarà
necessario fornire al sistema un insieme di parametri che permetteranno di filtrare
3.2 Mockup
47
opportunamente la richiesta e di conoscere la lingua nella quale dovranno essere
restituiti i contenuti. L’architettura utilizzata per la realizzazione dei servivi sarà
un’architettura “RESTful”, in quanto per accedere alla risorsa, bisognerà conoscerne
la locazione specifica senza l’utilizzo di nessuna interfaccia.
Funzionalità legate all’integrazione dei servizi di Google Map
Per agevolare la creazione di un percorso turistico e per automatizzare il processo di
recupero delle informazioni legate alla posizione geografica di tutti gli elementi che
la richiedono, risulterà utile usufruire di alcune API fornite da Google Map. L’integrazione di tali librerie risulta essere fondamentale in quanto eviterà l’inserimento
di informazioni errate.
Nello specifico, per quanto riguarda i percorsi turistici, tutte le informazioni
estrapolate grazie all’utilizzo di tali librerie verranno memorizzate e messe a disposizione dell’applicazione mobile, dispensandola dall’effettuare operazioni troppo
onerose.
Funzionalità legate alla gestione delle immagini
Il sistema dovrà prevedere una serie di funzionalità che forniranno un supporto
al caricamento di un’immagine; tale operazione risulterà essere verticale rispetto a
quelle descritte in precedenza. Nel dettaglio, essa permetterà di memorizzare un’immagine all’interno di una specifica cartella situata all’interno del server, gestendone
il ridimensionamento e l’estensione. Tutte queste funzionalità dovranno essere rese
disponibili all’interno di un’opportuna libreria.
3.2 Mockup
Questa sezione descriverà i mockup di primo e di secondo livello che ci consentiranno
di illustrate in dettaglio le principali funzionalità fornite dall’applicazione EnjoyRC.
Un mockup è una rappresentazione statica del progetto finale dalla qualità medioalta; di solito è un progetto grafico molto dettagliato, a volte coincidente con il
progetto finale vero e proprio.
Un mockup ben realizzato ha la funzione di:
•
•
•
rappresentare nel dettaglio i vari contenuti;
rappresentare le funzionalità di base in maniera statica;
illustrare il lato grafico del progetto.
Di seguito verranno descritti i mockup che rappresenteranno i vari macro-blocchi
del sistema.
3.2.1 Mockup relativo alla Home Page e al Drawer Menu
La Home Page rappresenta la pagina più importante dell’intera applicazione in
quanto è la prima pagina con la quale l’utente si interfaccia. Si è scelto di realizzare
48
3 Funzionalità e Mockup
una Home Page semplice ed intuitiva che, come le altre parti dell’applicazione,
seguirà le regole dello User Experience Design. La Home Page sarà caratterizzata
da una barra di navigazione superiore con l’accesso al Drawer Menu sulla sinistra
e all’area di ricerca sulla destra. Al centro sarà messo in evidenza il logo ufficiale
dell’applicazione. Il corpo centrale sarà costituito da un massimo di 8 icone che
permetteranno ad un utente di accedere alle varie sezioni dell’applicazione. Queste
ultime rappresentano i vari macro-blocchi di cui sopra. Tali macro-aree sono:
•
•
•
•
•
•
•
•
Punti di interesse;
Ristorazione;
Pernottamento;
Percorsi;
Servizi Primari;
Svaghi;
La città;
Eventi.
Nelle Figure 3.1 e 3.2 vengono mostrati, rispettivamente, i mockup di primo e
di secondo livello relativi alla Home Page e al Drawer Menu.
Figura 3.1. Il mockup di primo livello relativo alla Home Page e al Drawer Menu
3.2.2 Mockup relativo alla sezione “Ricerca”
La pagina relativa alla funzionalità di ricerca risulterà divisa in due aree distinte. La
prima, in alto, permetterà all’utente di effettuare una ricerca generica all’interno dei
3.2 Mockup
49
Figura 3.2. Il mockup di secondo livello relativo alla Home Page e al Drawer Menu, con
relative “gesture”
contenuti dell’applicazione; la seconda, in basso, consentirà all’utente di ricercare
un’informazione applicando dei filtri prestabiliti. In questa seconda modalità di
ricerca si potrà scegliere uno specifico ambito (ristorazione, pernottamento, etc.) ed
accedere ad un secondo livello di ricerca più dettagliato, in cui si potranno definire
i valori di alcuni parametri.
Nelle Figure 7.4 e 7.5 vengoo mostrati, rispettivamente, i mockup di primo e di
secondo livello relativi alla sezione di ricerca.
3.2.3 Mockup relativi alla sezione “Punti di interesse”
Il macro-blocco relativo ai punti di interesse permetterà all’utente di consultare una
lista completa dei principali luoghi e delle principali attrattive di interesse turistico.
Tale sezione prevede una tassonomia in cui saranno divisi i vari punti. Il secondo
livello mostra la lista dei punti di interesse associata ad una particolare tipologia;
per ciascun punto vengono mostratati un’anteprima dell’immagine, il nome e la
locazione.
Il dettaglio consiste in un’immagine del punto in questione, nel nome esteso,
nella locazione, una breve descrizione, e infine, grazie al supporto di una mappa
(mostrata nell’ultimo livello), le informazioni che permettono di raggiungerlo.
Nelle Figure 3.5 e 3.6 vengono mostrati, rispettivamente, i mockup di primo e
di secondo livello relativi alla sezione “Punti di interesse”.
50
3 Funzionalità e Mockup
Figura 3.3. Il mockup di primo livello relativo alla sezione “Ricerca”
Figura 3.4. Il mockup di secondo livello relativo alla sezione “Ricerca”, con relative
“gesture”
3.2 Mockup
51
Figura 3.5. Il mockup di primo livello relativo alla sezione “Punti di interesse”
Figura 3.6. Il mockup di secondo livello relativo alla sezione “Punti di interesse”, con
relative “gesture”
3.2.4 Mockup relativi alla sezione “Ristorazione”
Nel momento in cui l’utente sceglie di accedere alla sezione “Ristorazione”, egli si
ritroverà di fronte tutte le possibili categorie (pizzerie, ristoranti, bar e gelaterie,
etc.) tra le quali effettuare la propria scelta. Passando al secondo livello di dettaglio,
ipotizzando di aver selezionato la categoria “Pizzeria”, egli potrà consultare l’elenco
completo delle pizzerie salvate sul database. La pagina di dettaglio prevede il nome
del locale in alto, un’immagine caratteristica dello stesso e, ovviamente, tutte le
informazioni di base, presentate in un listato a cascata.
Due aspetti meritano di essere sottolineati; il primo è la presenza di alcune icone
al di sotto dell’immagine, che indicano i servizi usufruibili in quello specifico locale;
il secondo è la possibilità, mediante il pulsante “Go-To”, di usufruire delle mappe
per ottenere indicazioni stradali utili e, quindi, la visualizzazione della localizzazione
dell’esercizio.
Nelle Figure 3.7 e 3.8 vengono mostrati, rispettivamente, i mockup di primo e
di secondo livello relativi alla sezione “Ristorazione”.
52
3 Funzionalità e Mockup
Figura 3.7. Il mockup di primo livello relativo alla sezione “Ristorazione”
Figura 3.8. Il mockup di secondo livello relativo alla sezione “Ristorazione”, con relative
“gesture”
3.2 Mockup
53
3.2.5 Mockup relativi alla sezione “Percorsi turistici”
Il macro-blocco dei percorsi turistici raccoglie una lista di percorsi “statici”, scelti
a priori, che l’utilizzatore del sistema può consultare ed, eventualmente, provare.
Tali percorsi saranno organizzati secondo una tassonomia prestabilita. Essa sarà
mostrata tramite una prima lista che presenta la tipologia dei percorsi; cliccando su
una riga si potrà accedere ad una seconda lista contenente i percorsi corrispondenti.
Selezionando, a sua volta, un elemento di questa seconda lista si accederà all’area
relativa al dettaglio del percorso prescelto.
Il dettaglio di un percorso sarà formato da una mappa che conterrà il punto di
inizio e di fine, la lista dei vari tratti, un’indicazione relativa al punto di partenza
consigliato (con la possibilità di ricavare, tramite mappa, le informazioni utili per
raggiungerlo) e una breve descrizione.
Un altro livello di dettaglio è stato aggiunto per descrivere ciascuna tratta del
percorso. La singola tratta, a sua volta, sarà composta da una mappa con il punto
di inizio e di fine, la durata in Km, nonchè una breve descrizione.
Nelle Figure 3.9 e 3.10 vengono mostrati, rispettivamente, i mockup di primo e
di secondo livello relativi alla sezione “Percorsi turistici”.
Figura 3.9. Il mockup di primo livello relativo alla sezione “Percorsi turistici”
3.2.6 Mockup relativi alla sezione “Svaghi”
La sezione “Svaghi” presenta una struttura simile a quella della sezione “Ristorazione”. Anche il mockup di riferimento risulta essere simile a quello descritto in
precedenza. Saranno presenti il nome dell’attività selezionata, la sua immagine di
riferimento, le informazioni basilari (orario, fascia di prezzo, sito Internet e descrizione), nonché le icone dei servizi offerti, nonchè ( qualora lo si voglia) le indicazioni
stradali per raggiungere l’attività selezionata.
Nelle Figure 7.15 e 3.12 vengono mostrati, rispettivamente, i mockup di primo
e di secondo livello relativi alla sezione “Svaghi”.
54
3 Funzionalità e Mockup
Figura 3.10. Il mockup di secondo livello relativo alla sezione “Percorsi turistici” con
relative gesture.
Figura 3.11. Il mockup di primo livello relativo alla sezione “Svaghi”
3.2.7 Mockup relativi alla sezione “Eventi”
La sezione “Eventi” dell’applicazione sarà costituita da tre livelli di dettaglio e,
quindi, rappresentata da tre differenti tipologie di pagine. La pagina principale avrà
una struttura abbastanza semplice in cui verrà visualizzata una classificazione degli
eventi (culturale, musica e spettacolo, sport, etc.). Cliccando sull’apposito pulsante,
l’utente sarà reindirizzato alla pagina di secondo livello nella quale potrà visualizzare
tutti gli eventi legati all’ambito scelto e consultare alcune informazioni di base.
Sarà, inoltre, possibile accedere ai dettagli dell’evento, visualizzando la locandina,
gli orari, le date, il luogo e la descrizione.
Nelle Figure 3.13 viene mostrato il mockup di secondo livello relativo alla sezione
“Eventi”.
3.2.8 Mockup relativo alla sezione “La città”
Questo macro-blocco contiene le informazioni generali relative alla città di Reggio
Calabria. Nel primo livello verranno mostrate una breve descrizione della città e
3.2 Mockup
55
Figura 3.12. Il mockup di secondo livello relativo alla sezione “Svaghi” con relative
gesture.
Figura 3.13. Il mockup di secondo livello relativo alla sezione “Eventi”, con relative
“gesture”
56
3 Funzionalità e Mockup
una lista per consultare varie informazioni più nel dettaglio. Tra queste abbiamo:
•
•
•
•
Come si arriva;
Come visitarla;
Negozi prodotti tipici;
Tradizioni.
Cliccando su “Come si arriva” e su “Come visitarla” verranno mostrate tutte le
informazioni utili all’utente per raggiungere e visitare la città di Reggio Calabria; a
tal fine ci si avvale del supporto di opportune mappe.
Nelle Figura 7.25 viene mostrato il mockup di secondo livello relativo alla sezione
“La città”.
Figura 3.14. Il mockup di secondo livello relativo alla sezione “La città”, con relative
“gesture”
4
Progettazione delle funzionalità di base
Questo capitolo fornisce una descrizione dettagliata della fase di progettazione che
riguarda l’applicazione EnjoyRC. In particolare, verranno prese in considerazione
la struttura del client e la fase di progettazione della componente applicativa.
4.1 Architettura dell’applicazione
L’architettura generale della componente client-side del nostro sistema, denominato EnjoyRC, è mostrata nella Figura 4.1. Tale architettura evidenzia come sono
organizzati i contenuti e come è possibile navigare attraverso di essi.
Questa struttura gerarchica mostra come si estende il sistema a partire dalla
radice dell’albero, ovvero la Home Page, fino ad arrivare alle foglie, rappresentate dalle pagine di dettaglio. I vari colori corrispondono a flussi logici differenti e
ogni livello dell’albero evidenzia l’importanza ricoperta dalla pagina corrispondente
durante il flusso di lavoro dell’applicazione. Percorrendo l’albero da sinistra verso
destra, partendo dal nodo radice, incontreremo otto flussi logici differenti:
•
•
•
•
Punti di interesse: questo flusso di navigazione è formato dalla lista di categorie a
cui è associato almeno un punto di interesse, dalla lista dei contenuti organizzati
per categorie, dal dettaglio di un singolo punto e, infine, dalla mappa che indica
come raggiungerlo.
Punti di Ristorazione: questo flusso di navigazione è formato dalla lista di categorie a cui è associato almeno una punto di ristorazione, dalla lista dei contenuti
organizzati per categorie, dal dettaglio di un singolo punto e, infine, dalla mappa
che indica come raggiungerlo.
Punti di Pernottamento: questo flusso di navigazione è formato dalla lista di
categorie a cui è associato almeno un punto di pernottamento, dalla lista dei
contenuti organizzati per categorie, dal dettaglio di un singolo pernottamento,
e infine, dalla mappa che indica come raggiungerlo.
Percorsi turistici: questo flusso di navigazione è formato dalla lista di categorie a
cui è associato almeno un percorso turistico, dalla lista dei contenuti organizzati
per categorie, dal dettaglio di un singolo percorso, dal dettaglio delle tratte di
cui esso è composto e, infine, dalla mappa che indica come raggiungere il punto
di partenza.
58
4 Progettazione delle funzionalità di base
Figura 4.1. L’architettura dell’applicazione EnjoyRC
•
•
•
•
Servizi Primari: questo flusso di navigazione è formato dalla lista delle tipologie
di servizi a disposizione, dalle categorie dei servizi organizzate per tipo e, infine,
dalla lista dei contenuti organizzati per categorie.
Svaghi: questo flusso di navigazione è formato dalla lista di categorie a cui è associato almeno uno svago, dalla lista dei contenuti organizzati per categorie, dal
dettaglio di un singolo svago e, infine, dalla mappa che indica come raggiungerlo.
La città: questo flusso di navigazione porta ad una home page secondaria da cui
partono 4 task differenti, ovvero:
– Negozi di prodotti tipici: il nodo foglia di questo ramo è rappresentato dalla
pagina contenente la lista dei negozi di prodotti tipici.
– Tradizioni: il nodo foglia di questo ramo è rappresentato dalla pagina
contenente la lista delle tradizioni.
– Come arrivare in città: il nodo foglia di questo ramo è rappresentato da una
mappa che indica come arrivare in città.
– Come visitare la città: il nodo foglia di questo ramo è rappresentato da una
lista di informazioni inerenti a come muoversi all’interno della città.
Eventi: questo flusso di navigazione è formato dalla lista di categorie a cui è
4.2 Progettazione della componente applicativa
59
associato almeno un evento, dalla lista dei contenuti organizzati per categorie e,
infine, dal dettaglio di un singolo evento.
Percorrendo l’albero da destra verso sinistra, partendo dal nodo radice, incontreremo due ramificazioni differenti in cui i nodi di partenza sono “L’Area di ricerca”
e il “Drawer Menù”. Il primo si ramifica in due tipologie di ricerca e termina nella
pagina di dettaglio che mostra il risultato di queste due operazioni. Il secondo porta
a tre nodi foglia le cui view corrispondenti contengono informazioni di supporto
all’utilizzo del sistema.
4.2 Progettazione della componente applicativa
Per progettazione delle applicazioni si intende quella fase della progettazione di
un sistema informativo che si occupa di progettare l’insieme delle applicazioni o,
per meglio dire, dei gruppi di funzionalità di cui esso è composto. Questa fase di
progettazione non può che tenere fortemente in considerazione le metodologie e gli
strumenti tipici dell’Ingegneria del Software. In questo settore il meta-modello di
riferimento è UML. Esso, infatti, supporta in modo estremamente preciso e rigoroso
sia la progettazione orientata agli oggetti che la progettazione basata sui componenti, che rappresentano le tecniche di programmazione di gran lunga più utilizzate
attualmente nel contesto della produzione del software.
Utilizzando UML come meta-modello di riferimento, la progettazione della componente applicativa del sistema EnjoyRC può essere effettuata utilizzando i seguenti
diagrammi:
•
•
•
diagrammi dei casi d’uso;
diagrammi di attività;
diagrammi di sequenza.
4.2.1 Diagrammi dei casi d’uso
I diagrammi dei casi d’uso sono quei diagrammi dedicati alla descrizione delle funzioni o ai servizi offerti da un sistema o da una sua parte, cosı̀ come sono percepiti e
utilizzati dagli attori che interagiscono col sistema stesso. Esso permette di esprime
un comportamento, offerto o desiderato, sulla base dei suoi risultati osservabili. Esso
individua chi o che cosa ha a che fare con il sistema (attore) e che cosa viene fatto
(caso d’uso). Si tratta, tipicamente, del primo tipo di diagramma ad essere creato
in un processo o ciclo di sviluppo, nell’ambito dell’analisi dei requisiti. Il suo scopo
principale è quello di modellare i requisiti funzionali di un sistema. Per semplicità di
comprensione, si è preferito organizzare i diagrammi dei casi d’uso sulla base della
suddivisione in macro-blocchi del sistema.
Diagramma dei casi d’uso relativo alla sezione “Punti di interesse”
In Figura 4.2 viene mostrato il diagramma dei casi d’uso relativo al macro-blocco
“Punti di interesse”.
60
4 Progettazione delle funzionalità di base
Figura 4.2. Il diagramma dei casi d’uso relativo al macro-blocco “Punti di interesse”
La navigazione all’interno di questa sezione è consentita tramite l’utilizzo di
questo insieme di casi d’uso. Quelli relativi alla visualizzazione dei contenuti vengono
realizzati per fornire un punto di ingresso ad ogni livello della gerarchia di view;
tuttavia, per la loro esistenza, essi devono estendere i casi d’uso relativi alla ricerca.
Questi ultimi, ad eccezione di quello relativo alla ricerca di un punto di interesse,
sono dei casi d’uso più complessi rispetto a quelli descritti precedentemente; ciò
deriva dal fatto che le operazioni che li compongono includono delle interazioni con
un sistema esterno.
I macro-blocchi “Ristorazioni”, “Pernottamenti”, “Svaghi” e “Servizi primari”
presentano delle analogie funzionali rispetto a quanto appena descritto e, di conseguenza, anche diagrammi dei casi d’uso simili. Per questo motivo, essi, non verranno
descritti nel seguito.
Diagramma dei casi d’uso relativo alla sezione “La città”
In Figura 4.3 viene mostrato il diagramma dei casi d’uso relativo al macro-blocco
“La città”.
4.2 Progettazione della componente applicativa
61
Figura 4.3. Il diagramma dei casi d’uso relativo al macro-blocco “La città”
La realizzazione di questa sezione è consentita tramite l’utilizzo dai casi d’uso
visualizzati nella figura. Essi risultano essere differenti rispetto a quelli rappresentati
in precedenza dal momento che, oltre al contesto differente, permettono di realizzare una seconda struttura di navigazione perfettamente collegata con la prima.
In aggiunta ai casi d’uso relativi alla visualizzazione e alla ricerca dei contenuti,
incontriamo quelli riguardanti la visualizzazione della mappa della città. Un utente, grazie all’utilizzo di questi casi d’uso, entra a conoscenza di tutte le indicazioni
necessarie a raggiungere e visitare la città.
4.2.2 Diagrammi di attività
I diagrammi di attività sono quelli che descrivono un processo e organizzano più
entità in un insieme di azioni secondo un determinato flusso. Un diagramma di
attività descrive fondamentalmente un’attività relativa ad un qualsiasi elemento di
modellazione, come classi, casi d’uso, interfacce, componenti e operazioni di classe.
Tipicamente, i diagrammi di attività vengono utilizzati per modellare il flusso di un
caso d’uso (analisi) o il funzionamento di un’operazione.
Un diagramma di attività è formato dalle seguenti componenti:
•
•
•
•
Nodi azione: specificano unità atomiche e istantanee di comportamento.
Nodi di inizio e di fine: sono nodi speciali che indicano l’inizio e la fine di un
flusso.
Nodi oggetto: sono oggetti particolarmente importanti usati come input e output
di azioni.
Nodi controllo: descrivono il flusso dell’attività.
62
4 Progettazione delle funzionalità di base
Diagramma di attività relativo alla sezione “Punti di interesse”
In Figura 4.4 viene mostrato il diagramma di attività relativo al macro-blocco
“Punti di interesse”.
Figura 4.4. Il diagramma di attività relativo al macro-blocco “Punti di interesse”
L’attività parte dal nodo di controllo iniziale denominato Start e si sposta nel
nodo azione Preleva categorie punti di interesse. Esso richiama un comportamento più complesso, formato da un insieme di attività che effettuano una serie
di chiamate a dei servizi esterni e interpretano il risultato ottenuto. Una volta terminata tale attività, il flusso si sposta in quella relativa alla visualizzazione delle
informazioni prelevate. A questo punto l’utente può scegliere di terminare l’attività o di visualizzare i punti di interesse associati ad una determinata categoria.
In quest’ultimo caso il flusso si sposta nel nodo azione Preleva i punti punti
4.2 Progettazione della componente applicativa
63
di interesse della categoria selezionata. Esso rappresenta la chiamata all’attività che avrà il compito di consumare i servizi necessari al recupero delle informazioni richieste; da qui il flusso si sposterà al nodo che visualizzerà i punti di
interesse recuperati. Giunto a questo punto, l’utente potrà scegliere se terminare il
flusso di lavoro o se visualizzare il dettaglio di un elemento. In quest’ultimo caso
il flusso verrà indirizzato nel nodo deputato a mostrare in dettaglio il contenuto
selezionato. Infine, l’utente potrà scegliere se spostare il flusso direttamente verso il
nodo di controllo denominato End oppure se passare dapprima per il nodo deputato
a visualizzare la mappa in cui è presente la posizione del punto.
Diagramma di attività relativo alla sezione “La città”
In Figura 4.5 viene mostrato il diagramma di attività relativo al macro-blocco “La
città”. L’attività parte dal nodo di controllo iniziale, denominato Start e si dirige verso il nodo di biforcazione (fork). Quest’ultimo ha il compito di duplicare i
token in ingresso sulle uscite in modo da parallelizzare due flussi di lavoro concorrenti, rappresentati, rispettivamente, dalle attività Preleva info città e Preleva
voci di menù. I due token concorrenti si dirigono in un nodo ricongiunzione (join).
Quest’ultimo farà partire il flusso in uscita soltanto quando tutte le due attività
arriveranno al suo ingresso. A questo punto un nodo decisione offrirà la possibilità
di visualizzare la descrizione della città o di navigare all’interno del menù presente
in questa sezione. Il flusso terminerà nel nodo End.
Nelle Figura 4.6 viene rappresentato la macro-attività Preleva info città.
Il suo flusso parte dal nodo di controllo Start per poi verificare la presenza di
una connessione alla rete. In caso di riscontro negativo, l’attività termina. In caso
contrario, invece, il flusso si sposta nel nodo che rappresenta l’invio della richiesta
HTTP per recuperare i dati memorizzati sul server. Le successive attività descrivono
le operazioni effettuate sul server necessarie al recupero e all’esposizione dei dati
richiesti. L’attività termina nel nodo di controllo End.
Nella Figura 4.7 è rappresentata la macro-attività Preleva voci di menù. Il
suo flusso è formato da una serie di attività con uguale granularità rispetto alla precedente. Anche qui viene verificata la presenza di una connessione alla rete. In caso
di riscontro positivo viene inviata una richiesta HTTP al server. In questo caso non
ci sarà nessuna attività corrispondente al recupero delle informazioni dal database,
dal momento che queste verranno generate al momento. Una volta terminata l’attività relativa alla creazione delle voci di menù, il flusso si sposta nell’attività che ha
il compito di esporre i dati richiesti. Una volta elaborati i dati, il flusso terminerà
nel nodo End.
4.2.3 Diagrammi di sequenza
I diagrammi di sequenza sono quelli che modellano le interazioni tra le varie entità di
un sistema e ne visualizzano lo scambio di messaggi nel tempo. Il loro scopo è quello
di mostrare come un certo comportamento viene realizzato dalla collaborazione delle
entità di cui il sistema è composto. Tali diagrammi mostrano la realizzazione di un
comportamento offerto e la sequenza temporale degli avvenimenti per ogni entità
coinvolta. I componenti di un diagramma di sequenza sono:
64
4 Progettazione delle funzionalità di base
Figura 4.5. Il diagramma di attività relativo al macro-blocco “La città”
•
•
istanze di classificatori, ciascuna delle quali rappresenta uno specifico oggetto;
linee di vita (lifeline) di classificatori, ciascuna delle quali rappresenta un’istanza
arbitraria di un classificatore. Essa esprime il ruolo giocato da un’istanza senza
preoccuparsi della sua identità.
Diagramma di sequenza relativo alla sezione “Punti di interesse”
In Figura 4.8 viene mostrato il diagramma di sequenza relativo al macro-blocco
“Punti di interesse”.
Tale diagramma mostra le interazioni tra i vari oggetti coinvolti nel processo di
navigazione. Il flusso temporale parte nel momento in cui l’utente richiede di visualizzare le categorie inerenti a quest’area. Tale richiesta è destinata alla componente
mobile del sistema, la quale, prima di procedere al recupero delle informazioni, verifica la presenza di una connessione alla rete Internet. In caso di esito negativo,
essa ne comunicherà l’assenza all’utente. In caso contrario, invece, essa contatterà
il Web service provider per recuperare le categorie.
Il Web service provider interagirà con il DBMS sottostante per recuperare le
informazioni necessarie a soddisfare la richiesta. Tale comportamento è rappresentato da un secondo diagramma di attività, denominato Ricerca categorie punti
di interesse, (che, per brevità, non descriveremo in dettaglio) incluso tramite
4.2 Progettazione della componente applicativa
65
Figura 4.6. Il diagramma di attività relativo al recupero delle informazioni riguardanti
la città
l’utilizzo di un ref. Una volta recuperate le categorie, queste ultime, tramite uno
scambio di messaggi, arriveranno alla componente mobile per poi essere visualizzate. A questo punto, se l’utente seleziona una categoria, la componente mobile, dopo
aver verificato la presenza di una connessione, invierà una richiesta al Web service
provider per recuperare tutti i punti di interesse inerenti al contesto scelto.
L’azione svolta dal web service provider per prelevare le informazioni desiderate è rappresentato dal diagramma di sequenza Ricerca punti di interesse
(che, per brevità, non descriveremo in dettaglio), incluso tramite l’utilizzo di un
ref. Tramite uno scambio di messaggi, l’utente riuscirà a visualizzare la lista dei
punti di interesse relativi alla categoria scelta. A questo punto, egli potrà richiedere
alla componente mobile di visualizzare il dettaglio di un punto, oppure una mappa,
per conoscerne la posizione esatta.
Diagramma di sequenza relativo alla sezione “La città”
In Figura 4.9 viene mostrato il diagramma di sequenza relativo al macro-blocco “La
città”.
66
4 Progettazione delle funzionalità di base
Figura 4.7. Il diagramma di attività relativo al recupero delle informazioni riguardanti il
menù del macro-blocco “La città”
Esso mostra le interazioni tra i vari oggetti coinvolti nel processi di navigazione. Il flusso temporale parte nel momento in cui l’utente richiede di visualizzare
il menù fornito da questa sezione. La richiesta verrà elaborata dalla componente
mobile che verificherà la presenza della connessione alla rete Internet. In caso di
riscontro negativo, essa ne comunicherà l’assenza all’utente. In caso contrario, invece, essa comunicherà con il Web service provider per recuperare le informazioni
generali riguardanti la città e le voci di menù. Il processo di recupero delle prime
è rappresentato dal diagramma di sequenza Ricerca info città, incluso tramite
l’utilizzo di un ref; questa attività coinvolge sia il Web service provider che il
database. Le informazioni prelevabili da questa seconda struttura verranno generate
al momento.
Una volta terminato il processo di recupero, tramite uno scambio di messaggi,
tutte le informazioni richieste dall’utente arriveranno alla componente mobile e potranno essere visualizzate. A questo punto, l’utente potrà decidere se visualizzare
le descrizione della città o se continuare la navigazione all’interno del menù offerto
da quest’area. Quest’ultimo comportamento è rappresentato dal diagramma di sequenza Naviga all’interno del Menù Città, incluso con un ref, del quale non
4.2 Progettazione della componente applicativa
Figura 4.8. Il diagramma di sequenza relativo al macro-blocco “Punti di interesse”
67
68
4 Progettazione delle funzionalità di base
citeremo i dettagli.
Figura 4.9. Il diagramma di sequenza relativo al macro-blocco “La città”
5
Implementezione delle funzionalità di base
Questo capitolo descrive la fase di implementazione della componente client del
sistema EnjoyRC. In particolare, verranno descritti gli strumenti utilizzati e verranno illustrate le porzioni di codice che hanno reso possibile il soddisfacimento dei
requisiti citati in precedenza.
5.1 Strumenti a supporto dell’implementazione
La realizzazione del sistema oggetto della presente tesi ha previsto l’utilizzo di un
insieme di strumenti, alcuni dei quali fondamentali per la fase di implementazione.
Tra questi analizzeremo gli IDE di sviluppo adottati per la stesura del codice e il
sistema di versioning utilizzato per favorire la collaborazione dei componenti del
team di sviluppo.
5.1.1 IDE di sviluppo
Uno degli strumenti più importanti per lo sviluppo di un software è, senza dubbio,
l’IDE (Integrated Development Environment/Ambiente Integrato di Sviluppo). Tale applicativo aiuta a redigere il codice in modo intuitivo e ordinato mettendo a
disposizione una serie di funzionalità che semplificano notevolmente il processo di
sviluppo. Ciò che rende indispensabile un IDE è la possibilità di organizzare i lavori
per progetti, di usufruire dei messaggi di errore durante la scrittura del codice, di
sfruttare la sintassi evidenziata del codice sorgente, di utilizzare il completamento
automatico e di effettuare una ricerca simultanea nei file dell’intero progetto.
Gli IDE adottati nella presente tesi fanno parte della famiglia JetBrains, una
società di sviluppo software il cui target è rappresentato da sviluppatori e project
manager.
5.1.2 IDE JetBrains
JetBrains PhpStorm è un software commerciale nato come piattaforma per lo sviluppo integrato di applicazioni PHP (supporta le versioni 5.3, 5.4, 5.5, 5.6 di PHP).
Esso fornisce un editor anche per i linguaggi JavaScript e HTML. PhpStorm è dotato
70
5 Implementezione delle funzionalità di base
di caratteristiche di rilievo finalizzate ad aumentare la produttività degli utilizzatori
e a permettere l’analisi del codice a caldo. Allo stesso tempo, esso permette di effettuare la prevenzione degli errori e il refactoring in maniera automatizzata sia per
PHP che per JavaScript. PhpStorm si basa sulla piattaforma IntelliJ IDEA (scritta
in Java), che fornisce la possibilità di estendere l’IDE con l’integrazione di plugin
proprietari o di terze parti. Il debugging avviene secondo una modalità visuale per
rendere più agevole la fase di implementazione del software. In sintesi, PhpStorm
permette di:
•
•
•
•
•
Gestire basi di dati supportando la sintassi SQL. Nello specifico, esso permette
di modificare uno schema attivo, di generare script per la sua migrazione, di
esportare il risultato delle query su file o appunti e di modificare le procedure
memorizzate.
Effettuare una distribuzione remota del codice tramite FTP, SFTP, FTPS, con
sincronizzazione automatica.
Integrare i principali sistemi di controllo di versione, tra cui Git, Subversion,
Mercurial, Perforce, VS e TFS, permettendo l’esecuzione delle operazioni di
merge, commit, etc. direttamente dall’IDE.
Creare i diagrammi delle classi UML dai quali è possibile effettuare direttamente
il refactoring del codice PHP.
Supportare Vagrant, console SSH e altri tool remoti.
JetBrains WebStorm è uno dei più potenti software per lo sviluppo di applicazioni JavaScript, HTML, CSS e per molte altre tecnologie web. Tale IDE fornisce gli
strumenti necessari allo sviluppo di complessi sistemi lato client e, grazie all’utilizzo
di Node.js, anche lato server. Analogamente a PhpStorm, esso fornisce la gestione
intelligente del codice, il completamento automatico a supporto della stesura dello
stesso, le funzionalità di refactoring e la prevenzione degli errori “on-the-fly”. PhpStorm supporta i principali framework JavaScript, come AngularJS e Meteor, e, allo
stesso tempo, permette di integrare numerosi strumenti per effettuare le operazioni
di test, analisi e controllo di versione del codice.
La differenza sostanziale tra i due IDE appena descritti è che l’ultimo non permette lo sviluppo di applicazioni PHP nè fornisce un supporto per l’integrazione
con i DBMS.
5.1.3 Sistemi di versioning e Bitbucket
Un sistema di controllo di versione è una combinazione di tecnologie e procedure
per tracciare i cambiamenti dei file di uno specifico progetto, in particolar modo
del codice sorgente e della sua documentazione. La ragione per cui il controllo di
versione è cosı̀ universalmente adottato sta nel fatto che esso aiuta potenzialmente
ogni aspetto della gestione di un progetto: comunicazioni tra sviluppatori, gestione
dei rilasci, gestione dei bug, stabilità del codice, tentativi di sviluppo sperimentali
e attribuzione e autorizzazione di cambiamenti da parte di alcuni sviluppatori.
Tutti questi aspetti hanno reso l’adozione di un sistema per il controllo di versione di fondamentale importanza anche nel contesto specifico del presente lavoro
di tesi. Tale sistema consente una corretta e semplice collaborazione tra i membri
5.1 Strumenti a supporto dell’implementazione
71
del team di sviluppo, permettendo agli stessi di lavorare contemporaneamente su
diversi file o, addirittura, sullo stesso file, parallelizzando i compiti.
È possibile classificare i sistemi di controllo di versione in due grandi tipologie:
•
•
Sistemi di controllo di versione centralizzati (Centralized Versioning Control System - CVCS): questi sistemi, come CVS, Subversion e Perforce, hanno un unico
server che contiene tutte le versioni dei file e un numero di utenti che li scaricano
dal server centrale. Essi offrono molti vantaggi. Infatti, gli Gli amministratori
hanno un controllo preciso su chi può fare cosa; inoltre, la la gestione dei controlli
è molto più semplice. Tuttavia, tale configurazione presenta anche una serie di
controindicazioni; la più ovvia è che il server centralizzato rappresenta il singolo
punto di rottura del sistema.
Sistemi di controllo distribuiti (Distributed Versioning Control System - DVCS):
in tali sistemi i client non solo controllano la versione più recente dei file, ma
effettuano una copia completa del repository. In questo modo se un server dovesse
presentare un malfunzionamento, il repository di un qualsiasi client può essere
copiato sul server per ripristinare quest’ultimo.
Git Version
Per dare un supporto alla fase di realizzazione della componente client del sistema
si è scelto, a seguito dei vantaggi citati precedentemente, di adottare un sistema
di versioning distribuito, ovvero Git Version. Se i sistemi di controllo di versione
centralizzati salvano l’informazione come una lista di cambiamenti apportati ai file
e ne memorizzano le modifiche su ciascuno di essi, Git, invece, considera i propri
dati come una serie di istantanee (snapshot) di un mini filesystem.
Ogniqualvolta si vuole effettuare il caricamento delle modifiche (commit) o il
salvataggio dello stato del progetto, Git realizza fondamentalmente un’immagine
di tutti i file, salvando un riferimento allo snapshot. Per essere efficiente, se alcuni
file non sono cambiati, Git non effettua il salvataggio, ma crea, semplicemente, un
collegamento al file precedentemente salvati (come mostrato in Figura 5.1).
Figura 5.1. Il funzionamento dell’operazione di commit in Git
72
5 Implementezione delle funzionalità di base
Git presenta una serie di vantaggi rispetto ai suoi predecessori; infatti:
•
•
•
Esso consente la navigazione di un progetto senza la necessità di connettersi
al server per scaricarlo, accedendo direttamente al database locale; Git, infatti,
necessita solo di file e risorse locali per operare.
In Git ogni aspetto è controllato tramite checksum; questo significa che è impossibile cambiare il contenuto di qualsiasi file o directory senza che Git lo sappia.
Si tratta di una funzionalità interna di basso livello di Git, intrinseca alla sua
filosofia.
Quasi tutte le azioni in Git aggiungono dati al suo database. È piuttosto difficile
effettuare operazioni irreversibili o cancellare i dati in modo permanente.
Architettura e operazioni di base
Un progetto Git presenta una struttura ben definita. Esso è costituito dalle seguenti
componenti:
•
•
•
Working dir: essa contiene i file appartenenti alla versione corrente del progetto
sulla quale l’intero team, e nello specifico l’utente, stanno lavorando.
Index: essa contiene i file candidati a subire un operazione di commit.
Head: essa contiene gli ultimi file di cui è stato effettuato il commit.
Il punto di partenza per l’inizializzazione di un progetto Git consiste nel clonare
un repository esistente da un altro server o nel definire un nuovo progetto come
“GIT Repository”. In quest’ultimo caso è necessario accedere alla directory del
progetto e lanciare il comando init. A seguito di ciò, creerà una nuova directory
nella quale saranno inseriti i file di configurazione del repository.
Uno dei punti di forza di Git è la gestione dei Branch (ramificazioni). Questi
ultimi sono utilizzati per sviluppare feature isolate l’una dall’altra. Il repository
creato in fase di inizializzazione corrisponde al “Branch Master”. È possibile creare
altre ramificazioni per lo sviluppo di attività secondarie ed, infine, incorporarle in
quella principale. Tale operazione risulta essere di fondamentale importanza nel
momento in cui si sviluppano nuove funzionalità indipendenti dalla versione stabile
del software. Per creare un nuovo Branch è sufficiente utilizzare l’operazione di
“checkout”, specificando il nome che si vuole attribuire a quello specifico branch.
Bitbucket
Bitbucket è una piattaforma adottata per la gestione delle operazioni di controllo di
versione. Essa permette di ospitare il proprio codice direttamente online, rendendo
molto semplice il lavoro quotidiano del team di sviluppo, favorendo l’aggiornamento
del nuovo codice e offrendo la possibilità di dividerlo in più branch. Tale piattaforma
mette a disposizione spazi e strumenti per la gestione dei propri progetti di sviluppo.
Tra i vantaggi dell’utilizzo di Bitbucket c’è la possibilità di commentare il codice
sorgente, di visualizzare i branch per tenere sotto controllo i progressi del team e di
permettere allo stesso di collaborare per la fase di revisione del codice.
Bitbucket permette all’utente di usufruire dei servizi offerti da Git e Mercurial sfruttando tre differenti approcci: linea di comando, interfaccia web e software
desktop.
5.2 Problemi affrontati e scelte implementative effettuate
73
Il vantaggio di accedere a Bitbucket mediante interfaccia web è quello di realizzare l’editing dei file indipendentemente dal tipo di piattaforma utilizzata per
lo sviluppo e, quindi, apportare le modifiche tramite le operazioni di commit. In
Figura 5.2 è mostrata la dashboard di un progetto Bitbucket.
Figura 5.2. La dashboard di un progetto Bitbucket
5.2 Problemi affrontati e scelte implementative effettuate
5.2.1 Premessa: architettura del framework e librerie realizzate
Come accennato in precedenza, la componente client del sistema EnjoyRC è stata
realizzato tramite l’utilizzo del framework Supersonic di AppGyver. Ogni applicazione realizzata tramite questo specifico strumento deve rispettare una struttura
ben definita, all’interno della quale il codice stilato verrà eseguito. In Figura 5.3
viene mostrata l’architettura dei package del sistema in esame; al suo interno è
possibile osservare come l’organizzazione dei file HTML e JavaScript rispecchi il
pattern MVC e i vincoli imposti dal framework.
Risulta importante evidenziare i ruoli ricoperti dai file e dalle cartelle che compongono il progetto e come questi vengono interpretati dal framework. In questa
sezione ci soffermeremo ad osservare tutti gli aspetti di carattere generale non riguardanti la logica di business e descriveremo alcune delle librerie realizzate in fase
di sviluppo. Il package common (incluso nel package app) ricopre un ruolo di natura
trasversale in quanto, al suo interno, sono contenuti i file comuni a tutti i componenti dell’applicazione; alcuni di questi vengono forniti dal sistema, mentre altri
vengono generati ad-hoc per soddisfare specifiche richieste. Tale package contiene i
seguenti componenti:
74
5 Implementezione delle funzionalità di base
Figura 5.3. L’architettura dei package del sistema EnjoyRC
•
•
•
•
•
•
assets: esso è fornito dal sistema e contiene tutte le immagini e le icone utilizzate
dall’applicazione.
js: esso è stato realizzato per contenere le librerie JavaScript utilizzate per
soddisfare esigenze comuni a più componenti, come la gestione delle mappe.
native-styles: esso è fornito dal sistema e contiene i fogli di stile specifici
delle piattaforme Android e iOS, grazie ai quali è possibile gestire il layout degli
oggetti grafici nativi.
services: esso è stato realizzato per contenere la libreria relativa ai servizi.
stylesheets: esso è fornito dal sistema e contiene i fogli di stile utilizzati per
gestire contemporaneamente il layout delle piattaforme Android e iOS.
views: esso è fornito dal sistema e contiene il file HMTL utilizzato per includere
tutti i componenti (fogli di stile e di scripting) utilizzati dal framework.
Un altro package che gestisce aspetti comuni all’applicazione è config. Esso
contiene due file CoffeeScript1 , denominati app.coffee e structure.coffee. All’interno di tali file sarà possibile impostare il nome dell’applicazione e decidere
quale view, tra quelle presenti, corrisponderà alla Home Page; allo stesso tempo
sarà possibile gestire le operazioni di scroll, definire le impostazioni del Drawer
Menù e abilitare o disabilitare le operazioni di “gesture recognizer”.
Il codice utilizzato per gestire queste operazioni è mostrato nei Listati 5.1 e 5.2.
1
2
3
4
1
# Read more about app configs at http://docs.appgyver.com
module.exports =
app:
CoffeeScript è un linguaggio di programmazione che transcompila in JavaScript.
5.2 Problemi affrontati e scelte implementative effettuate
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
75
name: "EnjoyRC"
# steroidsAppId and steroidsApiKey headers are required by Supersonic Data
# network:
# extraResponseHeaders:
#
"Access-Control-Allow-Origin": "*"
#
"Access-Control-Allow-Headers": "Content-Type, X-Requested-With, steroidsAppId, steroidsApiKey"
webView:
viewsIgnoreStatusBar: false
enableDoubleTapToFocus: false
disableOverscroll: true
enableViewportScale: false
enablePopGestureRecognition: true
allowInlineMediaPlayback: true
# Applies on iOS only
statusBar:
enabled: true
style: "default"
Listato 5.1. Il contenuto del File CoffeeScript app.coffee
1
2
3
4
5
6
7
8
9
10
11
module.exports =
rootView:
location: "home#index"
drawers:
left:
id: "leftDrawer"
location: "drawer#index"
showOnAppLoad: false
options:
button:""
Listato 5.2. Il contenuto del File CoffeeScript structure.coffee
Il package bower components include al suo interno tutte le librerie fornite dal
framework, che di base sono quelle relative ad AngulaJS, Steroids-js, Supersonic e
ai Web Component. Vi è la possibilità di integrare librerie di terze parti, tramite
l’utilizzo di “Bower”, uno strumento che permette di gestire tutte le dipendenze
web e di includerle all’interno di questo package.
Implementazione della libreria relativa alla consumazione dei servizi
web
Tra tutti i componenti citati, quello che ricopre un ruolo centrale per il sistema è
la libreria dei servizi. Essa è stata realizzata con lo scopo di inglobare all’interno
di un unico file, ovvero service.js, tutte le funzioni necessarie al recupero dei
dati dal server. Nello specifico, all’interno di questa libreria, sono presenti tutte
quelle operazioni necessarie al recupero della lingua utilizzata dal dispositivo, alla
memorizzazione del path assoluto del server, non che le operazioni che permettono
lo scambio di dati con lo stesso. Un approccio di questo tipo, che prevede la separazione delle competenze, permette di esonerare il controller dalla gestione della
comunicazione con il server, ottenendo un sistema più flessibile dal punto di vista
delle future implementazioni e manutenzioni. Ogni servizio implementato è un oggetto singleton, ovvero ne esisterà una sola istanza accessibile dagli altri componenti
dell’applicazione.
Nel Listato 5.3 viene mostrato il codice necessario a prelevare la lingua del
dispositivo:
1
.service("getLanguage", function() {
76
5 Implementezione delle funzionalità di base
2
3
this.lang = navigator.language.split(",");
})
Listato 5.3. Il service Angular getLanguage
Tramite l’istruzione Cordova navigator.language è stato possibile prelevare
la lingua attualmente utilizzata dal dispositivo. Essa è stata incapsulata all’interno
del servizio Angular getLanguage, il quale ha permesso a tutte quelle funzioni che
comunicano con il server di conoscere la lingua in cui dovranno essere restituiti i
dati.
Nel Listato 5.4 viene mostrato il codice necessario a memorizzare il path del
server.
1
2
3
.service("path",function(){
this.path_server="http://www.enjoyrc.unirc.it/";
})
Listato 5.4. Il service Angular path
Questi due tipi di servizi servono esclusivamente per lo scambio di dati tra le
funzionalità presenti in questa libreria. Per quanto riguarda invece i servizi utilizzati
per la consumazione delle API REST fornite dal server, se ne può osservare un
esempio nel Listato 5.5.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// servizio relativo alle voci di menu della Home Page//
.service("servicesHome", function(getLanguage,path,$http) {
var that = this;
this.items = [];
this.getItems = function() {
return $http.get(path.pathServer+’home/?language=’+getLanguage.lang)
.success(function (data) {
data.forEach(function(item){
that.items.push(item);
});
}).error(function(data){
alert("err");
console.log(’errore lettura servizio home’);
});
};
})
Listato 5.5. Il service Angular servicesHome
Questo servizio mostra le operazioni effettuate per recuperare le voci di menù
della Home Page. Attraverso un processo denominato “dependency injections”, vengono iniettati, all’interno dello stesso, i risultato dei servizi getLanguage, path e
$http. I primi due vengono utilizzati per la creazione dell’URL necessaria per effettuare la chiamata REST, mentre il terzo corrisponde a quel servizio predefinito per
effettuare chiamate AJAX in AngularJS. Quest’ultimo espone diversi metodi per le
chiamate HTTP. Tali metodi accettano come parametro l’URL da chiamare e restituiscono una “promise”, per poter gestire la risposta del server. Quella mostrata nel
Listato 5.5 è una delle tante chiamate GET presenti all’interno della libreria. Per
prima cosa abbiamo realizzato il caricamento dei dati esterni attraverso l’istruzione $http.get(path.pathServer+’home/?language=’+getLanguage.lang). Grazie alle promise success ed error, una volta che la chiamata REST ha restituito
un riscontro, viene indicata l’operazione da eseguire nel caso in cui questo sia positivo o meno. Nel caso di esito positivo i dati ricavati verranno inseriti all’interno
5.2 Problemi affrontati e scelte implementative effettuate
77
di un array. Nel caso di esito negativo verrà visualizzato un messaggio di errore. In
ogni caso, tale servizio restituirà il risultato delle sue operazioni tramite l’istruzione
return.
Implementazione della libreria relativa ai servizi di geolocalizzazione
Un ulteriore componente necessario per il funzionamento del sistema corrisponde
alla libreria dei servizi di geolocalizzazione. Tale componente è stato realizzato con
lo scopo di raggruppare tutte le funzionalità inerenti a questo contesto all’interno
di un unico file denominato map.js. Il loro compito è quello di fornire gli strumenti
necessari alla creazione di una mappa e al calcolo di un percorso.
Questo componente è stato implementato tramite l’utilizzo di JavaScript e di
API fornite da Google Map. In questo modo è stato possibile separare la logica di business da queste funzionalità di supporto, rendendo trasparente il loro
funzionamento a tutti i componenti che le utilizzano.
Nel Listato 6.15 viene mostrato il codice della funzione initMap utilizzata per
la creazione di una mappa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function initMap() {
directionsService = new google.maps.DirectionsService;
directionsDisplay = new google.maps.DirectionsRenderer;
map = new google.maps.Map(document.getElementById(’map’), {
zoom: 8,
center: {lat: 38.1038882, lng: 15.6336553}
});
directionsDisplay.setMap(map);
directionsDisplay.setPanel(document.getElementById(’right-panel’));
if(latitude_start!="" && longitude_start !="") {
calculateAndDisplayRoute(directionsService, directionsDisplay, ’DRIVING’);
}
}
Listato 5.6. La funzione initMap utilizzata per la creazione di una mappa
Tale funzione imposta gli attributi zoom e center dell’oggetto map ed effettua
un controllo sull’esistenza di un punto di partenza. In caso di riscontro positivo,
verrà richiamata la funzione calculateAndDisplayRoute, la cui implementazione
è mostrata nel Listato 5.7.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function calculateAndDisplayRoute(directionsService, directionsDisplay, travelMode) {
var first_start; var first_end;
try{
if(latitude_start!="" && longitude_start !="" && document.getElementById(’start’).value =="Start") {
first_start = new google.maps.LatLng(latitude_start, longitude_start);
}else {
first_start = document.getElementById(’start’).value;
}if(latitude_end!="" && longitude_end!=""){
first_end=new google.maps.LatLng(latitude_end, longitude_end);
}else{
first_end=new google.maps.LatLng(38.1038882, 15.6336553);
}
}catch(err){
alert(err.message);
}
try{
directionsService.route({
origin: first_start,
destination:first_end,
travelMode: google.maps.TravelMode[travelMode]
}, function(response, status) {
if (status === google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
if(travelMode==’DRIVING’){
document.getElementById(’DRIVING’).className = "active";
document.getElementById(’WALKING’).className = "";
document.getElementById(’BICYCLING’).className = "";
document.getElementById(’TRANSIT’).className = "";
78
5 Implementezione delle funzionalità di base
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
}else if(travelMode==’WALKING’){
document.getElementById(’DRIVING’).className =
document.getElementById(’WALKING’).className =
document.getElementById(’BICYCLING’).className
document.getElementById(’TRANSIT’).className =
}else if(travelMode==’BICYCLING’){
document.getElementById(’DRIVING’).className =
document.getElementById(’WALKING’).className =
document.getElementById(’BICYCLING’).className
document.getElementById(’TRANSIT’).className =
}else if(travelMode==’TRANSIT’){
document.getElementById(’DRIVING’).className =
document.getElementById(’WALKING’).className =
document.getElementById(’BICYCLING’).className
document.getElementById(’TRANSIT’).className =
}
"";
"active";
= "";
"";
"";
"";
= "active";
"";
"";
"";
= "";
"active";
}
});
}catch(err){
alert(err.message);
}
}
Listato 5.7. La funzione calculateAndDisplayRoute, utilizzata per il calcolo del percorso
verso il centro della città
Essa avrà il compito di calcolare il percorso tra il centro della mappa e un
punto di partenza, sia che questo corrisponda alla posizione del dispositivo, sia che
venga inserito manualmente dall’utente. Inoltre permetterà di gestire la modalità di
percorrenza. Nel Listato 5.8 è mostrata l’implementazione di una seconda funzione
per il calcolo di un percorso, considerando, questa volta, anche dei punti intermedi
all’interno dello stesso.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function calculateAndDisplayRoute2(directionsService, directionsDisplay,lat_origigine, lng_origigine,
lat_destinazione, lng_destinazione, wp_array,flag) {
var waypts = [];
try{
for (var i = 0; i < wp_array.length; i++) {
var latlangwp =wp_array[i];
var latlangwp =latlangwp.split("|");
var lat_orig_wp= latlangwp[0]; var lng_orig_wp= latlangwp[1];
waypts.push({
location: new google.maps.LatLng(lat_orig_wp, lng_orig_wp),
stopover: true
});
}
}catch(err){
alert(err.message);
}
lat_orig= lat_origigine; lng_orig= lng_origigine;
lat_dest= lat_destinazione; lng_dest= lng_destinazione;
try{
var container_via_partenza = document.getElementById(’start_address’);
container_via_partenza.innerHTML = ’’;
}catch(err){
alert(err.message);
}
try{
directionsService.route({
origin: new google.maps.LatLng(lat_orig, lng_orig),
destination: new google.maps.LatLng(lat_dest, lng_dest),
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING
}, function(response, status) {
if (status === google.maps.DirectionsStatus.OK) {
directionsDisplay.setDirections(response);
var route = response.routes[0];
var start = route.legs[0].start_address;
var input = document.createElement("textarea");
input.maxLength = "100";
input.cols = "27";
input.rows = "2";
input.setAttribute("id", "textarea_start");
input.setAttribute("value", start);
input.setAttribute("readOnly", true);
container_via_partenza.appendChild(input);
document.getElementById("textarea_start").value=start;
if(flag==1){
5.2 Problemi affrontati e scelte implementative effettuate
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
79
var container_via_arrivo = document.getElementById(’end_address’);
container_via_arrivo.innerHTML = ’’;
var end = route.legs[0].end_address;
var input1 = document.createElement("textarea");
input1.maxLength = "100";
input1.cols = "25";
input1.rows = "2";
input1.setAttribute("id", "textarea_end");
input.setAttribute("value", end);
input1.setAttribute("readOnly", true);
container_via_arrivo.appendChild(input1);
document.getElementById("textarea_end").value=end;
}
} else {
window.alert(’Directions request failed due to ’ + status);
}
});
}catch(err){
alert(err.message);
}
}
Listato 5.8. La funzione calculateAndDisplayRoute2 utilizzata per il calcolo di una
percorso formato da più tratte
5.2.2 Implementazione del macro-blocco “Punti di interesse”
Questo macro-blocco, come accennato nei capitoli precedenti, permette ad un utente di visualizzare le informazioni relative ai punti di interesse distribuiti lungo il
territorio. L’utilizzatore potrà accedere a quest’area attraverso il menù presente
nella Home Page. Durante il caricamento di quest’ultima verrà eseguita la prima
comunicazione con il server, grazie alla quale verranno caricate le voci di menù. Una
volta selezionata la voce corrispondente ai punti di interesse, il sistema presenterà
la pagina contenente le categorie corrispondenti. Nel Listato 5.9 viene mostrato il
codice che permette di richiamare la pagina di primo livello appena citata.
1
2
3
4
5
6
7
<div ng-if="item.ordine!=7">
<super-navigate location="first_level#index" data-params-id="{{ item }}">
<img src="{{item.url_icona}}" class="img_circle" >
<p class="dimEtichetta"> {{item.nome}}
</p>
</super-navigate>
</div>
Listato 5.9. Il Web Component super-navigate di Supersonic
Il framework Supersonic permette di gestire il flusso di navigazione in maniera
nativa, creando uno stack di view per ogni determinato processo tramite l’utilizzo
del Web Component super-navigate. Esso definisce la struttura di navigazione dell’applicazione ed è formato da due attributi: location e data-params-id. Il primo
viene utilizzato per specificare la view di destinazione, che, nel nostro caso, risulta
essere index.html contenuta all’interno del package first level; il secondo, invece, gestisce lo scambio di dati con il livello successivo. In questo caso le informazioni
trasmesse corrispondono a quelle necessarie a conoscere il tipo di categorie da recuperare. Prima che la view di destinazione venga presentata, il framework elabora il
codice del controller ad essa associata. Tale codice è mostrato nel Listato 5.10.
1
2
3
4
5
6
angular
.module(’first_level’)
.controller(’IndexController’, function($scope,$http, servicesCategoriePoi,
servicesCategorieRistorazioni, servicesCategoriePernottamento,
servicesCategorieSvaghi, servicesCategoriePercorsi,
servicesTipiCategorie, servicesCategorieServiziByTipo) {
80
5 Implementezione delle funzionalità di base
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$scope.items = [];
supersonic.ui.views.current.params.onValue( function (values) {
$scope.item1 = values.id;
try{
$scope.item = JSON.parse($scope.item1);
}catch(err){
var options = {
message: err.message,
buttonLabel: "Chiudi"
};
supersonic.ui.dialog.alert("Successo", options).then(function() {
supersonic.logger.log("Alert closed.");
});
}
});
try{
$scope.destinazione="second_level#index";
if ($scope.item.ordine==1) {
if (!localStorage.servicesCategoriePoi) {
servicesCategoriePoi.getItems().then(function () {
$scope.items = servicesCategoriePoi.items;
localStorage.servicesCategoriePoi = JSON.stringify({
giorno: dd, mese: mm, anno: yyyy,
source: $scope.items
})
});
}else{
if (JSON.parse(localStorage.servicesCategoriePoi).giorno < dd &&
JSON.parse(localStorage.servicesCategoriePoi).mese == mm &&
JSON.parse(localStorage.servicesCategoriePoi).anno == yyyy) {
localStorage.removeItem("servicesCategoriePoi");
servicesCategoriePoi.getItems().then(function () {
$scope.items = servicesCategoriePoi.items;
localStorage.servicesCategoriePoi = JSON.stringify({
giorno: dd, mese: mm, anno: yyyy,
source: $scope.items
})
});
}else{
$scope.items= JSON.parse(localStorage.servicesCategoriePoi).source;
}
}
}
}catch(e){
alert(e.message);
}
});
Listato 5.10. Il controller della view relativa al primo livello di gerarchia dell’applicazione
La prima operazione effettuata dal controller è quella di recuperare i dati ricevuti
dalla view che lo ha richiamato, per poi convertirli in formato JSON e inserirli
all’interno dell’oggetto $scope. Nella terminologia di AngularJS uno “scope” indica
il contesto in cui vengono salvati i dati di un’applicazione (il model) ed in cui
vengono valutate le espressioni utilizzate nella view. Una volta terminata questa
fase, verrà verificato se i dati da visualizzare sono presenti in cache o dovranno
essere richiamati dal servizio. Tale operazione è effettuata tramite il controllo if
(!localStorage.servicesCategoriePoi).
Se la condizione di questa istruzione risulta verificata, allora verrà richiamato
il servizio relativo al recupero delle categorie, il cui codice è mostrato nel Listato
5.11, per poi memorizzarne il contenuto all’interno della cache.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.service("servicesCategoriePoi", function(getLanguage,path,$http) {
var that = this;
this.items = [];
this.getItems = function() {
return $http.get(path.pathServer+’categorie-punti-di-interesse/?language=’+getLanguage.lang)
.success(function (data) {
data.forEach(function(item){
that.items.push(item);
});
5.2 Problemi affrontati e scelte implementative effettuate
15
16
17
18
19
20
21
81
}).error(function(data){
console.log(’errore categorie poi’);
});
};
})
Listato 5.11. Il codice relativo al servizio servicesCategoriePoi
Se la condizione dell’istruzione precedente non sarà verificata, ovvero il dato
richiesto è presente nella cache, verrà eseguito un ulteriore controllo per testare se
la data del suo inserimento è precedente alla data attuale. In questo caso esso verrà
eliminato e recuperato dal servizio; in caso contrario, esso verrà recuperato dalla
cache ed inserito nello scope.
Al termine di queste fasi di controllo e di configurazione, i dati recuperati
verranno visualizzati in una lista attraverso il codice mostrato nel Listato 5.12.
1
2
3
4
5
6
7
8
9
10
11
12
<div class="card" ng-repeat="categoria in items">
<super-navigate location="{{destinazione}}" data-params-id="{{categoria}}">
<div class="item item-text-wrap">
<div class="div_container_image">
<img src="{{categoria.url_icona}}" class="img_circle_dettagli" >
</div>
<div ng-if="item.ordine!=5">
<div ng-hide="true">{{categoria.ordine=item.ordine}}</div>
</div>
</div>
</super-navigate>
</div>
Listato 5.12. Il codice relativo alla visualizzazione della lista delle categorie dei punti di
interesse
Grazie alla direttiva ng-repeat abbiamo generato un elenco di elementi HTML
a partire dalla collezione di dati items creata dal controller e messa a disposizione
della view, grazie all’oggetto $scope. A questo punto un utente potrà selezionare
una categoria per visualizzarne i punti associati. Questa operazione, come nel caso
precedente, è permessa grazie alla presenza del Web Component super-navigate.
Il processo di caricamento della view contenente i punti di interesse è simile a quello
descritto precedentemente: viene eseguito il codice relativo al controller della view
richiamata per poi visualizzare i dati recuperati in una lista. Nel Listato 5.13 viene
mostrato il codice relativo alla visualizzazione dei punti di interesse.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div ng-repeat="punto in items">
<div ng-if="item.ordine!=4 && item.ordine!=’Tradizioni’ && item.ordine!=’Prodotti Tipici’">
<super-navigate location="third_level#index"data-params-id="{{punto}}">
<div class="item item-thumbnail-left">
<img src="{{item.url_image}}">
<h2>{{punto.nome}}</h2>
<p>{{punto.via}}</p>
<p ng-if="$scope.item.ordine==9">
<p>{{punto.sito}}</p>
</p>
<div ng-hide="true">{{punto.ordine=item.ordine}}</div>
</div>
</super-navigate>
</div>
</div>
Listato 5.13. Il codice relativo alla visualizzazione della lista dei punti di interesse
Come nel caso precedente, tale lista è realizzata grazie alla direttiva Angular
ng-repeat. Tramite la selezione degli elementi visualizzati da quest’ultima sarà
82
5 Implementezione delle funzionalità di base
possibile accedere al dettaglio di un punto di interesse. Grazie all’utilizzo del Web
Component super-navigate, queste informazioni verranno inviate alla pagina di
dettaglio senza la necessità di consumare un nuovo servizio per recuperarli.
Nel Listato 5.14 viene mostrata una porzione di codice necessaria alla visualizzazione del dettaglio.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<div class="list card">
<div ng-if="item.ordine!=9">
<div class="item item-avatar">
<img src="{{icon}}">
<h2><strong>{{item.nome}}</strong></h2>
<p>{{item.via}}</p>
</div>
</div>
<div ng-if="item.ordine==9">
<h2 align="center"><strong>{{item.nome}}</strong></h2>
<p align="center">{{item.via}}</p>
</div>
<div class="item item-body">
<img class="full-image" src="{{item.url_image}}" >
<div class="padding">
<div class="div_servizi_affiancati" ng-repeat="service in services">
<i class="{{service.style}}"></i>
</div>
</div>
<p class="testo_giustificato">
{{item.descrizione}}
</p>
<div class="div_affiancati">
<a href="tel://{{item.recapito}}" class="coloro_testo_detaglio_elemento">{{item.recapito}}</a>
</div>
<div class="div_affiancati" ng-if="item.sito">
<a href="{{item.sito}}" class="coloro_testo_detaglio_elemento">Web Site</a>
</div>
<div ng-show="item.ordine==2 || item.ordine==3 || item.ordine==6" class="div_clear">
<ul class="list">
<li class="item">
<li class="item">
<i class="super-ios-circle-filled"></i>
Giorno Chiusua: <a href="#" class="subdued">{{item.giorno_chiusura}}</a>
</li>
<li class="item">
<i class="super-ios-circle-filled"></i>
Orario Apertura: <a href="#" class="subdued">{{item.orario_apertura}}</a>
</li>
<li class="item">
<i class="super-ios-circle-filled"></i>
Orario Chiusura: <a href="#" class="subdued">{{item.orario_chiusura}}</a>
</li>
<li class="item">
<i class="super-ios-circle-filled"></i>
Prezzo Medio: <a href="#" class="subdued"> {{item.prezzo_medio}}</a>
</li>
<li class="item">
<i class="super-ios-circle-filled"></i>
Numero Coperti: <a href="#" class="subdued">{{item.n_coperti}}</a>
</li>
</ul>
</div>
<div ng-if="item.ordine!=9">
<div class="item">
<i class="super-ios-circle-filled"></i>
<super-navigate location="map#index" data-params-id="{{item}}">
GO-TO
</super-navigate>
</div>
</div>
</div>
</div>
Listato 5.14. Il codice relativo alla visualizzazione del dettaglio di un punto di interesse
All’interno del codice mostrato in questo listato, è possibile identificare le direttive Angular ng-if, utilizzate per la visualizzazione condizionata di alcuni elementi del DOM HTML. A questo punto un utente, attraverso la selezione del tag
super-navigate, potrà accedere alla pagina contenente le informazioni di locazio-
5.2 Problemi affrontati e scelte implementative effettuate
83
ne del punto e le indicazioni stradali per raggiungerlo; queste verranno mostrate
tramite una mappa e alcuni contenuti testuali. Per realizzare quest’ultimo livello,
si è fatto uso della libreria relativa ai servizi geolocalizzazione citata in precedenza.
Il codice della view relativo a quest’ultima sezione è mostrato nel Listato 5.15.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<div id="map"></div>
<input type="hidden" name="mode" id="mode" value="DRIVING">
<div>
<ul class="nav nav-tabs">
<li id="DRIVING" class="active">
<a href="#" onclick="setValue(’DRIVING’)">
<img src="/icons/car.svg" class="displayed">
</a>
</li>
<li id="WALKING">
<a href="#" onclick="setValue(’WALKING’)">
<img src="/icons/walk.svg" class="displayed">
</a>
</li>
<li id="BICYCLING">
<a href="#" onclick="setValue(’BICYCLING’)">
<img src="/icons/bicycle.svg" class="displayed">
</a>
</li>
<li id="TRANSIT">
<a href="#" onclick="setValue(’TRANSIT’)">
<img src="/icons/bus.svg" class="displayed">
</a>
</li>
</ul>
</div>
<div ng-controller="IndexController" class="padding-form-map">
<div class="list">
<a class="item item-icon-left" href="#" id="form-color-id">
<i class="icon super-gear-a"></i>
<input type="text" id="start" onchange="calcRouteByCar();" value="Start"
onclick="clearvalue()" class="form-color">
</a>
</div>
<div ng-if="make==true">
{{getPosition()}}
</div>
</div>
<div id="right-panel" ></div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCBEhcmPPw2-zcQYyzSroeXglMLtEyRlw&signed_in=true&callback=initMap"r></script>
Listato 5.15. Il codice relativo alla visualizzazione della lista dei punti di interesse
Attraverso il tag <ul class="nav nav-tabs"> viene visualizzata la lista delle
modalità di percorrenza della tratta creata. Infine, sarà anche presente un form per
l’inserimento di un nuovo punto di partenza, realizzato tramite l’istruzione <input
type="text" id="start" onchange="calcRouteByCar();" value="Start" onclick="clearvalue()" class="form-color">. Grazie alla presenza dell’attributo onchange del tag input, verrà catturato l’evento relativo alla compilazione di
tale form e verrà richiamata la funzione calcRouteByCar fornita dalla libreria dei
servizi di geolocalizzazione. Il codice relativo a tale funzione è mostrato nel Listato
5.16.
1
2
3
function calcRouteByCar(){
calculateAndDisplayRoute(directionsService, directionsDisplay, "DRIVING");
}
Listato 5.16. Il codice relativo alla funzione calcRouteByCar
All’interno del codice relativo a tale funzione verrà richiamata la funzione necessaria al calcolo di un tragitto vincolando l’utilizzo di un mezzo privato come
modalità di percorrenza.
84
5 Implementezione delle funzionalità di base
5.2.3 Implementazione del macro-blocco “La città”
Questo macro-blocco, come descritto nei capitoli precedenti, permetterà ad un utente di accedere alle informazioni di natura generale riguardanti la città. L’utilizzatore
potrà accedervi tramite il menù presente nella pagina principale dell’applicazione.
Il punto di partenza di quest’area si presenta come una seconda Home Page formata
da un menù di accesso ai contenuti avente una struttura a tile. Il codice utilizzato
per la realizzazione della view corrispondente a tale sezione è mostrato nel Listato
5.17.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<div ng-controller="IndexController">
<super-navbar>
<super-navbar-title>
{{item.nome}}
</super-navbar-title>
</super-navbar>
<img class="img_header" src="{{item.url_image}}">
<div class="padding_citta_header"/>
<div class="card" >
<div class="item item-text-wrap">
<div class="altezza_descrizione">
{{info_citta[0].descrizione}}
</div>
<a href="#" ng-click="present_dialog()">
<i class="icon super-more"></i>
</a>
</div>
</div>
<div class="row margin_container_la_citta">
<div class="col margin_container_la_citta">
<super-navigate location="map#index" data-params-id="{{item}}">
<div class="card margin_container_la_citta" >
<img class="immagine_opaca" src="{{voci_menu[0].url_image}}">
<div class="dim_tex_button">
{{voci_menu[0].nome}}
</div>
</div>
</super-navigate>
</div>
<div class="col margin_container_la_citta">
<super-navigate location="come_visitarla#index" data-params-id="{{info_citta[0]}}">
<div class="card margin_container_la_citta">
<img class="immagine_opaca" src="{{voci_menu[1].url_image}}">
<div class="dim_tex_button">
{{voci_menu[1].nome}}
</div>
</div>
</super-navigate>
</div>
</div>
<div class="row margin_container_la_citta">
<div class="col margin_container_la_citta">
<super-navigate location="second_level#index" data-params-id="{{item_second_view1}}">
<div class="card margin_container_la_citta">
<img class="immagine_opaca" src="{{voci_menu[2].url_image}}">
<div class="dim_tex_button">
{{voci_menu[2].nome}}
</div>
</div>
<div ng-hide="true">{{item_second_view1.nome=voci_menu[2].nome}}</div>
<div ng-hide="true">{{item_second_view1.ordine=’Prodotti Tipici’}}</div>
<div ng-hide="true">{{item_second_view1.url_image=voci_menu[2].url_image}}</div>
</super-navigate>
</div>
<div class="col margin_container_la_citta">
<super-navigate location="second_level#index" data-params-id="{{item_second_view2}}">
<div class="card margin_container_la_citta">
<img class="immagine_opaca" src="{{voci_menu[3].url_image}}">
<div class="dim_tex_button">
{{voci_menu[3].nome}}
</div>
</div>
5.2 Problemi affrontati e scelte implementative effettuate
76
77
78
79
80
81
82
83
84
85
<div ng-hide="true">{{item_second_view2.nome=voci_menu[3].nome}}</div>
<div ng-hide="true">{{item_second_view2.ordine=’Tradizioni’}}</div>
<div ng-hide="true">{{item_second_view2.url_image=voci_menu[3].url_image}}</div>
</super-navigate>
</div>
</div>
</div>
Listato 5.17. Il codice utilizzato per la creazione della Home Page relativa al macro-blocco
“La città”
Il codice relativo al controller di tale view e mostrato nel Listato 5.18.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
angular
.module(’citta’)
.controller(’IndexController’, function($scope, $http,supersonic, servicesInfoCitta, servicesMenuCitta) {
var today = new Date();
var dd = today.getDate(); var mm = today.getMonth()+1; var yyyy = today.getFullYear();
supersonic.ui.views.current.params.onValue( function (values) {
$scope.item1 = values.id;
try{
$scope.item = JSON.parse($scope.item1);
}catch(err){
var options = {
message: err.message,
buttonLabel: "Chiudi"
};
supersonic.ui.dialog.alert("Successo", options).then(function() {
supersonic.logger.log("Alert closed.");
});
}
});
if (!localStorage.servicesInfoCitta) {
servicesInfoCitta.getItems().then(function () {
$scope.info_citta = servicesInfoCitta.items;
localStorage.servicesInfoCitta = JSON.stringify({
giorno: dd,
mese: mm,
anno: yyyy,
source: $scope.info_citta
})
});
}else{
if (JSON.parse(localStorage.servicesInfoCitta).giorno < dd &&
JSON.parse(localStorage.servicesInfoCitta).mese == mm &&
JSON.parse(localStorage.servicesInfoCitta).anno == yyyy) {
localStorage.removeItem("servicesInfoCitta");
servicesInfoCitta.getItems().then(function () {
$scope.info_citta = servicesInfoCitta.items;
localStorage.servicesInfoCitta = JSON.stringify({
giorno: dd,
mese: mm,
anno: yyyy,
source: $scope.info_citta
})
});
}else{
$scope.info_citta= JSON.parse(localStorage.servicesInfoCitta).source;
}
}
if (!localStorage.servicesMenuCitta) {
servicesMenuCitta.getItems().then(function () {
$scope.voci_menu = servicesMenuCitta.items;
localStorage.servicesMenuCitta = JSON.stringify({
giorno: dd,
mese: mm,
anno: yyyy,
source: $scope.voci_menu
})
});
}else{
if (JSON.parse(localStorage.servicesMenuCitta).giorno < dd &&
JSON.parse(localStorage.servicesMenuCitta).mese == mm &&
JSON.parse(localStorage.servicesMenuCitta).anno == yyyy) {
localStorage.removeItem("servicesMenuCitta");
servicesMenuCitta.getItems().then(function () {
$scope.voci_menu = servicesMenuCitta.items;
localStorage.servicesMenuCitta = JSON.stringify({
giorno: dd,
mese: mm,
anno: yyyy,
source: $scope.voci_menu
})
});
86
5 Implementezione delle funzionalità di base
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
}else{
$scope.voci_menu= JSON.parse(localStorage.servicesMenuCitta).source;
}
}
$scope.present_dialog = function() {
var options = {
message: $scope.info_citta[0].descrizione,
buttonLabels: ["Close"]
};
supersonic.ui.dialog.confirm("La città", options).then(function(index) {
});
};
supersonic.device.geolocation.getPosition().then( function(position) {
$scope.item.position_dev_lat=position.coords.latitude;
$scope.item.position_dev_long=position.coords.longitude;
});
$scope.item.latitudine=38.1084741;
$scope.item.longitudine=15.6441848;
});
Listato 5.18. Il codice relativo al controller associato alla view della Home Page del
macro-blocco “La città”
Il codice descritto nei Listati 5.17 e 5.18 segue una serie di passi logici per creare
la struttura precedentemente citata. In particolare, esso:
•
•
•
•
Interpreta i dati ricevuti dalla view che lo ha richiamato.
Effettua un controllo sulla cache con lo scopo di verificare se i dati da visualizzare
siano gia stati prelevati o meno:
– in caso di riscontro negativo, richiama i servizi corrispondenti e inserisce i
dati prelevati all’interno dello scope e della memoria locale;
– in caso di riscontro positivo, inserisce i dati all’interno dello scope prelevandoli dalla cache.
Se il GPS del dispositivo è attivo, preleva le coordinate della posizione corrente
e le memorizza all’interno dello scope.
Permette alla view di accedere al modello dei dati tramite il controller e crea la
struttura per la loro visualizzazione.
Per la realizzazione delle altre pagine che compongono questa sezione il codice
prodotto è analogo a quello visto finora; per tale ragione si è ritenuto opportuno
non descriverlo in dettaglio.
6
Progettazione e implementazione dei percorsi
tematici
Questo capitolo fornisce una descrizione dettagliata delle fasi di progettazione e
implementazione riguardanti il macro-blocco dei percorsi turistici tematici. Verranno prese in considerazione la progettazione della componente applicativa nonchè
l’implementazione delle funzionalità riguardante la componenti client-side e quella
server-side.
6.1 Progettazione della componente applicativa
Come descritto nei capitoli precedenti, la fase di progettazione della componente
applicativa, riguardante il macro-blocco dei percorsi turistici tematici, ha previsto l’utilizzo di UML come meta-modello. In questa sezione descriveremo tale fase
facendo riferimento ai seguenti diagrammi UML:
•
•
•
diagrammi dei casi d’uso;
diagrammi di attività;
diagrammi di sequenza.
Diagramma dei casi d’uso relativo alla sezione “Percorsi turistici”
In Figura 6.1 viene mostrato il diagramma dei casi d’uso relativo al macro-blocco
“Percorsi turistici”. Esso raggruppa quell’insieme di funzionalità che consentono la
navigazione all’interno di questa sezione e l’amministrazione dei contenuti ad essa
associata. La differenza sostanziale tra il diagramma visualizzato in questa figura
e quelli descritti nei capitoli precedenti riguarda la presenza di un nuovo attore
raffigurante l’amministratore del sistema.
I casi d’uso con cui esso interagisce rappresentano quelli relativi all’amministrazione di un percorso turistico, gestita tramite la componente back-end. L’amministratore, infatti, potrà creare, visualizzare, modificare ed eliminare sia un percorso
turistico che un waypoint (quest’ultimo utilizzato per la creazione delle varie tratte).
I casi d’uso con cui interagisce l’attore “utente” riguardano la navigazione all’interno di quest’area attraverso la componente client-side del sistema. Nello specifico,
l’utente potrà visualizzare le categorie a cui è associato almeno un percorso turistico, la lista dei percorsi di ogni categoria, il loro dettaglio, il dettaglio di ogni singola
88
6 Progettazione e implementazione dei percorsi tematici
tratta di cui essi si compongono e la mappa che indica come raggiungere il punto
di partenza.
Figura 6.1. Il diagramma dei casi d’uso relativo al macro-blocco “Percorsi turistici”
Diagrammi di attività
Diagramma di attività “Visualizza percorsi turistici”
In Figura 6.2 viene mostrato il diagramma di attività riguardante la navigazione
all’interno del macro-blocco “Percorsi turistici”, associato alla componente clientside del sistema. Il flusso parte dal nodo di controllo iniziale, denominato Start, e
si dirige verso il nodo Preleva categorie percorsi turistici che richiama un
comportamento più complesso. Una volta terminata quest’attività, il flusso riparte e si dirige verso l’attività relativa alla visualizzazione dei risultati ottenuti. A
questo punto l’utente può scegliere di terminare l’attività oppure di visualizzare i
percorsi turistici associati ad una determinata categoria. In quest’ultimo caso il flusso si sposta nel nodo azione Preleva percorsi della categoria selezionata.
Esso rappresenta la chiamata all’attività che avrà il compito di consumare i servizi
necessari al recupero delle informazioni richieste.
6.1 Progettazione della componente applicativa
89
Una volta recuperata la lista dei percorsi turistici, il flusso si sposta nel nodo
che avrà il compito di visualizzarla. Giunto a questo punto, l’utente potrà scegliere
se terminare il flusso di lavoro o se visualizzare il dettaglio di un percorso. In quest’ultimo caso, il flusso verrà indirizzato nel nodo deputato a mostrare in dettaglio
il contenuto selezionato. Infine, l’utente potrà decidere di spostare il flusso in uno
dei seguenti tre nodi:
•
•
•
il nodo di controllo denominato End, con il quale l’attività generale sarà terminata;
il nodo deputato a visualizzare la mappa in cui è indicato come raggiungere il
punto di partenza;
il nodo deputato a mostrare il dettaglio di una tratta del percorso.
Figura 6.2. Il diagramma di attività riguardante la navigazione all’interno del macroblocco “Percorsi turistici”
In Figura 6.3 viene rappresentata la macro-attività PrelevaCategoriePercorsi.
Il suo flusso parte dal nodo di controllo Start per poi verificare la presenza di una
90
6 Progettazione e implementazione dei percorsi tematici
connessione alla rete. In caso di riscontro negativo, l’attività termina. In caso contrario, invece, il flusso si sposta nel nodo che rappresenta l’invio della richiesta HTTP
per recuperare le informazioni memorizzate sul server. A questo punto, il flusso si
dirige verso quelle attività che rappresentano le operazioni effettuate dal server per
interpretare la richiesta, prelevare le categorie ed esporre i dati ricavati. Una volta
che questi saranno elaborati, il flusso termina nel nodo di controllo End.
Figura 6.3. Il diagramma di attività relativo al recupero delle categorie dei percorsi
turistici
Diagramma di attività “Crea percorso turistico”
In Figura 6.4 viene mostrato il diagramma di attività relativo alla creazione di un
percorso. L’attività parte dal nodo di controllo iniziale, denominato Start, e si dirige
verso il nodo di biforcazione (fork). Quest’ultimo duplica i token in ingresso sulle
6.1 Progettazione della componente applicativa
91
uscite per parallelizzare due flussi di lavoro corrispondenti alle attività Seleziona
categoria percorso e Inserisci info percorso. Esse si dirigono verso un nodo
ricongiunzione (join). Quest’ultimo farà partire il flusso in uscita solo quando le due
attività arriveranno al suo ingresso. Tale flusso attraverserà il nodo di fusione Merge
per dirigersi verso un nuovo nodo di ricongiunzione. Da quest’ultimo partiranno
tre attività le quali rappresentano, rispettivamente, l’inserimento di un punto di
partenza, di un insieme di punti intermedi e di un punto di arrivo.
Il loro flusso si dirigerà verso un nodo di fusione per poi spostarsi in quello
avente il compito di verificare l’esistenza su mappa dei punti selezionati. Nel caso
in cui essi non formino un itinerario fisicamente percorribile, il flusso tornerà nel
nodo di Merge per permettere di ripetere la loro selezione. In caso contrario, il
flusso si sposterà nel nodo loop Inserisci descrizioni tratte che rappresenta
l’operazione di inserimento di una descrizione per ogni tratta. Una volta terminato
il ciclo, il flusso si sposterà sull’ultima attività, avente il compito di confermare i
dati inseriti, per poi dirigersi verso nodo di controllo End.
Diagrammi di sequenza
Diagrammi di sequenza “Visualizza percorsi turistici”
In Figura 6.5 viene mostrato il diagramma di sequenza relativo al macro-blocco
“Percorsi turistici”. Tale diagramma mostra le interazioni tra i vari oggetti coinvolti
nel processo di navigazione.
Il flusso temporale parte nel momento in cui l’utente richiede di visualizzare le
categorie inerenti a quest’area. Tale richiesta è indirizzata alla componente mobile
del sistema, la quale, prima di procedere con il recupero delle informazioni, verifica
la presenza di una connessione alla rete Internet. In caso di esito negativo, essa ne
comunicherà l’assenza all’utente. In caso contrario, invece, essa invierà una richiesta
al Web service provider per recuperare le categorie richieste.
Il Web services provider interagirà con il DBMS sottostante per recuperare le informazioni necessarie a soddisfare la richiesta. Tale fase è rappresentata
da un secondo diagramma di attività, denominato Ricerca categorie percorsi
turistici, che, per brevità, non descriveremo in dettaglio; quest’ultimo diagramma
sarà incluso nel primo tramite l’utilizzo di un ref.
Una volta recuperate le informazioni riguardanti la tassonomia dei percorsi turistici, queste ultime, tramite una scambio di messaggi, verranno inviate alla componente mobile per poi essere visualizzate. A questo punto, se l’utente seleziona una
categoria, la componente mobile, dopo aver verificato la presenza di una connessione, contatterà il Web service provider per recuperare tutti i percorsi turistici
inerenti al contesto scelto.
Anche in questo caso il Web service provider, per recuperare le informazioni
richieste, dovrà interagire con il DBMS sottostante. Tale azione è rappresentata
dal diagramma di sequenza Ricerca percorsi turistici (che, per brevità, non
descriviamo in dettaglio), incluso tramite l’utilizzo di un ref. Le informazioni, recuperate tramite uno scambio di messaggi, verranno inviate alla componente mobile
per poi essere visualizzate. A questo punto, l’utente potrà richiedere alla componente mobile di visualizzare il dettaglio di un percorso. La componente mobile, dopo
92
6 Progettazione e implementazione dei percorsi tematici
Figura 6.4. Il diagramma di attività relativo al recupero delle categorie dei percorsi
turistici
6.1 Progettazione della componente applicativa
93
Figura 6.5. Il diagramma di sequenza riguardante la navigazione all’interno del macroblocco “Percorsi turistici”
94
6 Progettazione e implementazione dei percorsi tematici
aver elaborato i dati del contenuto richiesto, procederà con la loro visualizzazione.
Infine, l’utilizzatore potrà decidere di visualizzare il dettaglio di una tratta, oppure una mappa per conoscere le informazioni necessarie a raggiungere il punto di
partenza.
Diagrammi di sequenza “Crea percorso turistico”
In Figura 6.6 viene mostrato il diagramma di sequenza relativo alla creazione di
un percorso. Tale diagramma mostra le interazioni tra i vari oggetti coinvolti nel
processo di creazione. Dal momento che queste operazioni verranno gestite lato
back-end, le entità e gli attori coinvolti in questo diagramma saranno differenti
rispetto a quelli presenti nei diagrammi precedentemente descritti.
Il flusso temporale parte nel momento in cui l’amministratore decide di creare un nuovo percorso turistico; in questo caso, egli invia una richiesta alla Web
application, la quale risponderà fornendo le informazioni riguardanti le categorie
a disposizione. L’attore, a questo punto, comunicherà la categoria scelta e le informazioni di natura generale riguardanti il percorso. Una volta terminata questa fase,
la Web application visualizzerà una mappa per permettere all’amministratore di
comporre il percorso, consentendogli di scegliere il numero di tratte.
Se queste ultime non saranno fisicamente percorribili, allora verrà ripetuto il
processo relativo al loro inserimento. In caso contrario la Web application verificherà, per ogni tratta selezionata, se essa sia stata gia scelta in precedenza per far
parte di altri percorsi. In caso affermativo, il sistema preleverà le sue informazioni;
in caso negativo, invece, il sistema permetterà all’amministratore di associare una
descrizione. Infine, l’amministratore invierà una richiesta alla Web application per
confermare l’inserimento del nuovo percorso.
6.2 Implementazione delle funzionalità lato client
La componente client-side di questo macro-blocco permette ad un utente di visualizzare le informazioni riguardanti i percorsi turistici offerti dalla città. L’utilizzatore
potrà accedere a quest’area attraverso il menù presente nella Home Page. Come
descritto nei capitoli precedenti, per recuperare le informazioni utili alla creazione
di quest’ultima, si è utilizzata una funzione fornita dalla libreria dei servizi, grazie
alla quale è stato possibile recuperare i dati relativi alle voci di menù.
Per richiamare la pagina contenente le categorie dei percorsi turistici, corrispondente al primo livello della gerarchia di view, il framework sfrutta il web component
super-navigate, presentato in questo caso sotto forma di un pulsante circolare.
Prima che la view corrispondente a tale livello venga presentata, verrà interpretato
il codice relativo al suo controller.
Esso permetterà di recuperare il modello dei dati e di inserirlo all’interno dell’oggetto $scope. Questa operazione è stata implementata attraverso il codice mostrato
nel Listato 6.1.
1
2
3
4
5
if (!localStorage.servicesCategoriePercorsi) {
servicesCategoriePercorsi.getItems().then(function () {
$scope.items = servicesCategoriePercorsi.items;
localStorage.servicesCategoriePercorsi = JSON.stringify({
giorno: dd, mese: mm, anno: yyyy,
6.2 Implementazione delle funzionalità lato client
Figura 6.6. Il diagramma di sequenza relativo alla creazione di un percorso
95
96
6 Progettazione e implementazione dei percorsi tematici
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
source: $scope.items
})
});
}else{
if (JSON.parse(localStorage.servicesCategoriePercorsi).giorno < dd &&
JSON.parse(localStorage.servicesCategoriePercorsi).mese == mm &&
JSON.parse(localStorage.servicesCategoriePercorsi).anno == yyyy) {
localStorage.removeItem("servicesCategoriePercorsi");
servicesCategoriePercorsi.getItems().then(function () {
$scope.items = servicesCategoriePercorsi.items;
localStorage.servicesCategoriePercorsi = JSON.stringify({
giorno: dd, mese: mm, anno: yyyy,
source: $scope.items
})
});
}else{
$scope.items= JSON.parse(localStorage.servicesCategoriePercorsi).source;
}
}
Listato 6.1. Il codice relativo al recupero delle categorie dei percorsi memorizzati
all’interno del sistema
Per prima cosa, il controller verifica se i dati relativi alla categorie da visualizzare siano presenti nella memoria locale. In caso contrario, esso richiama il servizio
specifico per recuperare tali dati dal server. Nel caso in cui le categorie siano già
state prelevate in precedenza, il controller verifica se la data del loro inserimento precede quella attuale. In caso affermativo le categorie verranno recuperate dal
server e reinserite nella memoria cache. L’operazione necessaria al recupero delle
categorie dal server è stata implementata tramite il codice riportato nel Listato 6.2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.service("servicesCategoriePercorsi", function(getLanguage,path,$http) {
var that = this;
this.items = [];
this.getItems = function() {
return $http.get(path.pathServer+’categorie-percorsi/?language=’+getLanguage.lang)
.success(function (data) {
data.forEach(function(item){
that.items.push(item);
});
}).error(function(data){
console.log(’errore servicesCategoriePercorsi’);
});
};
})
Listato 6.2. Il codice relativo al servizio servicesCategoriePercorsi
Quest’ultimo compone l’URL utilizzata per effettuare la chiamata REST e consuma il servizio dispensato dal server, recuperando, cosı̀, i dati richiesti. A questo
punto, un utente potrà selezionare una categoria per visualizzarne i percorsi associati. Il processo utilizzato per il recupero di questi ultimi è del tutto analogo a
quello utilizzato per il recupero delle categorie. Una volta recuperate le informazioni
relative alla lista dei percorsi, l’utente potrà accedere al dettaglio di ogni singolo
contenuto. Come nei casi precedenti, prima che la view venga presentata, il framework elabora il codice del controller ad essa associata. Tale codice è mostrato nel
Listato 6.3.
1
2
3
4
5
6
7
8
9
10
11
angular
.module(’percorsi_third_level’)
.controller(’IndexController’, function($scope, supersonic) {
supersonic.ui.views.current.params.onValue( function (values) {
$scope.item1 = values.id;
try{
$scope.item = JSON.parse($scope.item1);
}catch(err){
var options = {
message: err.message,
buttonLabel: "Chiudi"
6.2 Implementazione delle funzionalità lato client
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
97
};
supersonic.ui.dialog.alert("Successo", options).then(function() {
supersonic.logger.log("Alert closed.");
});
}
});
waypoints=[];
var coordinate_partenza = $scope.item.archi[0].posizione_partenza.split("|");
var coordinate_arrivo = $scope.item.archi[$scope.item.archi.length-1].posizione_arrivo.
split("|");
$scope.latitudine_partenza=coordinate_partenza[0];
$scope.longitudine_partenza=coordinate_partenza[1];
var latitudine_arrivo=coordinate_arrivo[0];
var longitudine_arrivo=coordinate_arrivo[1];
for(var j=0;j<$scope.item.archi.length;j++) {
if(j!=$scope.item.archi.length-1){
waypoints.push($scope.item.archi[j].posizione_arrivo);
}
}
supersonic.device.geolocation.getPosition().then( function(position) {
$scope.item.position_dev_lat=position.coords.latitude;
scope.item.position_dev_long=position.coords.longitude;
});
calculate_route_percorso($scope.latitudine_partenza, $scope.longitudine_partenza,
latitudine_arrivo, longitudine_arrivo, waypoints,0);
});
Listato 6.3. Il codice relativo al controller della pagina di dettaglio di un percorso turistico
La prima operazione effettuata dal controller è quella di recuperare i dati ricevuti
dalla view che lo ha richiamato. Tali dati, una volta interpretati, corrisponderanno
ad un oggetto JSON raffigurante il percorso di cui si vuole visualizzare il dettaglio.
Dopo di ciò, il punto di partenza e di arrivo del percorso verranno inseriti all’interno
dello scope per poi ricavare un vettore di waypoint. Infine, una volta ricavati i dati
necessari, verrà richiamata la funzione calculate route percorso appartenente
alla libreria dei servizi di geolocalizzazione, con lo scopo di raffigurare il percorso.
Al termine di questa chiamata, verrà mostrata la view in questione, il cui codice
viene mostrato nel Listato 6.4.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<div id="map"></div>
<input type="hidden" name="mode" id="mode" value="DRIVING">
<div ng-controller="IndexController" class="padding-form-map">
<div class="padding">
<div class="button-bar">
<div ng-repeat="arco in item.archi" >
<div class="div_elenco_tratte_affiancate">
<super-navigate location="percorsi_fourth_level#index" data-params-id="{{arco}}">
<span class="button button-positive padding_icon_text" ng-if="$index==0">
A-B
<div ng-hide="true">{{arco.numero="A-B"}}</div>
</span>
<span class="button button-positive padding_icon_text" ng-if="$index==1">
B-C
<div ng-hide="true">{{arco.numero="B-C"}}</div>
</span>
<span class="button button-positive padding_icon_text" ng-if="$index==2">
C-D
<div ng-hide="true">{{arco.numero="C-D"}}</div>
</span>
<span class="button button-positive padding_icon_text" ng-if="$index==3">
D-E
<div ng-hide="true">{{arco.numero="D-E"}}</div>
</span>
<span class="button button-positive padding_icon_text" ng-if="$index==4">
E-F
<div ng-hide="true">{{arco.numero="E-F"}}</div>
</span>
<span class="button button-positive padding_icon_text" ng-if="$index==5">
F-G
<div ng-hide="true">{{arco.numero="F-G"}}</div>
</span>
</super-navigate>
</div>
</div>
</div>
</div>
<div ng-hide="true">{{item.latitudine=latitudine_partenza}}</div>
<div ng-hide="true">{{item.longitudine=longitudine_partenza}}</div>
98
6 Progettazione e implementazione dei percorsi tematici
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<div class="list card">
<div class="item item-avatar">
<img src="/icons/goto.svg">
<p><strong>GO-TO START</strong></p>
<super-navigate location="map#index" data-params-id="{{item}}">
<h2><div id="start_address"/></h2>
</super-navigate>
</div>
<div class="item item-body">
<div class="div_clear">
<div class="item item-body">
<a href="#" class="subdued">
<div class="testo_giustificato">
<h2><strong>{{item.nome}}</strong></h2>
{{item.descrizione}}
<br/>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="js/materialize.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCBEhcmPPw2-zcQYyzSroeXglMLtEyRlw&signed_in=true&callback=initMap"r></script>
<style>
#map {
height: 50%;
}
</style>
Listato 6.4. Il codice relativo alla pagina di dettaglio di un percorso turistico
L’istruzione <div id="map"></div> del presente listato permetterà di inserire
la raffigurazione del percorso come intestazione della pagina; a seguire, verranno
illustrate tutte le informazioni che lo riguardano. Tra queste, sono presenti anche le
tratte di cui il percorso in questione è composto. Esse sono rappresentate tramite una
lista realizzata attraverso l’istruzione <div ng-repeat="arco in item.archi">.
Ogni elemento di questa lista, fornirà l’accesso ad una specifica area, che conterrà
il dettaglio della rispettiva tratta selezionata. Il codice della view di tale dettaglio
è mostrato nel Listato 6.5:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<div id="map"></div>
<input type="hidden" name="mode" id="mode" value="DRIVING">
<div ng-controller="IndexController">
<div class="item item-avatar">
<img src="/icons/tratta.jpg" class="bordo_cerchio_icona">
<div class="row">
<div class="col">{{arco.numero}}</div>
<div class="col">{{arco.durata}}</div>
</div>
</div>
<div class="item item-body">
<div class="div_clear">
<div class="item item-body">
<i class="icon super-location dim_piker_punto">
<div class="piker_punto_partenza">{{partenza}}</div>
</i>
<div id="start_address"/>
</div>
</div>
</div>
<div class="item item-body">
<div class="div_clear">
<i class="icon super-location dim_piker_punto">
<div class="piker_punto_arrivo">{{arrivo}}</div>
</i>
<div id="end_address"/>
</div>
<div class="item item-body">
<div class="div_clear">
{{arco.descrizione}}
</div>
</div>
</div>
6.3 Implementazione delle funzionalità lato server
38
39
40
41
42
43
44
45
46
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="js/materialize.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCBEhcmPPw2-zcQYyzSroeXglMLtEyRlw&signed_in=true&callback=initMap"r></script>
<style>
#map {
height: 50%;
}
</style>
99
Listato 6.5. Il codice relativo alla pagina di dettaglio di una tratta associata ad un
percorso turistico
Il codice del controller associato a questa view è descritto nel Listato 6.6.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
angular
.module(’percorsi_fourth_level’)
.controller(’IndexController’, function($scope, supersonic) {
supersonic.ui.views.current.params.onValue( function (values) {
$scope.item1 = values.id;
try{
$scope.arco = JSON.parse($scope.item1);
}catch(err){
var options = {
message: err.message,
buttonLabel: "Chiudi"
};
supersonic.ui.dialog.alert("Successo", options).then(function() {
supersonic.logger.log("Alert closed.");
});
}
});
var numero=$scope.arco.numero;
numero=numero.split("-");
$scope.partenza=numero[0];
$scope.arrivo=numero[1];
try{
waypoints=[];
var coordinate_partenza = $scope.arco.posizione_partenza.split("|");
$scope.latitudine_partenza=coordinate_partenza[0];
$scope.longitudine_partenza=coordinate_partenza[1];
var coordinate_arrivo = $scope.arco.posizione_arrivo.split("|");
$scope.latitudine_arrivo=coordinate_arrivo[0];
$scope.longitudine_arrivo=coordinate_arrivo[1];
}catch(err){
alert(err.message);
}
calculate_route_percorso($scope.latitudine_partenza, $scope.longitudine_partenza,
$scope.latitudine_arrivo, $scope.longitudine_arrivo,
waypoints,1);
});
Listato 6.6. Il codice relativo al controller associato alla view del dettaglio di una tratta
Grazie al codice mostrato in questi due listati, sarà possibile visualizzare la
rappresentazione grafica della tratta e le informazioni che la riguardano. Infine,
verrà offerta la possibilità di accedere alla pagina che conterrà le informazioni utili
a raggiungere il punto di partenza del percorso.
6.3 Implementazione delle funzionalità lato server
In questa sezione, verrà descritta l’implementazione di alcune delle funzionalità che
hanno permesso di realizzare quella componente di back-end in grado di gestire i
contenuti riguardanti i percorsi turistici. La stesura di tali funzionalità ha previsto
la realizzazione dei seguenti file, scritti nei linguaggi PHP e JavaScript.
•
function percorsi turistici statici.php;
100
•
•
•
•
•
•
•
•
6 Progettazione e implementazione dei percorsi tematici
functions way point.php;
functions arco.php;
inserisci way point.php;
inserisci percorso turistico statico.php;
support percorsi.js;
categorie percorsi json.php;
verifica esistenza arco json.php;
percorsi by categoria json.php;
Nello specifico, essi ci permetteranno di gestire l’inserimento di un percorso e di
un waypoint.
6.3.1 Implementazione della funzionalità relativa all’inserimento di un
waypoint
Nel Listato 6.7 viene mostrato il contenuto del file inserisci way point.php
rappresentante la pagina di inserimento di un waypoint.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
get_header();
?>
<form action="" method="post" onsubmit="return false" name="form_ins_wp">
<div id="coordinate_div"></div>
<?php if(isset($_POST[’way_point’])&&isset($_POST[’coordinate’])){
inserisci_way_point($_POST[’way_point’],$_POST[’coordinate’]);
$_POST[’way_point’] = array();
}
print_form_inserisci_way_point();
?>
</form>
Listato 6.7. Il contenuto del file inserisci way point.php
All’interno del tag form è presente la funzione print form inserisci way point,
la quale verrà richiamata al momento del caricamento della pagina. Essa avrà il compito di effettuare il rendering del form relativo all’inserimento di un waypoint. Il
codice di tale funzione è mostrato nel Listato 6.8.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function print_form_inserisci_way_point(){
?>
<h1 align="center">Inserisci WayPoint</h1>
<div class="cotainer_block_map_wp">
<input id="pac-input" class="controls" type="text" placeholder="Enter a location" name="way_point"
onchange="hidde_button()">
<div id="map"></div>
</div>
<div class="cotainer_block_map_wp">
<input type="hidden" id="button-hidden" value="Inserisci WayPoint" onclick="document.form_ins_wp.submit()">
</div>
<?php
}
?>
Listato 6.8. Il codice della funzione print form inserisci way point
Tale funzione fa uso delle funzioni JavaScript mostrate nel Listato 6.9.
1
2
function hidde_button(){
var button_hidden = document.getElementById(’button-hidden’);
6.3 Implementazione delle funzionalità lato server
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
101
button_hidden.type=’hidden’;
}
function initMap() {
var mapOpt = {
center:new google.maps.LatLng(38.0978092,15.5313428),
zoom:10,
mapTypeId:google.maps.MapTypeId.ROADMAP
};
map=new google.maps.Map(document.getElementById("map"),mapOpt);
var myLatLng = ’’;
var marker = new google.maps.Marker({
position: myLatLng,
map: map,
title: ’Hello World!’
});
var input = (document.getElementById(’pac-input’));
var types = document.getElementById(’type-selector’);
map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
map.controls[google.maps.ControlPosition.TOP_LEFT].push(types);
var autocomplete = new google.maps.places.Autocomplete(input);
autocomplete.bindTo(’bounds’, map);
var infowindow = new google.maps.InfoWindow();
var marker = new google.maps.Marker({
map: map,
anchorPoint: new google.maps.Point(0, -29)
});
autocomplete.addListener(’place_changed’, function() {
infowindow.close();
marker.setVisible(false);
var place = autocomplete.getPlace();
if (place.geometry.viewport) {
var button_hidden = document.getElementById(’button-hidden’);
button_hidden.type=’button’;
map.fitBounds(place.geometry.viewport);
} else {
var button_hidden = document.getElementById(’button-hidden’);
button_hidden.type=’button’;
map.setCenter(place.geometry.location);
map.setZoom(17);
}
marker.setIcon(({
url: place.icon,
size: new google.maps.Size(71, 71),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(17, 34),
scaledSize: new google.maps.Size(35, 35)
}));
marker.setPosition(place.geometry.location);
marker.setVisible(true);
var coordinateDiv = document.getElementById(’coordinate_div’);
coordinateDiv.innerHTML = ’’;
var coordinate = document.createElement("input");
coordinate.type = "hidden";
coordinate.setAttribute("name", "coordinate");
coordinate.setAttribute("value", map.getCenter());
coordinateDiv.appendChild(coordinate);
var address = ’’;
if (place.address_components) {
address = [
(place.address_components[0] && place.address_components[0].short_name || ’’),
(place.address_components[1] && place.address_components[1].short_name || ’’),
(place.address_components[2] && place.address_components[2].short_name || ’’)
].join(’ ’);
}
infowindow.setContent(’<div><strong>’ + place.name + ’</strong><br>’ + address);
infowindow.open(map, marker);
});
setupClickListener(’changetype-all’, []);
setupClickListener(’changetype-address’, [’address’]);
setupClickListener(’changetype-establishment’, [’establishment’]);
setupClickListener(’changetype-geocode’, [’geocode’]);
Listato 6.9. Il codice JavaScript relativo all’auto-completamento del form e
all’inizializzazione della mappa
Le funzioni JavaScript mostrate in questo listato ricoprono un ruolo di fondamentale importanza all’interno del processo di creazione di un waypoint. Principalmente esse, tramite l’ausilio delle API di Google Map, forniscono gli strumenti
102
6 Progettazione e implementazione dei percorsi tematici
necessari alla visualizzazione di una mappa e alla gestione della compilazione di
form. Nel dettaglio, quest’ultimo aspetto eviterà l’inserimento di riferimenti geografici inesistenti e, allo stesso tempo, guiderà l’utente in tale fase, suggerendo solo
vie o punti di riferimento fisicamente rappresentabili su mappa.
Soltanto in seguito al corretto inserimento dell’input e alla conseguente creazione del marker associato, verrà visualizzato il pulsante per confermare l’inserimento
del punto. In parallelo alla visualizzazione di tale pulsante, verrà creato un tag
input nascosto a cui sarà associata la coordinata del riferimento geografico prescelto. A seguito della conferma dell’inserimento di quest’ultima informazione, come
mostrato nel Listato 6.7, verrà richiamata la funzione inserisci way point, la cui
implementazione è mostrata nel Listato 6.10.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function inserisci_way_point($way_point, $coordinare){
try {
$coordinare = str_replace("(", "", $coordinare);
$coordinare = str_replace(")", "", $coordinare);
$coordinare = explode(", ", $coordinare);
$lat= $coordinare[0];
$long= $coordinare[1];
$wp = get_waypoints();
$trovato =false;
$way_point = str_replace(",", "", $way_point);
for ($ind = 0; $ind < count($wp); $ind++) {
similar_text(strtolower($wp[$ind]->nome), strtolower($way_point), $percent);
if($percent>90){
$trovato =true;
}
}
if($trovato==false){
global $wpdb;
$query_way_point= $wpdb ->prepare ("insert into wp_waypoint(nome, latitudine, longitudine)
value(%s, %s, %s)", $way_point, $lat,
$long);
$wpdb -> query($query_way_point);
echo "<p>Way point inseriti con sueccesso</p>";
}else{
echo "<p align=’center’>wp $way_point gia presente</p>";
}
} catch (Exception $e) {
echo "<p align=’center’>waypoint non inseriti</p>";
echo ’Caught exception: ’, $e->getMessage(), "\n";
}
}
Listato 6.10. Il codice della funzione inserisci way point
Tale funzione riceve in ingresso il nome del waypoint e la sua coordinata. Una
volta ricavate la longitudine e la latitudine di quest’ultima, il sistema verificherà
la presenza del punto sul database. Nel caso in cui esso fosse assente, la funzione
procederà con l’effettuare il suo inserimento. Per evitare attacchi di tipo SQLInjection, prima di essere eseguita, la query utilizzata verrà data in ingresso alla funzione
prepare.
6.3.2 Implementazione della funzionalità relativa all’inserimento di un
percorso
Nel Listato 6.11 viene mostrato il contenuto del file inserisci percorso turistico statico.php. Esso corrisponde alla pagina di inserimento di un percorso.
1
2
<?php
get_header();
6.3 Implementazione delle funzionalità lato server
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
103
?>
<form action="" method="post">
<?php
if(isset($_POST[’Descrizione’])&&isset($_POST[’Descrizione_en’]) && $_POST[’Descrizione_es’])
&& isset($_POST[’Nome’]) $_POST[’categoria’]) && isset($_POST[’descrizione_tratte’])
&& $_POST[’descrizione_tratte_en’]) && isset($_POST[’descrizione_tratte_es’])
&& $_POST[’distance’]) && isset($_POST[’archi’]) && $_POST[’Start’])
&& isset($_POST[’End’])){
$descrizione_percorso_it= $_POST[’Descrizione’];
$descrizione_percorso_en= $_POST[’Descrizione_en’];
$descrizione_percorso_es= $_POST[’Descrizione_es’];
$nome_percorso= $_POST[’Nome’];
$categoria=$_POST[’categoria’];
$descrizione_tratte_it= $_POST[’descrizione_tratte’];
$descrizione_tratte_en= $_POST[’descrizione_tratte_en’];
$descrizione_tratte_es= $_POST[’descrizione_tratte_es’];
$distance= $_POST[’distance’];
$archi=$_POST[’archi’];
$start=$_POST[’Start’];
$end=$_POST[’End’];
$way_points=array();
array_push($way_points,$start);
foreach ($_POST[’WayPoint’] as $selected_option) {
array_push($way_points,$selected_option);
}
array_push($way_points,$end);
inserisci_percorso_turistico_completo($descrizione_percorso_it,$descrizione_percorso_en,
$descrizione_percorso_es, $nome_percorso, $categoria,
$descrizione_tratte_it, $descrizione_tratte_en,
$descrizione_tratte_es, $distance, $archi);
}
$_POST=array();
print_form_inserisci_percorso_turistico_statico();
?>
</form>
<?php
}
Listato 6.11. Il contenuto del file inserisci percorso turistico statico.php
All’interno del tag form è presente la funzione print form inserisci percorso turistico statico, la quale verrà richiamata al momento del caricamento della
pagina. Essa dividerà l’area di inserimento in più sezioni. La prima riguarderà la
selezione della categoria e l’inserimento dei dati generici; il codice per realizzazione
di tale sezione è mostrato nel Listato 6.12.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function print_form_inserisci_percorso_turistico_statico(){
$categorie = get_categorie();
?>
<div class="cotainer_block">
<fieldset>
<legend>Categorie</legend>
<select name="categoria" >";
<?php
for ($ind = 0; $ind < count($categorie); $ind++) {?>
<option value="<?php echo $categorie[$ind]->nome ?>">
<?php echo $categorie[$ind]->nome ?>
</option>
<?php }?>
</select>
</fieldset>
</div>
<div class="cotainer_block">
Nome: <input type="text" name="Nome" required />
Descrizione: <input type="text" name="Descrizione" required />
Descrizione ES: <input type="text" name="Descrizione_es" required />
Descrizione EN: <input type="text" name="Descrizione_en" required />
104
6 Progettazione e implementazione dei percorsi tematici
31
32
33
34
</div>
[...]
<?php }
Listato 6.12. La porzione di codice della funzione print form inserisci percorso turistico statico, relativo alla selezione di una categoria e all’inserimento dei dati generici
di un percorso
La prima operazione mostrata in questo listato corrisponde al recupero delle
categorie dal database e al loro inserimento all’interno di un vettore. Il contenuto di
tale vettore sarà mostrato tramite un menù a discesa in modo da permetterne la selezione dei suoi elementi. Infine, all’interno del tag <div class="cotainer block">,
verranno inseriti i campi utilizzati per la specificazione del nome e della descrizione
del percorso.
Successivamente, la funzione in esame realizzerà una seconda area dedicata alla
composizione del percorso da effettuare con il supporto di una mappa. Il codice che
ha permesso ciò e mostrato nel Listato 6.13.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
function print_form_inserisci_percorso_turistico_statico(){
[...]
$wps=get_waypoints();
?>
[...]
<div class="cotainer_block">
<b>Start:</b>
<select id="start" name="Start">
<?php for ($ind = 0; $ind < count($wps); $ind++) {?>
<option value="<?php echo $wps[$ind]->latitudine."|".$wps[$ind]->longitudine."|".
$wps[$ind]->id_waypoint?>">
<?php echo $wps[$ind]->nome?></option>
<?php}?>
</select>
<br>
<b>Waypoints:</b> <br>
<i>(Ctrl-Click for multiple selection)</i><br>
<select multiple name="WayPoint[]" id="waypoints" >
<?php for ($ind = 0; $ind < count($wps); $ind++) {?>
<option value="<?php echo $wps[$ind]->latitudine."|".$wps[$ind]->longitudine."|".
$wps[$ind]->id_waypoint?>">
<?php echo $wps[$ind]->nome?></option>
<?php}?>
</select>
<br>
<b>End:</b>
<select id="end" name="End">
<?php for ($ind = 0; $ind < count($wps); $ind++) {?>
<option value="<?php echo $wps[$ind]->latitudine."|".$wps[$ind]->longitudine."|".
$wps[$ind]->id_waypoint?>">
<?php echo $wps[$ind]->nome?></option>
<?php}?>
</select>
</div>
<div class="cotainer_block_map">
<div id="map"></div>
</div>
</div>
<div class="cotainer_botton_link">
<a id="submit" value="Testa percorso">Testa Percorso</a>
</div>
[...]
Listato 6.13. La porzione di codice della funzione print form inserisci percorso turistico statico, utilizzata per la composizione grafica di un percorso
La prima operazione effettuata dalla funzione mostrata in questo listato consiste
nel recuperare i waypoint presenti nel database. In seguito, essa creerà tre menù a
discesa per permettere la selezione del punto di partenza, del punto di arrivo e dei
punti intermedi. Infine, nel caso in cui il percorso selezionato sarà visualizzato sulla
mappa di supporto, verrà presentato un ulteriore blocco, contenente gli input per le
6.3 Implementazione delle funzionalità lato server
105
descrizioni delle singole tratte e il pulsante per confermare l’inserimento. Il codice
utilizzato per la realizzazione di quest’ultima sezione è mostrato nel Listato 6.14.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
function print_form_inserisci_percorso_turistico_statico(){
[...]
$wps=get_waypoints();
?>
[...]
<div class="cotainer_botton">
<input type="hidden" id="ins_percorso" value="Inserisci Percorso" />
</div>
<div class="cotainer_description">
<div class="cotainer_block_description">
<h1>Blocco IT</h1>
<div id="descrizione_tratte_it"></div>
</div>
<div class="cotainer_block_description">
<h1>Blocco EN</h1>
<div id="descrizione_tratte_en"></div>
</div>
<div class="cotainer_block_description">
<h1>Blocco ES</h1>
<div id="descrizione_tratte_es"></div>
</div>
</div>
<div id="directions-panel"></div>
<div id="right-panel">
<input type="hidden" id="vettore_tratte" value="">
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCBEhcmPPw2-zcQYyzSroeXglMLtEyRlw&signed_in=true&libraries=places&callback=initMap" async defer></script>
<?php }
Listato 6.14. La porzione di codice della funzione print form inserisci percorso turistico statico, che presenta gli input relativi alle descrizioni delle singole tratte
Le operazioni descritte dai listati precedenti fanno uso di un insieme di funzioni JavaScript. Queste ultime sono contenute all’interno del file denominato
support percorsi.js. Di tale file saranno descritte in dettaglio soltanto le funzioni più importanti. Il Listato 6.15 mostra l’implementazione della funzione initMap,
tramite la quale è stata realizzata la mappa utilizzata per le operazioni di testing.
1
2
3
4
5
6
7
8
9
10
11
12
function initMap() {
var directionsService = new google.maps.DirectionsService;
var directionsDisplay = new google.maps.DirectionsRenderer;
var map = new google.maps.Map(document.getElementById(’map’), {
zoom: 10,
center: {lat: 38.0978092, lng: 15.531342}
});
directionsDisplay.setMap(map);
document.getElementById(’submit’).addEventListener(’click’, function() {
var is_percorso_disponibile = calculateAndDisplayRoute(directionsService, directionsDisplay);
});
}
Listato 6.15. La funzione initMap, contenuta all’interno del file support percorsi.js
Oltre ad impostare i parametri della mappa, questa funzione associerà all’evento
di pressione del tag submit la chiamata della funzione calculateAndDisplayRoute,
tramite la quale verrà calcolata e visualizzata la rotta. Tale funzione risolverà le tre
seguenti problematiche:
•
•
•
il prelievo dei punti di partenza, di arrivo e di quelli intermedi;
il calcolo della rotta;
la creazione degli input relativi alla descrizione delle singole tratte.
Il codice relativo al recupero dei punti di partenza, di arrivo e di quelli intermedi,
selezionati tramite menù a discesa, è mostrato nel Listato 6.16.
106
6 Progettazione e implementazione dei percorsi tematici
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function calculateAndDisplayRoute(directionsService, directionsDisplay) {
var checkboxArray = document.getElementById(’waypoints’);
var latlangorig = document.getElementById(’start’).value;
var latlangorig = latlangorig.split("|");
lat_orig= latlangorig[0]; lng_orig= latlangorig[1];
try{
id_way_points.push(latlangorig[2]);
}catch(err){
alert(err.message);
}
for (var i = 0; i < checkboxArray.length; i++) {
if (checkboxArray.options[i].selected) {
var latlangwp =checkboxArray[i].value;
var latlangwp =latlangwp.split("|");
var lat_orig_wp= latlangwp[0]; var lng_orig_wp= latlangwp[1];
try{
id_way_points.push( latlangwp[2]);
}catch(err){
alert(err.message);
}
waypts.push({
location: new google.maps.LatLng(lat_orig_wp, lng_orig_wp),
stopover: true
});
}
}
var latlangdest = document.getElementById(’end’).value;
var latlangdest = latlangdest.split("|");
lat_dest= latlangdest[0];
lng_dest= latlangdest[1];
try{
id_way_points.push(latlangdest[2]);
}catch(err){
alert(err.message);
}
[...]
}
Listato 6.16. La porzione di codice della funzione calculateAndDisplayRoute, utilizzata
per il recupero dei punti del percorso
Una volta recuperati tali dati, essi verranno inseriti all’interno di opportune
variabili. Queste saranno utilizzate per il calcolo del percorso. Il codice che permette
di effettuare quest’ultima operazione è mostrato nel Listato 6.17.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try{
directionsService.route({
origin: new google.maps.LatLng(lat_orig, lng_orig),
destination: new google.maps.LatLng(lat_dest, lng_dest),
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING
}, function(response, status) {
if (status == google.maps.DirectionsStatus.OK) {
[...]
}
});
}catch(err){
alert("errore calcolo rotta "+err.message);
}
Listato 6.17. La porzione di codice della funzione calculateAndDisplayRoute, utilizzata
per il calcolo del percorso
La funzione route, applicata all’oggetto directionsService, permetterà di
calcolare il percorso. Essa riceverà in ingresso il punto di partenza, il punto di
arrivo, il vettore dei waypoint e la modalità di percorrenza. Nel caso in cui
le informazioni utilizzate da tale funzione porteranno alla creazione di un per-
6.3 Implementazione delle funzionalità lato server
107
corso, verrà eseguito il codice contenuto all’interno dell’istruzione if (status
==google.maps.DirectionsStatus.OK). Tale codice è mostrato nel Listato 6.18.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
[...]
var input_ins_percorso = document.getElementById(’ins_percorso’);
input_ins_percorso.setAttribute("type","submit");
directionsDisplay.setDirections(response);
var route = response.routes[0];
var summaryPanel = document.getElementById(’directions-panel’);
summaryPanel.innerHTML = ’’;
var container_descrizione_tratte = document.
getElementById(’descrizione_tratte_it’);
container_descrizione_tratte.innerHTML = ’’;
var container_descrizione_tratte_en = document.
getElementById(’descrizione_tratte_en’);
container_descrizione_tratte_en.innerHTML = ’’;
var container_descrizione_tratte_es = document.
getElementById(’descrizione_tratte_es’);
container_descrizione_tratte_es.innerHTML = ’’;
var id_it="";
var id_en="";
var id_es="";
for (var i = 0; i < route.legs.length; i++) {
var input = document.createElement("input");
input.type = "hidden";
input.setAttribute("id", i+1);
input.setAttribute("name", "distance[]");
input.setAttribute("value", route.legs[i].distance.text);
summaryPanel.appendChild(input);
id_it="id"+i;
id_en="id"+i+1;
id_es="id"+i+2;
var
var
var
var
var
start = route.legs[i].start_address;
end = route.legs[i].end_address;
arr=route.legs[i];
start = start.replace(",","");
end = end.replace(",","");
var input_archi = document.createElement("input");
input_archi.type = "hidden";
input_archi.setAttribute("name", "archi[]");
input_archi.setAttribute("value", id_way_points[i]+"|"+
id_way_points[i+1]);
summaryPanel.appendChild(input_archi);
var descrizione_it=""; var descrizione_en=""; var descrizione_es="";
jQuery.ajax({
type:’GET’,
url: "/verifica_esistenza_arco/?origin=" + start + "&
destination=" + end,
crossDomain: true,
dataType: "json",
async: false,
success: function (jsonData) {
var data=eval(jsonData);
data.forEach(function(a){
descrizione_it=a.it; descrizione_en=a.en;
descrizione_es=a.es;
});
},error: function (e) {
alert(e.message);
}
});
var input_it = document.createElement("input");
input_it.type = "text";
input_it.setAttribute("id", id_it);
input_it.setAttribute("name", "descrizione_tratte[]");
if(descrizione_it!=""){
input_it.setAttribute("value", descrizione_it);
input_it.setAttribute("readOnly", true);
}
var label_input_it = document.createElement("label");
label_input_it.setAttribute("for",id_it);
label_input_it.innerHTML = "Descrizione-IT Tratta: "+start+"|"+end;
var input_en = document.createElement("input");
input_en.type = "text";
input_en.setAttribute("id", id_en);
input_en.setAttribute("name", "descrizione_tratte_en[]");
if(descrizione_en!="") {
input_en.setAttribute("value", descrizione_en);
input_en.setAttribute("readOnly", true);
108
6 Progettazione e implementazione dei percorsi tematici
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
}
var label_input_en = document.createElement("label");
label_input_en.setAttribute("for",id_en);
label_input_en.innerHTML = "Descrizione-EN Tratta: "+start+"|"+end;
var input_es = document.createElement("input");
input_es.type = "text";
input_es.setAttribute("id", id_es);
input_es.setAttribute("name", "descrizione_tratte_es[]");
if(descrizione_es!="") {
input_es.setAttribute("value", descrizione_es);
input_es.setAttribute("readOnly", true);
}
var label_input_es = document.createElement("label");
label_input_es.setAttribute("for",id_es);
label_input_es.innerHTML = "Descrizione-ES Tratta: "+start+"|"+end;
container_descrizione_tratte.appendChild(label_input_it);
container_descrizione_tratte.appendChild(input_it);
container_descrizione_tratte_en.appendChild(label_input_en);
container_descrizione_tratte_en.appendChild(input_en);
container_descrizione_tratte_es.appendChild(label_input_es);
container_descrizione_tratte_es.appendChild(input_es);
[...]
Listato 6.18. La porzione di codice della funzione calculateAndDisplayRoute, utilizzata
per la creazione di input testuali
La prima istruzione mostrata in questo listato corrisponde alla creazione del
pulsante con il quale si potrà confermare l’inserimento del percorso. In seguito si
preleveranno i riferimenti dei tag HTML che avranno il compito di incapsulare le
descrizioni delle tratte. Per ogni tratta del percorso assemblato, verranno eseguite
le seguenti operazioni:
•
•
•
Il prelievo del punto di inizio, del punto di fine e della lunghezza.
La verifica dell’esistenza della tratta tramite una chiamata AJAX. Essa contatterà
un file PHP il quale interrogherà il database per ricercare il dato richiesto. Nel
caso in cui la ricerca restituirà un risultato, questo verrà reso disponibile nel
formato JSON. Al verificarsi di quest’ultimo caso, la tratta recuperata verrà
associata al percorso, evitando, cosı̀, di crearne una nuova.
L’inserimento dei tag relativi alla descrizione all’interno dei propri container.
7
Manuale utente
Questo capitolo rappresenta un manuale d’uso dell’applicazione realizzata. In particolare, il suo scopo è quello di illustrare le modalità di utilizzo che gli utenti dovranno
seguire per sfruttare correttamente l’applicazione. Verranno descritti, inoltre, tutti i
servizi forniti dal sistema e verranno analizzate le schermate principali con cui l’utente dovrà interagire. Nello specifico, verranno mostrate le corrispettive schermate
relative ad un dispositivo iOS e ad un dispositivo Android.
7.1 Introduzione
L’applicazione EnjoyRC ha lo scopo di guidare l’utente durante il suo soggiorno
nella provincia di Reggio Calabria; si tratta, quindi, di una guida turistica di facile
consultazione, sempre a disposizione sul proprio dispositivo mobile. Il turismo “fai
da te” ha assunto, negli ultimi anni, uno sviluppo molto importante; sono sempre più
numerosi, infatti, i turisti che preferiscono organizzare autonomamente la propria
vacanza, magari con l’ausilio delle numerose app disponibili o sfruttando i tanti siti
Web del settore.
EnjoyRC può essere considerata il punto di partenza per un soggiorno nella provincia reggina; essa fornisce informazioni e curiosità sui luoghi, organizza percorsi
turistici, e consiglia hotel e locali presenti sul territorio. Allo stesso tempo, EnjoyRC
rappresenta una finestra multimediale sulla città alla quale tutti i cittadini possono
affacciarsi. Una caratteristica dell’applicazione in questione è la semplicità di utilizzo; le schermate con cui l’utente si troverà a interagire saranno user friendly ed
essenziali, tipiche dei sistemi per dispositivi mobili, che riescono a combinare una
grafica accattivante, ma essenziale, a buone funzionalità.
Di seguito verranno mostrate tutte le schermate relative alle macro-aree del
sistema.
7.2 La Home Page
Tutte le macro-aree presenti nell’applicazione sono direttamente accessibili dalla Home Page del sistema. Nella Figura 7.1 è possibile osservare la semplice organizzazione
della stessa.
110
7 Manuale utente
Figura 7.1. La Home Page dell’applicazione EnjoyRC
L’utente potrà accedere alle macro-aree disponibili ed usufruire di tutti i servizi
implementati sfruttando il menù visualizzato in primo piano e le due icone disposte
sulla navigation bar. Le macro-aree raggiungibili attraverso il menù centrale sono
le seguenti:
•
•
•
•
•
•
•
•
Punti di interesse;
Ristorazioni;
Pernottamenti;
Percorsi;
Servizi primari;
Svaghi;
La città;
Eventi.
Le due macro-aree raggiungibili attraverso le icone presenti sulla navigation bar
sono le seguenti:
•
•
Drawer menù;
Ricerca.
7.4 La sezione “Ricerca”
111
7.3 Il Drawer Menu
Il Drawer Menu, mostrato in Figura 7.2, permetterà all’utente di accedere all’area
dell’applicazione in cui sono contenute le informazioni generali della stessa.
Figura 7.2. Il Drawer Menu dell’applicazione EnjoyRC
Esso è costituito da quattro voci di menù:
•
•
•
•
Credits: fornirà le informazioni su coloro che hanno contribuito alla realizzazione
di EnjoyRC;
Manual: fornirà alcune indicazioni per l’utilizzo dell’applicazione;
Rate EnjoyRC: da tale sezione si verrà reindirizzati al market-place specifico,
per il rilascio di recensioni e votazioni;
Exit: permetterà di uscire dall’app.
Tra queste, le più importanti risultano essere Credits e Manual, le cui schermate
vengono mostrate in Figura 7.3.
7.4 La sezione “Ricerca”
La pagina relativa alle funzionalità di ricerca sarà divisa in due aree differenti.
La prima, situata nella parte alta della schermata, permetterà all’utente di inserire una parola chiave per effettuare una ricerca generica all’interno dei contenuti
112
7 Manuale utente
Figura 7.3. Le sezioni Credits e Manual, accessibili dal Drawer Menu dell’applicazione
EnjoyRC
7.4 La sezione “Ricerca”
113
dell’applicazione. La seconda in basso permetterà all’utente di avviare una ricerca
personalizzata. In Figura 7.4 è possibile osservare la schemata appena descritta e il
risultato di una ricerca generica.
Figura 7.4. Le sezioni di ricerca dell’applicazione EnjoyRC
Nel caso della ricerca personalizzata, l’utente potrà selezionarne l’ambito cliccando sul corrispondente pulsante. Fatto ciò, sarà reindirizzato alla pagina che per-
114
7 Manuale utente
metterà di effettuare le operazioni di setting mediante filtri prestabiliti. In Figura
7.5 viene mostrata la schermata contenente i filtri di ricerca.
Figura 7.5. Le pagina contente i filtri per la ricerca personalizzata
7.5 La sezione “Punti di interesse”
115
7.5 La sezione “Punti di interesse”
Selezionando dalla Home Page l’icona corrispondente, l’utente sarà reindirizzato alla
schermata contenente le categorie dei punti di interesse memorizzate nel sistema
(Figura 7.6).
Figura 7.6. Le pagina contenente le categorie dei punti di interesse
Selezionando una specifica categoria, verrà mostrata la lista dei punti di interesse
ad essa associati. Tale lista è rappresentata nella Figura 7.7.
L’utente potrà visualizzare il dettaglio di uno specifico elemento della lista cliccando su di esso. A seguito di ciò, si aprirà una nuova schermata in cui verranno
organizzate tutte le informazioni relative a quel dato punto di interesse. La pagina
di dettaglio è mostrata nella Figura 7.8.
Nella medesima schermata si potrà scegliere di visualizzare la mappa contenente
le informazioni per raggiungere tale punto (Figura 7.9). L’applicazione preleverà
automaticamente la posizione del dispositivo e calcolerà il tragitto più breve. Allo
stesso tempo, essa permetterà di scegliere la modalità di percorrenza. Nel caso in
cui il GPS del dispositivo non fosse in funzione, l’utente potrà digitare e scegliere
manualmente il punto di partenza.
116
7 Manuale utente
Figura 7.7. La pagina contenente la lista dei punti di interesse associati ad una categoria
Figura 7.8. Le pagina contenente il dettaglio di un punto di interesse
7.6 Le macro-aree relative alle attività commerciali
117
Figura 7.9. La pagina contenente la mappa relativa ad un punto di interesse
7.6 Le macro-aree relative alle attività commerciali
7.6.1 La sezione “Ristorazioni”
La sezione relativa alle ristorazioni conterrà tutte le informazioni riguardanti le attività del comparto eno-gastronomico. Tale sezione presenterà una struttura simile
a quella relativa ai punti di interesse precedentemente descritta. Al primo livello, il
sistema presenterà all’utente la categorizzazione dei vari punti di ristorazione (Figura 7.10); da essa egli potrà scegliere una delle categorie visualizzate e procedere alla
navigazione. La schermata successiva che gli verrà mostrata conterrà la lista dei locali appartenenti alla categoria precedentemente scelta (Figura 7.11). Selezionando
un dato locale, si verrà reindirizzati alla pagina di dettaglio (Figura 7.12).
In tale pagina verranno visualizzate una serie di informazioni relative al locale,
ovvero:
•
•
•
•
•
•
•
l’icona caratterizzante le ristorazioni;
il recapito telefonico;
il sito web;
la descrizione;
il giorno di chiusura;
gli orari di apertura e chiusura;
le icone rappresentanti i servizi offerti.
118
7 Manuale utente
Figura 7.10. La pagina contenente le categorie dei punti di ristorazione
Figura 7.11. La pagina contenente i punti di ristorazione associati ad una determinata
categoria
7.7 La sezioni “Percorsi turistici statici”
119
Figura 7.12. La pagina di dettaglio relativa ad un punto di ristorazione
Infine, si potranno consultare le informazioni stradali per raggiungere il locale
accedendo alla sezione dedicata. Tale sezione è mostrata nella Figura 7.13.
7.6.2 Le sezioni “Pernottamenti” e “Svaghi”
Tali sezioni conterranno le informazioni relative ai punti di pernottamento e di svago
presenti in città. L’organizzazione dei contenuti e le funzioni usufruibili dall’utente
in tale sezione sono le medesime rispetto a quelle precedentemente descritte nella
sezione “Ristorazione”. Per tale motivo verranno mostrate esclusivamente le pagine
di primo livello (Figura 7.14 e 7.15).
7.7 La sezioni “Percorsi turistici statici”
Un’altra importante sezione dell’applicazione EnjoyRC è quella relativa ai percorsi
turistici statici. Il sistema offrirà all’utente l’opportunità di consultare vari percorsi
turistici prestabiliti e categorizzati sulla base di una tipologia. Nella Figura 7.16
sono mostrate le tre categorie presenti, tra le quali sarà possibile scegliere.
Selezionando una particolare categoria, verranno mostrati sullo schermo tutti
gli itinerari ad essa associati (Figura 7.17). A questo punto, l’utente potrà accedere
all’area di dettaglio di un particolare percorso e visualizzare, cosı̀, quante più informazioni possibili riguardanti tale itinerario. Nell’area di dettaglio verranno mostrate
la mappa dell’intero percorso e una descrizione generale dello stesso (Figura 7.18).
120
7 Manuale utente
Figura 7.13. La pagina contenente la mappa relativa ad un punto di ristorazione
Figura 7.14. La pagina contenente la categorie dei pernottamenti
7.7 La sezioni “Percorsi turistici statici”
Figura 7.15. La pagina contenente la categorie degli svaghi
Figura 7.16. La pagina contenente le categorie dei percorsi turistici
121
122
7 Manuale utente
Tale sezione, rispetto a quelle precedentemente illustrate, presenterà un ulteriore
livello di dettaglio nel quale verranno descritte le tratte in cui ogni percorso può
essere suddiviso. Nella Figura 7.19 viene mostrata la pagina di dettaglio relativa ad
una tratta specifica di un percorso.
Figura 7.17. La pagina contenente la lista dei percorsi turistici associati ad una specifica
categoria
7.8 La sezioni “Servizi primari”
Tale sezione fornirà all’utente informazioni utili riguardanti i principali servizi offerti
dalla città. In questo caso è stata adottata una doppia categorizzazione, organizzando i servizi prima per tipologia e dopo per contesto di riferimento. La struttura
utilizzata per la visualizzazione dei servizi e delle categorie ad essi associate risulta simile a quelle precedentemente analizzate. L’unica differenza è riscontrabile nel
livello di dettaglio mostrato nella Figura 7.20.
7.9 La sezioni “Eventi”
La pagina principale di tale sezione prevede una struttura abbastanza semplice,
in cui verrà visualizzata una classificazione degli eventi (Figura 7.21). Cliccando
7.9 La sezioni “Eventi”
123
Figura 7.18. La pagina contenente il dettaglio di un percorso turistico
Figura 7.19. La pagina contenente il dettaglio di una delle tratte in cui è suddiviso un
percorso turistico
124
7 Manuale utente
Figura 7.20. La pagina contenente il dettaglio di un servizio primario
sull’apposito pulsante, l’utente accederà alla pagina di secondo livello nella quale
saranno visualizzati tutti gli eventi legati all’ambito scelto in precedenza. Nella
Figura 7.22 viene mostrata la schermata contenente la lista degli eventi. Come è
possibile osservare, si tratta di una lista che visualizza molti più dettagli rispetto
a quelli precedentemente visualizzati. Per ogni evento, infatti, saranno visualizzati
la data, il luogo e il nome. Tale lista mostrerà gli eventi dal più recente al meno
recente.
L’utente potrà selezionare ciascun elemento della lista; a seguito di un’operazione
di selezione, egli potrà accedere all’area di dettaglio nella quale saranno mostrati la
locandina, la descrizione, la data, l’ora e il luogo (Figura 7.23).
7.10 La sezione “La città”
Dalla Home Page dell’applicazione sarà possibile accedere alla sezione “La città”.
Essa conterrà una serie di informazioni generali riguardanti la città di Reggio Calabria. La prima schermata che il sistema visualizzerà all’utente (Figura 7.24),
conterrà una breve descrizione e un menù per accedere alle seguenti sotto-sezioni:
•
•
•
•
Come arrivarci;
Come visitarla;
Negozi di prodotti tipici;
Tradizioni.
7.10 La sezione “La città”
Figura 7.21. La pagina contenente le categorie degli eventi
Figura 7.22. La pagina contenente la lista degli eventi
125
126
7 Manuale utente
Figura 7.23. La pagina contenente il dettaglio di un evento
Figura 7.24. La Home Page della sezione “La città”
7.10 La sezione “La città”
127
Le view di queste sotto-sezioni sono rappresentate nelle Figure 7.25, 7.26, 7.27
e 7.28
Figura 7.25. La pagina contenente le indicazioni stradali per raggiungere la città
128
7 Manuale utente
Figura 7.26. La pagina contenente le informazioni utili a visitare la città
Figura 7.27. La pagina contenente l’elenco dei negozi di prodotti tipici presenti in città
7.10 La sezione “La città”
Figura 7.28. La pagina contenente la lista delle tradizioni calabresi
129
8
Confronto con sistemi correlati
In questo capitolo verrà proposta un’analisi comparativa dell’applicazione EnjoyRC.
In particolare, verranno considerati diversi sistemi del settore turistico con caratteristiche simili a quello descritto in questa tesi, evidenziando, per ciascuno di essi, le
analogie e le differenze con la nostra applicazione. L’analisi comparativa è preceduta
da una disamina attenta dei principali punti di forza e di debolezza di EnjoyRC.
8.1 Punti di forza
Per la realizzazione dell’applicazione EnjoyRC abbiamo tenuto in considerazione
i principi teorizzati dalla User Experience Design (UXD). Un’applicazione mobile,
infatti, deve racchiudere tutte le funzionalità di un normale sito Internet e riadattare
i contenuti in modo da essere facilmente e velocemente consultabile in mobilità. I
principi della UXD applicati alle applicazioni mobili hanno permesso di concentrarsi
sulle esigenze dell’utente, ottimizzando il prodotto finale.
Tali principi ci hanno guidato nella realizzazione della logica che sta alla base dell’applicativo e nella realizzazione della componente grafica alla base dell’interazione
con gli utenti.
La semplicità di utilizzo, l’organizzazione e la completezza dei contenuti, nonchè
la chiarezza dell’interfaccia sono i presupposti irrinunciabili per qualsiasi nuova proposta che intenda generare apprezzamento nel mondo delle guide turistiche per i
dispositivi mobili.
La presente sezione ha lo scopo di presentare e di illustrare i punti di forza del
sistema sviluppato. Nello specifico, EnjoyRC :
•
•
•
•
•
•
risulta essere disponibile per le piattaforme Android e iOS;
risulta essere compatibile sia per smartphone che per tablet;
sfrutta al minimo le risorse hardware e software, in quanto il carico computazionale è rivolto maggiormente sulla componente server;
è basata sui principi della UXD;
offre un contenuto informativo dinamico, in quanto i dati visualizzati non
risiedono nello smartphone ma in un server esterno;
fornisce la possibilità di usufruire delle mappe con e senza l’utilizzo del GPS;
132
•
•
8 Confronto con sistemi correlati
permette di sponsorizzare le attività e, in generale, i punti di interesse dislocati
sul territorio reggino;
risulta essere multi-lingua.
I punti di forza appena citati rendono il sistema da noi realizzato particolarmente
efficiente ed innovativo. La principale innovazione riguarda l’adozione di alcune delle
migliori tecnologie di ultima generazione riguardanti lo sviluppo di applicazioni
mobile e web.
Nello specifico, si è scelto di utilizzare una delle migliori piattaforme per lo
sviluppo di applicazioni mobile ibride, ovvero AppGyver, che integra al suo interno
i principali vantaggi forniti dal framework AngularJS, ad oggi ritenuto la punta di
diamante del linguaggio JavaScript.
Sfruttando le caratteristiche delle tecnologie appena citate, è stato possibile
realizzare un’applicazione multipiattaforma compatibile con tutti gli smartphone e
i tablet delle famiglie Google ed Apple.
Anche se l’applicativo risiede su un dispositivo mobile, esso riesce a fornire un
supporto efficiente, utilizzando un quantitativo di risorse minimo, senza appesantire
il dispositivo che lo ospita con un carico computazionale elevato. Oltre a tutto ciò,
è importante evidenziare il fatto che la maggior parte della logica che permette
la realizzazione di tutte le funzionalità è concentrata sulla componente server del
sistema su cui l’applicativo si appoggia; grazie a ciò il complesso delle funzionalità
offerte non grava in maniera considerevole sulle risorse hardware e software del
dispositivo.
Utilizzando le linee guida fornite dallo User Experience Design è stata realizzata
un’interfaccia grafica gradevole e per niente complessa, che favorisce l’interazione
con gli utenti.
Il sistema realizzato rappresenta una guida turistica dettagliata e completa per
i turisti che volessero visitare i luoghi più belli della provincia reggina, ma anche,
al contempo, un punto di riferimento per i cittadini. Esso, per fornire un supporto
concreto ai turisti, è stato pensato in modo tale da poter visualizzare i contenuti
nelle lingue italiano, inglese e spagnolo.
EnjoyRC guiderà l’utente in maniera interattiva, mediante la proposta di alcuni
itinerari specifici e l’integrazione dei servizi di geolocalizzazione offerti da Google
Map.
8.2 Punti di debolezza
I punti di debolezza del sistema EnjoyRC sono i seguenti:
•
•
•
•
•
assenza di un meccanismo che gestisca la profilazione dell’utente;
impossibilità di creare un percorso turistico personalizzato;
impossibilità di usufruire dei contenuti in modalità off-line e di memorizzarli tra
i preferiti;
assenza di un sistema distribuito per la gestione dei dati;
mancanza di compatibilità per Windows Phone.
8.3 Confronto con sistemi correlati
133
L’assenza di un meccanismo di profilazione non permette ad un utente di visualizzare lo storico delle sue operazioni su dispositivi differenti; ad esempio, egli non
potrà tenere traccia dei percorsi già intrapresi o dei luoghi già visitati.
La sezione dedicata ai percorsi turistici non offre la possibilità di creare un nuovo
percorso turistico personalizzandone l’itinerario.
Per il momento, la consultazione dei contenuti offerti dall’applicazione potrà
avvenire esclusivamente in presenza di una connessione Internet, a causa dell’assenza
di un meccanismo di storage locale. Questo comporta l’impossibilità di memorizzare
localmente i contenuti preferiti.
Tutte le informazioni visualizzate dall’utente risiedono attualmente in un unico server. Un malfunzionamento dello stesso causerà l’impossibilità di usufruire,
temporaneamente, dei servizi offerti dall’app.
Infine, non è stata ancora prevista una versione compatibile con il sistema
operativo Windows Phone.
Questi punti di debolezza verranno eliminati nei futuri rilasci dell’applicazione.
La loro attuale presenza non nasce da una cattiva progettazione, ma dal fatto che
si è datà priorità ai quei requisiti che hanno permesso di informatizzare il contesto
scelto nel modo più efficiente possibile.
8.3 Confronto con sistemi correlati
Di seguito verranno elencate alcune delle applicazioni mobili, legate al mondo del
turismo, che hanno l’obbiettivo di guidare i viaggiatori durante la visita di alcune
città italiane o alcune località geografiche sparse per il mondo. Per ciascuna di esse
verrà effettuato un confronto con l’applicativo descritto in questa tesi, evidenziando
tutte le analogie e le differenze. Le applicazioni prese in esame sono:
•
•
•
•
•
•
Tutto Calabria in App;
Bergamo City Tour;
Venezia Unica;
Neslo Barcellona;
Dubai mappa online e guida turistica;
World Explorer.
8.3.1 Tutto Calabria in App
Tutto Calabria in App è una delle poche applicazioni dedicate alla regione Calabria
che focalizza la propria attenzione sulle attività commerciali, gli eventi e le news
relativi alle cinque provincie calabresi.
Tale applicazione raggruppa tutte le aziende, le imprese locali, le associazioni,
gli enti pubblici, e molto altro, in un unico grande menu a cascata; inoltre, la loro
locazione viene riportata su mappa.
Ciò che caratterizza maggiormente Tutto Calabria in App è, appunto, lo stretto
legame tra le informazioni contenute e la loro rappresentazione geografica. L’utente
interagirà quasi unicamente con il menu laterale, mostrato nella Figura 8.1, dal
quale potrà selezionare la categoria di interesse; successivamente, sarà reindirizzato
134
8 Confronto con sistemi correlati
Figura 8.1. Il menù laterale dell’applicazione Tutto Calabria in App
alla mappa geografica. Su tale mappa saranno mostrati gli elementi relativi alla
categoria precedentemente selezionata.
La mappa geografica conterrà le informazioni di base relative all’attività scelta.
Le informazioni usufruibili sono le seguenti: numero di telefono, indirizzo e-mail,
sito web e link immediato a Google Maps.
Allo stesso tempo, tale applicazione fornisce la possibilità di consultare un’ampia
galleria fotografica, la quale potrà essere aggiornata direttamente dagli enti pubblici
e dalle associazioni che promuovono il turismo.
L’applicazione che si sta analizzando, pur fornendo una vasta gamma di categorie tra le quali scegliere nonchè un ottimo supporto alle mappe e ai servizi di
geolocalizzazione, presenta alcuni punti deboli che è necessario sottolineare. Tra
questi è possibile elencare i seguenti:
•
•
•
•
le schede di dettaglio relative ad un punto di interesse o ad un’attività non sono
particolarmente esaustive;
l’organizzazione dei contenuti non permette una navigazione semplice ed immediata tra gli stessi;
le indicazioni stradali sono usufruibili tramite l’utilizzo di Google Maps;
la mole di dati presenti nel sistema risulta essere insufficiente.
8.3 Confronto con sistemi correlati
135
Analogie
A seguito di un’attenta analisi del sistema descritto in precedenza sono state individuate alcune analogie con l’applicazione oggetto del presente lavoro di tesi. Tutto
Calabria in App organizza i contenuti basandosi su un’attenta categorizzazione degli
stessi. Allo stesso tempo, ad ogni elemento rappresentato viene associato un servizio
di localizzazione. Essa è stata sviluppata per i sistemi operativi Android e iOS.
Differenze
Tale applicazione, pur adottando una suddivisione dei contenuti per categorie, non
prevede un’organizzazione delle stesse in sezioni dedicate. Per quanto detto in precedenza, dunque, l’organizzazione dei contenuti risulta essere quasi totalmente differente rispetto a quella adottata da EnjoyRC. Ogni azione da parte dell’utente sarà
gestita da un menù laterale a cascata che non permette una chiara visualizzazione
dei contenuti. L’utente sarà, dunque, costretto ad usufruire continuamente di una
lunghissima lista di difficile consultazione.
La Home Page di Tutto Calabria in App, pur prevedendo cinque differenti pulsanti, reindirizzerà l’utente sempre alla medesima pagina. Tale schermata conterrà
una grande mappa geografica in primo piano priva di utilità e il menù a cascata
accessibile dalla navigation bar. In EnjoyRC invece, la Home Page rappresenta il
punto di partenza essenziale per la navigazione tra i contenuti e per accedere alle
funzionalità previste dall’applicazione.
Un’altra differenza rilevante tra le due applicazioni è legata alla sezione “Percorsi”. Tutto Calabria in App non prevede, infatti, una sezione in cui sono riportati dei
percorsi turistici ed degli itinerari da consultare. Tale sezione, invece, rappresenta
uno dei punti di forza del nostro applicativo. Infine, l’app descritta non può essere
consultata in lingua spagnola.
8.3.2 Bergamo City Tour
Bergamo City Tour è un’applicazione turistica ideata e realizzata dal Comune di
Bergamo, in collaborazione con numerosi enti, con lo scopo di pubblicizzare la città
lombarda. Tale applicazione offre la possibilità ai turisti di essere guidati attraverso
la città, seguendo tre differenti itinerari, e di conoscere i principali punti di interesse
presenti sul territorio.
I contenuti dell’applicazione, ad eccezione degli eventi giornalieri e dei contenuti
multimediali, sono accessibili in modalità offline, ovvero fruibili senza la presenza
di una connessione Internet. Il punto di accesso dell’applicazione è una Home Page
organizzata a tile (Figura 8.2).
Ciascun tile consente l’accesso a una differente sezione dell’applicazione. I tile
della Home Page presentano tutti la medesima forma e dimensione, eccezione fatta
per quello relativo agli itinerari che è più grande, per rimarcare l’importanza di
quest’ultima.
L’applicazione contiene oltre 100 punti di interesse presentati con sintetici testi descrittivi, immagini e curiosità. Un’area specifica dell’applicazione è dedicata
136
8 Confronto con sistemi correlati
Figura 8.2. La Home Page dell’applicazione Bergamo City Tour
a divertenti quiz relativi alla città e alla provincia. Sulle piattaforme iOS, ad eccezione degli eventi, i quali sono visualizzati in lingua italiana, tutti i contenuti
dell’applicazione sono presentati in lingua inglese.
Analogie
L’applicazione che si sta analizzando presenta molti aspetti comuni con il nostro
sistema. Di seguito sono elencate le principali analogie:
•
•
•
•
•
•
tutte le sezioni dell’applicazione sono accessibili dalla Home Page;
ogni sezione presenta una categorizzazione dei contenuti in modo da facilitare la
navigazione;
la funzionalità di ricerca è accessibile mediante una specifica icona presente sulla
navigation bar;
l’attenzione è focalizzata sulla sezione dei percorsi turistici;
il sistema risulta essere multipiattaforma;
la struttura dei primi livelli di navigazione visualizza le categorie dei contenuti.
8.3 Confronto con sistemi correlati
137
Differenze
L’applicazione analizzata, pur presentando numerose analogie con il nostro sistema,
si differenzia da esso per alcuni importanti aspetti. Tra questi risulta essere di particolare rilevanza la funzionalità relativa alla ricerca. Accedendo all’area specifica, si
potrà effettuare una ricerca generica esclusivamente all’interno della sezione “attrazioni” non comprendendo tutti gli altri contenuti. Allo stesso tempo, da tale area non
sarà possibile filtrare i risultati mediante un’operazione di ricerca personalizzata.
Infine, un’ulteriore differenza da sottolineare riguarda l’assenza della sezione
relativa ai punti di pernottamento, compensata dalla presenza delle sezioni “Quiz”
e “Gallery”, assenti in EnjoyRC.
8.3.3 Venezia Unica
Venezia Unica è un progetto curato dalla testata giornalistica telematica ARTE.it.
Essa rappresenta un sistema introdotto dalla città di Venezia per accedere ai servizi
di trasporto, culturali e turistici del territorio. Nello specifico, Venezia Unica è
indirizzata sia al turista che ai cittadini veneziani.
Venezia Unica è un supporto utile per conoscere i punti di interesse storico e
artistico di Venezia: musei, mostre, piazze, monumenti, chiese, palazzi e giardini. Si
possono consultare gli orari ufficiali del trasporto pubblico locale e organizzare al
meglio gli spostamenti in città. Grazie alla georeferenziazione dei punti di interesse,
è possibile programmare la visita in base al tempo a disposizione. L’applicazione
contiene la descrizione di oltre 300 punti di interesse, schede descrittive corredate
da immagini e biografie di artisti.
Allo stesso tempo, è possibile accedere ad informazioni riguardanti luoghi di
divertimento, ristoranti, mercati e librerie.
Venezia Unica fornisce il calendario aggiornato degli eventi d’arte in corso e in
programmazione (mostre, eventi ed esposizioni d’arte) con una breve descrizione
dell’evento e con la relativa localizzazione.
Inoltre, questa applicazione fornisce le informazioni riguardanti gli appuntamenti
di arte e cultura che si svolgono in città. In Figura 8.3 viene mostrata una schermata
dell’applicazione.
Analogie
L’applicazione Venezia Unica permette di accedere ai contenuti attraverso un pratico menù che occupa l’intera Home Page. Ogni sezione, analogamente a quanto
avviene per EnjoyRC, è caratterizzata da una specifica icona. L’area di dettaglio di
un singolo contenuto presenta molti campi in comune con la nostra applicazione,
consentendo di geolocalizzare, laddove possibile, il contenuto scelto.
Differenze
Uno dei principali servizi offerti dall’applicazione Venezia Unica, non previsto da
EnjoyRC, è quello relativo ad una mappa interattiva, che permette di geolocalizzare
138
8 Confronto con sistemi correlati
Figura 8.3. Una schermata dell’applicazione Venezia Unica
l’utente e, per ogni elemento di interesse, riporta sulla stessa la sua posizione. Inoltre, Venezia Unica prevede alcune sezioni non presenti in EnjoyRC, ovvero quelle
contenenti le cartoline e quella relativa agli artisti veneziani.
Pur prevedendo un’area relativa ad itinerari statici, Venezia Unica presenta una
struttura e un livello di dettaglio differente rispetto a quello da noi adottato.
8.3.4 Neslo Barcellona
Neslo Barcellona è un’applicazione turistica dedicata alla città spagnola di Barcellona, contenente migliaia di riferimenti a località, punti interesse e attività commerciali. Tale applicazione presenta quattro pagine principali, raggiungibili mediante
una tab bar:
•
•
•
Cerca: rappresenta la pagina iniziale dell’applicazione. Essa contiene la lista delle
otto sezioni che possono essere consultate. All’interno della medesima pagina
sarà possibile effettuare una ricerca su tutti i contenuti grazie al form presente
sulla parte superiore della stessa.
Mappa: contiene una mappa della città di Barcellona.
Trasporto: mostra, all’interno di una mappa, gli itinerari di tutti i mezzi pubblici.
8.3 Confronto con sistemi correlati
•
139
Preferiti: mostra tutti i contenuti dell’applicazione segnalati dall’utente come
preferiti.
La schermata in cui vengono visualizzate le otto sezioni dell’app risulta essere
quella più importante. A partire da essa, l’utente potrà consultare i vari contenuti
(Figura 8.4).
Figura 8.4. La Home Page dell’applicazione Neslo Barcellona
Analogie
Neslo Barcellona presenta numerosissime analogie con l’applicazione da noi sviluppata. Anch’essa adotta una suddivisione netta in macro-aree, accessibili dalla
Home Page. Inoltre, Neslo Barcellona offre la possibilità di estendere le operazioni
di ricerca a tutti i contenuti e di applicare particolari filtri.
Per quanto riguarda i punti di interesse e le attività, anche quest’app permette di
geolocalizzarli su mappa. La categorizzazione che tale applicazione offre rispecchia
quasi totalmente quella da noi adottata.
140
8 Confronto con sistemi correlati
Differenze
Neslo Barcellona offre la possibilità di accedere direttamente al sito booking.com per
poter effettuare la prenotazione di un hotel presente in città.
Per quanto riguarda la lista dei contenuti, oltre alla sua visualizzazione integrale,
sarà possibile adottare un filtro sulla base dell’orario di apertura o rispetto alla posizione attuale. Per quanto riguarda il singolo contenuto, esso potrà essere visualizzato
su mappa, ma non verranno fornite le indicazioni stradali per raggiungerlo.
A differenza della nostra applicazione, i vari contenuti potranno essere aggiunti
ad una lista di preferiti.
8.3.5 Dubai Travel Guide and Offline Map
Dubai Travel Guide and Offline Map è la piattaforma sviluppata da Ultron, una
startup australiana specializzata nella creazione di applicazioni turistiche.
Tale app fornisce un servizio che permette l’utilizzo di mappe senza la presenza
di una connessione alla rete Internet, consentendo di visualizzare la posizione del
proprio dispositivo sulle stesse. Essa è in grado di localizzare strade, indirizzi e punti
di interesse fornendo un percorso per raggiungerli.
La Home Page è formata da una mappa centrata sull’aeroporto di Dubai. Il punto
di accesso ai contenuti è rappresentato da un pulsante a forma di mappamondo
presente sulla navigation bar.
Tramite esso si accederà alla sezione contenente una lista dei principali luoghi da
visitare. Essi saranno ordinati in base al loro grado di popolarità, non prevedendo
una categorizzazione per contesto di riferimento. Tale organizzazione dei contenuti,
in assenza di una funzionalità di ricerca, risulterà di difficile consultazione.
Il sistema offre due tipologie di ricerche, specifiche per alberghi, tour e attività.
Per la ricerca relativa ai pernottamenti, tale app permette di inserire opportuni
filtri riguardanti il giorno di arrivo, la durata del soggiorno e gli ospiti per stanza.
Nella lista filtrata verranno visualizzati, per ogni elemento, il prezzo di partenza, la
recensione e il riferimento a booking.com.
Per quanto riguarda i tour e le attività, questi vengono mostrati indistintamente
nella medesima lista. Soltanto in un secondo momento sarà possibile filtrare gli
stessi per categoria, destinazioni, lingua, durata e tipo di servizio.
Tale applicazione consente ad un utente registrato di:
•
•
•
recensire e votare i luoghi visitati;
creare un account utente e utilizzarlo, accedendo da qualsiasi dispositivo iOS,
per la visualizzazione dei propri contenuti;
memorizzare mappe e contenuti direttamente sul dispositivo in modo da potervi accedere anche in modalità offline. La connessione alla rete Internet è
fondamentale per il download dei dati e per la prenotazione dei pernottamenti.
Il primo svantaggio riscontrato in questo applicativo riguarda la presenza delle
numerose pubblicità contenute al suo interno che, nella maggior parte dei casi,
rallentano la navigazione all’interno dello stesso.
8.3 Confronto con sistemi correlati
141
Analogie
Entrambe le applicazioni sfruttano un sistema di geolocalizzazione per agevolare
la navigazione all’interno dei contesti rispettivamente rappresentati e offrono la
possibilità di votare il sistema sui rispettivi store.
Differenze
L’applicazione descritta presenta una struttura di navigazione completamente differente rispetto a quella di EnjoyRC. Essa permette l’accesso ai contenuti tramite
una piccola icona situata sulla navigation bar. Tale soluzione risulta essere poco
intuitiva e funzionale.
EnjoyRC, grazie alla categorizzazione intelligente dei dati, permette all’utente
di accedere direttamente alle informazioni relative al contesto di proprio interesse.
L’applicazione descritta in questa sezione, invece, presenta direttamente i contenuti
più popolari, senza offrire la possibilità di filtrarli (Figura 8.5).
Figura 8.5. La lista dei contenuti più popolari dell’applicazione Dubai Travel Guide and
Offline Map
142
8 Confronto con sistemi correlati
L’applicazione che si sta analizzando permette di effettuare una ricerca esclusivamente sui pernottamenti, sui tour e sugli eventi, a differenza della nostra, che
permette di effettuarla all’interno di tutte le sezioni, specificando anche opportuni
filtri.
I dati relativi alle mappe, utilizzate da Dubai Travel Guide and Offline Map,
sono forniti da OpenStreetMap, un progetto aperto paragonabile a Wikipedia. Tale
progetto permette agli utilizzatori di contribuire al miglioramento delle informazioni
riguardanti la mappa e i punti di interesse. In generale, i contenuti dell’applicazione
sono prelevati da fonti esterne, come Wikipedia, booking.com e getyourguid. Per
quanto riguarda EnjoyRC, invece, essi sono prelevati dalla componente backend del
sistema.
Infine, Dubai Travel Guide and Offline Map non funziona su dispositivi con
sistema operativo Android.
8.3.6 World Explorer
World Explorer è una guida turistica mondiale, che fornisce agli utenti informazioni
riguardanti tutte le località sparse per il mondo. Ciò che caratterizza principalmente
questa applicazione è la modalità utilizzata per fornire agli utenti le informazioni
turistiche di loro interesse. A differenza dei normali sistemi del settore turistico,
non sarà l’utente a richiedere le informazioni al sistema, ma sarà in automatico
l’app a suggerire la propria soluzione. World Explorer, infatti, è in grado di creare
una lista dei centri d’interesse in prossimità dell’utente (monumenti, musei, villaggi), accompagnati da una nota esplicativa, secondo il loro interesse turistico. Per
sfruttare tale servizio, si rende necessario consentire all’app di ottenere la posizione approssimativa dell’utente. Tale posizione viene ottenuta mediante il servizio di
geolocalizzazione.
L’utente potrà scegliere un elemento della lista visualizzata (Figura 8.6) e
consultarne le informazioni annesse: storia, aneddoti, dati e foto.
Le descrizioni presenti nell’app vengono integralmente ottenute da Wikipedia.
Il primo aspetto negativo riscontrato è l’eccessiva presenza di annunci pubblicitari, i quali distolgono l’attenzione dell’utente dalla navigazione.
Gli elementi visualizzati nella Home Page presentano, spesso, delle incoerenze
tra l’immagine mostrata e il contenuto che essi rappresentano.
Tale applicazione non risulta, inoltre, ottimizzata per tutti i dispositivi e necessita l’update ad una versione a pagamento per usufruire di alcune fondamentali
funzionalità.
Analogie
World Explorer, come EnjoyRC, gestisce la globalizzazione permettendo la visualizzazione dei contenuti in più di due lingue. Un’altra analogia è quella relativa ai
sistemi operativi supportati. World Explorer è, infatti, disponibile sia per dispositivi
Android che per dispositivi iOS.
Anche in questo caso, l’esperienza di navigazione dell’utente risulta essere
semplificata in quanto i contenuti vengono visualizzati su due semplici livelli.
8.3 Confronto con sistemi correlati
143
Figura 8.6. La Home Page dell’applicazione World Explorer
Differenze
World Explorer non è un’applicazione turistica dedicata ad una singola città o area
geografica, come invece EnjoyRC, bensı̀ si riferisce a qualsiasi punto geografico sparso per il mondo. L’intero applicativo si sviluppa su due unici livelli: il primo relativo
alla visualizzazione di una lista di punti di interesse, il secondo riguardante la pagina
di dettaglio dello stesso. I contenuti dell’area di dettaglio vengono prelevati automaticamente da Wikipedia. Questo aspetto è vincolante in quanto non è possibile
personalizzare le informazioni visualizzate. Nel nostro sistema, invece, i contenuti
sono gestiti tramite un pannello di amministrazione.
Gli elementi visualizzati vengono organizzati senza nessun tipo di categorizzazione, e, allo stesso tempo, tra questi non sono presenti punti di ristorazione, punti di
pernottamento ed eventi. Inoltre, non vengono gestiti i percorsi turistici nè vengono
riportate informazioni riguardanti i servizi primari.
Da sottolineare il fatto che tale applicazione fornisce un servizio di notifiche
istantanee.
9
Conclusioni e sviluppi futuri
In questo capitolo verranno tratte delle conclusioni in merito al presente lavoro di
tesi e verranno delineati alcuni possibili sviluppi futuri.
9.1 Conclusioni
Il lavoro svolto per la presente tesi è consistito nell’analisi dei requisiti e nello studio
di fattibilità di un sistema capace di fornire un supporto al turismo nella città di
Reggio Calabria. Tale sistema è formato da un’applicazione mobile ibrida e da un
server per la gestione dei contenuti che essa dovrà visualizzare.
A seguito della fase di analisi, ci si è concentrati sugli strumenti necessari allo
sviluppo della componente mobile del sistema, per poi passare alla definizione delle
funzionalità da realizzare e allo studio dei mockup. Dopo di ciò, si è passati alla
fase di progettazione delle funzionalità di base del sistema, per poi descrivere la
fase di implementazione. A seguire, ci si è concentrati sulla fase di progettazione
e implementazione del macro-blocco “Percorsi turistici”, riguardante sia la componente client che quella server. Infine, si è realizzato un manuale utente per descrivere
ogni sezione e funzionalità ed è stato effettuato un confronto con altre applicazioni
presenti sui vari market-place riguardanti il nostro stesso contesto di riferimento.
Nella fase iniziale di analisi si è evidenziato quanto il turismo possa assumere un
ruolo di fondamentale importanza per favorire l’interazione tra la città di Reggio
Calabria ed il resto del mondo. Da queste considerazioni è nata l’esigenza di sfruttare le moderne tecnologie per promuovere sia il turismo sia le potenzialità che la
città stessa nasconde ai cittadini. Allo stesso tempo, si sono descritte tutte le fasi
preliminari che hanno permesso di raccogliere i requisiti fondamentali alla realizzazione del sistema; in seguito si è definita una suddivisione degli stessi in macro-aree
e, per ciascuna di esse, si è descritto il contesto che rappresentano.
La fase iniziale di analisi ha permesso di produrre uno studio di fattibilità con
lo scopo di evidenziare tutti i possibili rischi riscontrabili in fase di produzione,
eventuali anomalie e/o eventuali aspetti non fattibili. In questo modo si sono potute
definire le pratiche da adottare per favorire lo sviluppo del progetto, per evidenziare
i fattori di rischio, proponendo delle ipotetiche soluzioni alle conseguenze degli stessi,
e infine, per definire la modalità di attuazione del progetto.
146
9 Conclusioni e sviluppi futuri
A questo punto, è stato effettuato uno studio approfondito riguardante le tecnologie necessarie allo sviluppo della componente mobile del sistema; esso, ha portato
alla scelta, tra le varie opzioni disponibili, di un approccio ibrido, e nello specifico,
ad adottare la piattaforma AppGyver e il framework JavaScript AngularJS.
Una volta definita la piattaforma di sviluppo, è stata effettuata la progettazione
delle funzionalità di base riguardanti la componente mobile; nello specifico, è stata
effettuata la progettazione della componente applicativa. Fatto ciò, si è passati alla
fase riguardante l’implementazione di tali funzionalità. Inizialmente, si sono descritti
nel dettaglio gli strumenti che hanno fornito un supporto a tale fase, tra cui i sistemi
di versioning e gli IDE di sviluppo, per poi analizzare tutte le scelte implementative
adoperate per soddisfare i requisiti emersi durante la fase di analisi.
Infine, essendo un punto di forza del nostro sistema, si sono descritte in dettaglio la fase di progettazione della componente applicativa e le relative scelte
implementative riguardanti, macro-blocco “Percorsi turistici”.
9.2 Sviluppi futuri
Con il sistema EnjoyRC abbiamo costruito un progetto in grado di evolversi, prefissandoci di effettuare un manutenzione continua durante il suo ciclo di vita e
prevedendo l’aggiunta di nuove funzionalità e di nuovi aggiornamenti. Tutto ciò
sarà finalizzato ad ottenere un sistema efficiente e, allo stesso tempo, paragonabile
con i più popolari sistemi di supporto al turismo.
Oltre a ciò, si punterà ad integrare soluzioni innovative non previste dai competitor del settore, rendendo l’utilizzo della nostra applicazione un’esperienza nuova
e coinvolgente.
Alla base del processo di manutenzione evolutiva del sistema EnjoyRC vi è stata un’accurata pianificazione dei rilasci futuri, mirati alla correzione dei problemi
presenti nella prima versione, ad un miglioramento delle funzionalità già realizzate e all’integrazione di nuovi componenti. La prima versione del sistema è stata
dettagliatamente descritta in questo elaborato di tesi.
La distribuzione pianificata dei nuovi componenti, nei vari rilasci del sistema, è
stata una diretta conseguenza di un’analisi effettuata tramite il metodo MoSCoW.
Tale tecnica viene impiegata nella business analysis e nello sviluppo del software
per definire la priorità dei vari requisiti. In particolare, il metodo MoSCoW prevede
quattro categorie distinte di requisiti, ovvero:
•
•
•
•
Must Have: descrive i requisiti che devono essere soddisfatti necessariamente
nella soluzione finale.
Should Have: rappresenta un aspetto ad alta priorità, il quale dovrebbe essere
compreso nella soluzione.
Could Have: descrive un requisito che è considerato auspicabile, ma non necessario. Sarà incluso solo se il tempo e le risorse lo permettono.
Won’t Have: rappresenta un requisito che gli stakeholder hanno accettato di non
vedere implementato nella versione del software che si sta realizzando, ma che
può essere considerato in futuro.
9.2 Sviluppi futuri
147
Il processo di prioritizzazione è scaturito dal confronto con gli stakeholder durante il quale si è associata una delle categorie precedentemente descritte ad ogni nuovo
requisito. A fine di ciò sono state programmate tre ulteriori release, identificate dalle
Versioni 2.0, 3.0 e 4.0.
La versione 2.0 prevede l’ottimizzazione delle funzionalità già fornite dalla prima release e l’integrazione della “realtà aumentata”. Quest’ultima permetterà di
arricchire le informazioni contenute all’interno della macro-area dei punti di interesse con oggetti virtuali. Essa sarà dotata di un motore di riconoscimento delle
immagini che permetterà, inquadrando con la fotocamera un punto di interesse,
di associare tale punto alla corrispettiva pagina di dettaglio presente in memoria,
aggiungendovi contenuti multimediali ed elementi 3D.
Tra le operazioni di ottimizzazione previste, vi sarà quella che garantirà agli
stakeholder del settore turistico (strutture ricettive, istituzioni pubbliche, esercizi commerciali, strutture alberghiere, gestori delle attrazioni turistiche, sistemi di
trasporto, etc.) di accedere alle piattaforme web inserire o aggiornare autonomamente le informazioni relative alle proprie attività. Ciò sarà reso possibile soltanto
in seguito all’acquisizione di opportune credenziali d’accesso.
La Versione 3.0 prevederà l’integrazione di due complessi macro-blocchi. Il primo
sarà quello relativo alla creazione di una social network, mentre il secondo consisterà
in un sistema di User Agent basato sulla profilazione utente.
La scelta di adottare WordPress come strumento di amministrazione della componente server è nata anche dalla richiesta di predisporre il sistema ad ospitare
una social network tematica. Infatti, grazie agli strumenti forniti dalla community
di WordPress, si potranno integrare le funzionalità tipiche di una social network
direttamente sul sistema EnjoyRC.
Il sistema da noi realizzato si evolverà coinvolgendo sempre di più gli utenti.
La gestione del processo di profilazione sarà alla base del sistema di User Agent
da integrare. Grazie ad esso, verranno fornite informazioni personalizzate sulla base
degli interessi e delle esperienze di ogni singolo utilizzatore.
La Versione 4.0 integrerà le funzionalità che permetteranno all’utente di acquistare i titoli di ingresso relativi ad un luogo da visitare (musei, teatri, eventi
sportivi), di creare un percorso con un itinerario personalizzato che preveda tratte
terra/mare, e di essere avvisato della presenza di interruzioni del traffico cittadino
durante la creazione di un percorso, suggerendone uno alternativo.
Tale release, inoltre, permetterà l’interazione dello smartphone con i beacon
distribuiti lungo il territorio e all’interno di specifiche strutture. I beacon sono a
piccoli dispositivi bluetooth che, se collocati in uno spazio fisico come un museo,
trasmettono intorno a sé segnali radio a basso consumo e a corto raggio. Questa loro
caratteristica potrà essere sfruttata per scatenare un evento sul dispositivo quando
esso si troverà all’interno del raggio di azione del beacon.
Ringraziamenti
Trovarsi nuovamente a scrivere i ringraziamenti è una bella sensazione, perché significa che un nuovo traguardo è alle porte. Risulta ugualmente difficile trovare le
parole per poter ringraziare tutti in queste poche righe, ma è doveroso ringraziare
coloro che in un modo o in un altro, hanno dato un contributo al raggiungimento
di questo nuovo obbiettivo.
Un ringraziamento generale va a chi mi è stato sempre vicino e a chi mi ha lasciato solo nel momento del bisogno, perché ha contribuito maggiormente a formare
la persona forte e responsabile che oggi sono. Non sarà bello perdere i colleghi, gli
amici e tutti coloro che, come me, hanno dedicato questi ultimi due anni allo studio
e al sacrificio, mettendo in secondo piano tutto il resto. Spero che almeno questa
volta, gli studi ingegneristici non abbiano influenzato il mio modo di scrivere.
Affrontare questa tesi mi ha messo alla prova, dandomi la possibilità di affrontare
delle realtà che nel corso dei miei studi non ho mai incontrato e, onestamente, non
avrei mai pensato fossero cosi dure da sostenere. Spero di essere stato all’altezza
del compito che mi è stato assegnato e di aver raggiunto gli obbiettivi prefissati ma
sopratutto, spero che questa esperienza sia la prima di tante.
Non posso fare a meno di ringraziare il mio compagno di avventura Alessandro
e i miei relatori, il prof. Domenico Ursino e il dott. Antonio Quattrocchi. La loro
disponibilità, la loro esperienza, la loro pazienza e i loro insegnamenti sono stati
fondamentali per la realizzazione di questa tesi.
Durante tutto il mio cammino universitario sono molte le persone che mi sono
state vicine. Non potrò mai dimenticare ciò che la mia famiglia ha fatto per me
nonostante tutti i problemi, il loro sostegno, sia morale che economico, non è mai
venuto meno; soprattutto non finirò mai di ringraziare i miei Genitori, i miei Nipoti,
i miei Fratelli, le mie Sorelle e i miei Amici perché, anche nei momenti peggiori, non
mi hanno mai lasciato solo.
Un particolare ringraziamento va a tutti quegli amici che hanno messo una mano
sulla mia spalla nei momenti in cui ne avevo bisogno e hanno vissuto assieme a me
momenti davvero importanti. È grazie a tutte queste persone se adesso, anche se con
mio stupore, ho raggiunto questo traguardo, un traguardo che non avrei pensato di
riattraversare.
Mi sembra ieri il giorno in cui ho conseguito la laurea triennale, e non riesco a
credere di essere prossimo alla quella magistrale. Adesso posso davvero dire di non
150
Ringraziamenti
essermi pentito di aver riaffrontato questa carriera universitaria, con la promessa
che il mio percorso non finirà qui e che questo secondo traguardo è solo un ponte
che va verso il mondo lavorativo.
A tutti voi, grazie!
Riferimenti bibliografici
1. HTML5 Introduzione.
http://www.mrwebmaster.it/html/introduzione_10743.
html, 2012.
2. JavaScript Tutorial. http://www.w3schools.com/js/, 2013.
3. AppGyver. http://www.appgyver.io/supersonic/, 2014.
4. Guida HTML5. http://www.html.it/guide/guida-html5/, 2014.
5. HTML.it.
http://www.html.it/articoli/apps-mobile-con-steroidsintroduzione/, 2014.
6. Hybrid Mobile App Command-Line Smackdown. http://developer.telerik.com/
featured/hybrid-mobile-app-command-line-smackdown/, 2014.
7. JS e HTML, librerie e codice JavaScript esterno. http://www.html.it/pag/46494/
caricare-javascript-esterno/, 2014.
8. What is JavaScript.
https://developer.mozilla.org/en-US/Learn/Getting_
started_with_the_web/JavaScript_basics, 2014.
9. WordPress Get Started. https://learn.wordpress.com/, 2014.
10. Advantages of Self-Hosted WordPress Blog.
https://codex.wordpress.org/
WordPress_Quick_Start_Guide, 2015.
11. AppGyver. http://www.redherring.com/company-profiles/appgyver/, 2015.
12. AppGyver, Hybrid App Development That Goes Beyond Just Code.
http://www.sitepoint.com/appgyver-hybrid-app-development-goes-beyondjust-code/, 2015.
13. Appgyver, Steroids, and Composer Cross-Platform Mobile Dev.
http:
//tarnaeluin.houseofbeor.net/appgyver-steroids-and-composer-crossplatform-mobile-dev/, 2015.
14. How to Create a Cross-Platform App In Minutes with AppGyver and Syncano. https://www.syncano.io/blog/how-to-create-a-cross-platform-app-inminutes-with-appgyver-and-syncano/, 2015.
15. HTML5 Introduction. http://www.w3schools.com/html/html5_intro.asp, 2015.
16. HTML.it. http://www.html.it/guide/guida-angularjs/, 2015.
17. What distinguishes Ionic Framework from AppGyver’s Supersonic Framework
for cross-platform mobile app development?
https://www.quora.com/Whatdistinguishes-Ionic-Framework-from-AppGyvers-Supersonic-Framework-forcross-platform-mobile-app-development, 2015.
18. WordPress 4.2.2 release di mantenimento e sicurezza. http://www.wpitaly.it/2015/
05/07/wordpress-4-2-2-release-di-mantenimento-e-sicurezza/, 2015.
19. AngularJS. https://angularjs.org/, 2016.
20. AngularJS Material. https://material.angularjs.org/latest/, 2016.
152
Riferimenti bibliografici
21. PHP. https://secure.php.net/manual/, 2016.
22. R. Azuma, Y. Baillot, R. Behringer, S. Feiner, S. Julier, and B. MacIntyre. Recent advances in augmented reality. IEEE Computer Graphics and Applications, 21 (6):34.47,
2002.
23. T. Boronczyc. PHP 6, Apache, MySQL: Sviluppo di siti Web. Hoepli, 2012.
24. C. S. Chan and J. L. Hong. HTML Validation for PHP Web Applications. Australian
Journal of Intelligent Information Processing Systems, 12 (2), 2014.
25. A. Charland and B. Leroux. Mobile application development: web vs. native.
Comunications of the ACM, 54 (5):49.53, 2011.
26. D. Flanagan. JavaScript: The Definitive Guide: Activate Your Web Pages. O’Reily,
2011.
27. A. Freeman. Pro AngularJS. Apress, 2014.
28. G. Gigliotti. HTML5. Apogeo, 2012.
29. M. Haverbeke. Javascript. Guida completa per lo sviluppatore. Hepli, 2016.
30. T. D. Hedengren. Sviluppare con WordPress. Apogeo, 2014.
31. R. G. Hollands. Will the real smart city please stand up. City: analysis of urban
trends, culture, theory, policy, action, 12 (3):303.320, 2008.
32. M. Kenteris, D. Gavalas, and D. Economou. An innovative mobile electronic tourist
guide application. Personal and Ubiquitous Computing, 13 (2):103.118, 2009.
33. M. MacDonald. HTML5: The Missing Manual. O’Reily, 2014.
34. P. MacIntyre. PHP. Le tecniche per scrivere il codice migliore. O’Reily, 2010.
35. T. Nam and T. A. Pardo. Digital Government Research. In Software engineering
issues for mobile application development, page 282.291, New York, USA, 2011.
36. B. Pollentine. Appcelerator Titanium Smartphone App Development Cookbook by
Boydlee Pollentine. Packt Publishing, 2011.
37. S. Radford. Sviluppare applicazioni web con AngularJS e Bootstrap. Apogeo, 2015.
38. A. Ravulavaru. Learning Ionic - Build Hybrid Mobile Applications with HTML5. Packt
Publishing, 2015.
39. K. Su, J. Li, and H. Fu. Electronics, Communications and Control (ICECC), 2011
International Conference on. In Smart city and the applications, page 1028.1031,
Zhejiang, 2011.
40. A. I. Wasserman. Proceedings of the FSE/SDP workshop on Future of software engineering research. In Conceptualizing smart city with dimensions of technology, people,
and institutions, page 397.400, Santa Fe, NM, USA, 2010.
41. B. Williams, D. Damstra, and H. Stern. Professional WordPress: Design and
Development. Wrox, 2015.