Progettazione

Transcript

Progettazione
Pianificazione
1
Pianificazione del progetto
La pianificazione ha lo scopo di dare al progetto una stima di riferimento circa
i tempi ed i costi di realizzazione. Questa fase, che tipicamente occupa tra il
5% e il 7% dell’intera durata del progetto, è fondamentale perché aiuta ad
avere il controllo delle risorse coinvolte, migliora l’organizzazione del team di
sviluppo e permette di controllare l’evoluzione del lavoro nel tempo.
1.1 Function point
Il metodo dei Function point è correntemente lo standard più in voga per
stimare la complessità di sviluppo di un progetto software. Presentati in un
articolo del 1984 (anche se le prime proposte risalgono al 1975), hanno presto
preso piede nel mondo delle software house grazie al fatto che permettono di
capire le dimensioni, quindi i costi e i tempi di sviluppo del progetto con una
misura empirica basata sulle sue funzionalità, andando di fatto a sostituire
quello che fino ad allora era lasciato al parere di un esperto.
Il loro problema, essendo abbastanza datati, è quello di essere stati modellati
per un software puramente transazionale e non cogliere quindi gli aspetti
dinamici tipici delle applicazioni di oggi, in particolare delle web application,
tanto che ne esistono varie rivisitazioni che adattano i FP a queste esigenze
(OO-FP, Cosmic FP, UML-FP, WEB-FP).
Tuttavia risulta la metodologia standard per questo problema e sono, ad oggi, il
più forte strumento contrattuale nei rapporti tra l’azienda e il cliente.
La versione usata nel nostro progetto e la IFPUG 4.2.
1.1.1 La metodologia
La tecnica generale è quella di cercare nei requisiti le funzionalità che
caratterizzano il sistema e di valutarle attraverso tre livelli di complessità:
semplice, medio, alto.
Gli elementi significativi da valutare sono 5 e si distinguono in:
Dati
• Internal Logical File (ILF): Gruppo di dati logico riconoscibile dall’utente,
mantenuto e aggiornato all’interno del confine dell’applicazione.
• External Interface File (EIF): Gruppo di dati logico riconoscibile dall’utente,
referenziato dall’applicazione ma che non rientra nel dominio (è un ILF di
un’altra applicazione).
Gli elementi che stabiliscono la complessità di queste funzioni sono il numero di:
• Data Element Type (DET): Campo unico che caratterizza un file,
riconoscibile dall’utente.
• Record Element Type (RET): Campo corrispondente a un sottogruppo di dati
che caratterizzano un file, riconoscibile dall’utente.
Transazioni
• External Input (EI): Funzione elementare atomica che acquisisce dati
dall’esterno, li elabora ed aggiorna uno o più ILF.
• External Output (EO): Funzione elementare atomica che ha lo scopo di
presentare dati all’esterno. Un EO è da considerarsi tale solo nel caso in cui
esegue almeno una delle seguenti quattro operazioni:
1. Fa calcoli sui dati
2. Crea dati derivati
3. Altera il comportamento del sistema
4. Aggiorna uno o più ILF
• External Query (EQ): Funzione elementare atomica che ha lo scopo di
reperire e presentare dati all’esterno. La differenza con l’EO è che l’EQ si
specializza sul reperimento dei dati e dunque non deve eseguire nessuna delle
precedenti 4 operazioni.
Gli elementi che stabiliscono la complessità di queste funzioni sono il numero di:
• File Type Refered (FTR): file manipolato dalla transazione.
• Data Element Type (DET): Campo unico che caratterizza un file,
riconoscibile dall’utente (i det comuni ad input ed output vanno considerati una
sola volta).
Dalla somma dei pesi associati alle varie funzionalità si ottengono gli Unadjusted
Funcition Point (UFP). Il secondo passo è proprio quello di calcolare il fattore di
aggiustamento (F), un parametro correttivo che tiene conto di come deve essere
realizzata l’applicazione, delle caratteristiche del suo ambiente di sviluppo e del
contesto di lavoro, dal quale saranno poi calcolati gli Adjusted Function Point
(AFP). Questo parametro è ottenuto dalla somma di 14 fattori valutati con un
punteggio da 0 a 5 ed è in grado di far variare la stima degli UFP del 35%,
secondo la seguente formula:
AFP = UFP · (0,65 + 0,01 · F)
1.1.2 Il calcolo
Nel nostro caso, il calcolo si dovrebbe fermare agli unadjusted FP perché,
utilizzando il modello COCOMO 2 che verrà presentato in seguito, nasce una
certa ridondanza tra i fattori di aggiustamento dei FP e i coefficienti di
correzione di COCOMO, ma per completezza vengono riportati anche gli
Adjusted FP.
Il punto cruciale che si è riscontrato nell’analisi delle funzionalità di tipo dato è
stato il criterio di identificazione dei DET: avendo tipicamente a che fare con
strutture di tipo IS-A, tutte complete e disjoint, bisogna chiarire se inserire il
conteggio degli attributi delle classi padre senza inserirli in quelle figlie,
oppure come abbiamo scelto, inserire gli attributi del padre, come DET nelle
classi figlie senza calcolare il contributo delle classi padre. Per le altre si è
proceduto al computo normale degli attributi rilevati dal class diagram di
domino.
Per quanto riguarda le funzionalità di tipo transazione invece ci si è
strettamente attenuti ai casi d’uso individuati nel diagramma degli use case di
alto livello, ma si sono cmq verificate delle difficolta per il carattere interattivo
dell'applicazione.
1.1.2.1 Dati
Tipo
Complessità
bassa
bassa
bassa
bassa
bassa
bassa
bassa
bassa
bassa
Nome Funzione
Utente
Contratti Territorio
Carte Imprevisti
Carte Probabilità
Contratti Non Edificabili
Caselle Speciali
Caselle Non Edificabili
Caselle Territorio
Partita
Tipo
DATO
DATO
DATO
DATO
DATO
DATO
DATO
DATO
DATO
Det Ret Ftr
6
1 xxxx
6
1 xxxx
2
1 xxxx
2
1 xxxx
5
1 xxxx
4
1 xxxx
3
1 xxxx
3
1 xxxx
3
1 xxxx
tot
FP
7
7
7
7
7
7
7
7
7
63
Scelta Pedina
Registrazione
Log In
Creazione Partita
Salvataggio Partita
Tiro Dadi
Ritiro
Accesso Partita
EI
EI
EI
EI
EI
EI
EI
EI
1
6
2
2
28
1
1
1
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
2
1
1
5
9
1
0
1
tot
3
3
3
4
6
3
3
3
28
bassa
bassa
bassa
bassa
bassa
bassa
bassa
bassa
Classifica Generale
EO/In
EO/Out
TOT
EO/In
EO/Out
TOT
EO/In
EO/Out
TOT
EO/In
EO/Out
TOT
EO/In
EO/Out
TOT
3
1
4
3
2
5
3
2
5
3
1
4
3
1
4
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
2
0
2
2
2
2
2
2
2
2
2
2
2
2
2
4
bassa
4
bassa
4
bassa
4
bassa
4
bassa
Ipoteca Contratto
Disipoteca Contratto
Acquisto Contratti da Banca
Compra Case
Vendi Case
Vendita a Giocatore
Acquisto da Giocatore
Riprendi Partita
Visualizza Contratti
EO/In
3 xxxx
EO/Out 1 xxxx
TOT
4 xxxx
EO/In
4 xxxx
EO/Out 2 xxxx
TOT
6 xxxx
EO/In
4 xxxx
EO/Out 2 xxxx
TOT
6 xxxx
EO/In
3 xxxx
EO/Out 28 xxxx
TOT
28 xxxx
2
2
2
3
3
3
3
3
3
9
9
9
tot
EQ/In
EQ/Out
TOT
1
1
2
tot
FP Unadjusted
Fattori di bilanciamento
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
VAF
FP
1
3
4
xxxx
xxxx
xxxx
4
bassa
5
media
5
media
7
41
alta
3
3
bassa
135
Peso
5
5
1
1
0
5
3
3
3
0
1
0
2
0
0,94
126,9
1.2
COCOMO
1.2.1 COCOMO 2
COCOMO 2 è un modello di stima dello sforzo che prende in ingresso i FP e
calcola i tempi di sviluppo, in termini di mesi-uomo (MM), e i costi di
produzione.
Utilizza un ciclo di vita a cascata, molto simile a quello adottato nel nostro
progetto, e fornisce una stima di valori per ciascuna fase: analisi e
pianificazione, progetto, codifica, test.
Il calcolo, in maniera simile a quello dei FP, prevede una prima fase in cui
viene prodotta una stima nominale passando attraverso la valutazione di 5
fattori di scala (scaling drivers) secondo 6 livelli di complessità: very low,
low, nominal, high, very high, extra high.
•
•
•
•
•
PREC: Esperienza pregressa
FLEX: Vincoli sul progetto
RESL: Fattori di rischio
TEAM: Coesione del team di sviluppo
PMAT: Maturità del processo (basato sul livello CMM)
Nel nostro caso l’assegnazione degli scaling drivers, ci è stata fornita dal
docente ed è la seguente:
Il secondo passo invece aggiusta la stima nominale di un parametro ottenuto
dal prodotto di un certo numero di fattori di scala che variano a seconda del
modello adottato.
I modelli di calcolo previsti da COCOMO 2 sono:
• Early Design Model: indicato per le prime fasi del progetto, è il modello
più semplice, con soltanto 7 fattori di scala. Proprio per le sue caratteristiche
non ha bisogno di informazioni troppo dettagliate e lavora unicamente su
FP.
• Post Architecture Model: Modello più complesso con 17 fattori di scala,
richiede un più alto modello di dettaglio nelle informazioni ed è molto usato
per sviluppo e manutenzione di grandi sistemi software.
Nel nostro caso abbiamo utilizzato l’Early Design Model perché più semplice,
flessibile e compatibile con la struttura del nostro progetto.
1.2.2 Main di COCOMO 2
Source Lines of
Code
Module Size
4192
Total SLOC
Effort Adjustment
Factor
EAF
0,435675
Schedule
5,569428
4192
6,301071
7,139794
Module Name
Monopoli
Monopoli
Optimistic
Most Likely
Pessimistic
Early Design Cost Driver
Product Reliability and
Complexity
Required Reuse
Platform Difficulty
Personnel Capability
Personnel Experience
Facilities
Required Development Schedule
User-Defined 1
Use-Defined 2
RCPX
RUSE
PDIF
PERS
PREX
FCIL
SCED
USR1
USR2
2,12
1,59
1,43
Precedentedness
Development Flexibility
Architecture/Risk Resolution
Team Cohesion
Process Maturity
PREC
FLEX
RESL
TEAM
PMAT
6,2
5,07
7,07
5,48
7,8
Module Name
Monopoli
Monopoli
Optimistic
Most Likely
Pessimistic
Early Design Cost Driver
Product Reliability and
Complexity
Required Reuse
Platform Difficulty
Personnel Capability
Personnel Experience
Facilities
Required Development Schedule
User-Defined 1
Use-Defined 2
Precedentedness
Development Flexibility
Architecture/Risk Resolution
Team Cohesion
Process Maturity
Rating
XL
0,73
Nominal Person-Months
NOM Effort DEV
13,25904
Total Nominal PersonMonths
8,883557
13,25904
19,88856
Estimated Person-Months
EST Effort DEV
5,776638
Total Estimated PersonMonths
3,870347
5,776638
8,664957
VL
L
0,81
1,62
1,33
1,3
1,43
1
1
0,98
0,95
0,87
1,26
1,12
1,1
1,14
1
1
4,96
4,05
5,65
4,38
6,24
3,72
3,04
4,24
3,29
4,68
Labor
Rate
$/month
Module Name
Productivity
PROD
Monopoli
725,681617
Total Estimated
Productivity
1088,522425
725,681617
486,206683
Monopoli
Optimistic
Most Likely
Pessimistic
Early Design Cost Driver
Product Reliability and
Complexity
Required Reuse
Platform Difficulty
Personnel Capability
Personnel Experience
Facilities
Required Development Schedule
User-Defined 1
Use-Defined 2
N
0
0
0
0
Early Design Cost Driver
Product Reliability and
Complexity
Required Reuse
Platform Difficulty
Personnel Capability
Personnel Experience
Facilities
Required Development Schedule
User-Defined 1
Use-Defined 2
Precedentedness
Development Flexibility
Architecture/Risk Resolution
Team Cohesion
Process Maturity
VH
1
1
1
1
1
1
1
1
1
1,3
1,07
1,29
0,83
0,87
0,87
1
1
1
1,74
1,15
1,81
0,63
0,71
0,73
1
1
1
2,48
2,03
2,83
2,19
3,12
1,24
1,01
1,41
1,1
1,56
0
0
0
0
0
Cost per Instruction
INST COST
Monopoli
Monopoli
Optimistic
Most Likely
Pessimistic
0
Total Estimated
Cost
H
Precedentedness
Development Flexibility
Architecture/Risk Resolution
Team Cohesion
Process Maturity
Module Name
Cost
COST
0
Total Estimated Cost per
Instruction
0
0
0
XH
2,38
1,24
2,61
0,5
0,62
0,62
Module Name
Full Time Software Personnel
Staff
Monopoli
Risk
RISK
0,916771
0
Total Estimated Full Time Software
Personnel
Monopoli
Optimistic
Most Likely
Pessimistic
Risk
0,694927
0,916771
1,213614
0
Early Design Cost Driver
Product Reliability and
Complexity
Required Reuse
Platform Difficulty
Personnel Capability
Personnel Experience
Facilities
Required Development Schedule
User-Defined 1
Use-Defined 2
Precedentedness
Development Flexibility
Architecture/Risk Resolution
Team Cohesion
Process Maturity
Module
Breakage
BRAK
Sizing
Method
Function-Points
Inputs
Outputs
Language
Low Average High Low Average High Low
OBJECT_ORIENTED
7
0
1
6
2
1
9
0 FP
Files
Interfaces
Queries
Total Unadjusted
Average High Low Average High Low Average High Function
0
0
0
0
0
0
0
0
Equivalent Source Lines of
Code
ESLOC
Initial Source Lines of
Code
INITSLOC
Design
Modified
DM
131
Code
Modified
CM
4192
Integration
Modified
IM
Software
Understanding
SU
Unfamiliarity with
Assessment and Assimilation Software
AA
UNFM
Component Automatically
Translated
AT
Computed Adaptation Adjustment
Factor
AAF
Automatic Translation
Productivity
ATPROD
Adapted Source Lines of
Code
ASLOC
RCPX
RUSE
Base Incr Value Base Incr
XL
0% 0,73 L
0%
PDIF
PERS
PREX
FCIL
SCED
Value Base Incr Value Base Incr Value Base Incr Value Base Incr Value Base Incr Value
0,95 L
0% 0,87 H
0% 0,83 N
0%
1 H
0% 0,87 N
0%
1
USR1
USR2
PREC FLEX RESL TEAM PMAT
Base Incr Value Base Incr Value
N
0%
1 N
0%
1 N
N
XH
VH
L
1.2.3 Phases di COCOMO 2
Project Name
Total Size
Total Effort
Monopoli
4192
5,776638
Schedule
Schedule
Effort
Overall
(%)
(Months)
(%)
Plans And Requirements
16,73%
1,054211
7,00%
Product Design
24,37%
1,535277 17,00%
Programming
54,54%
3,43652 62,90%
Integration and Test
21,10%
1,329274 20,10%
EFFORT
Requirements Analysis
Product Design
Programming
Test Planning
Verification and
Validation
Project Office
CM/QA
Manuals
PERSONNEL
Requirements Analysis
Product Design
Programming
Test Planning
Verification and
Validation
Project Office
CM/QA
Manuals
EFFORT (%)
Requirements Analysis
Product Design
Programming
Test Planning
Verification and
Validation
Project Office
CM/QA
Manuals
Effort
Staff
0,404365 0,383571
0,982028 0,639643
3,633736 1,057388
1,160873 0,873314
Plans and
Product
Integration
Requirements
Design
Programming and Test
0,192618
0,122754
0,145349 0,029022
0,065437
0,402632
0,290699 0,058044
0,011586
0,119637
2,053061
0,39157
0,010848
0,045985
0,151987 0,029022
0,025001
0,061199
0,013414
0,024262
0,060716
0,124076
0,027667
0,078562
0,260999
0,265893
0,247724
0,218024
0,367238
0,096554
0,096554
0,09287
Plans and
Product
Integration and
Requirements
Design
Programming Test
0,182713
0,079955
0,042296
0,021833
0,062072
0,262253
0,084591
0,043666
0,010991
0,077926
0,597424
0,294575
0,01029
0,029952
0,044227
0,021833
0,023715
0,058052
0,012724
0,023014
Plans and
Requirements
47,63%
16,18%
2,87%
2,68%
6,18%
15,13%
3,32%
6,00%
0,039547
0,080817
0,018021
0,051171
0,075949
0,077373
0,072086
0,063443
0,27627
0,072636
0,072636
0,069865
Product
Integration and
Design
Programming Test
12,50%
4,00%
2,50%
41,00%
8,00%
5,00%
12,18%
56,50%
33,73%
4,68%
4,18%
2,50%
6,18%
12,63%
2,82%
8,00%
7,18%
7,32%
6,82%
6,00%
31,63%
8,32%
8,32%
8,00%
Module Name
Total Size
Total Effort
Monopoli
4192
5,776638
Overall
Plans And
Requirements
Product Design
Programming
Integration and Test
EFFORT
Requirements Analysis
Product Design
Programming
Test Planning
Verification and
Validation
Project Office
CM/QA
Manuals
PERSONNEL
Requirements Analysis
Product Design
Programming
Test Planning
Verification and
Validation
Project Office
CM/QA
Manuals
EFFORT (%)
Requirements Analysis
Product Design
Programming
Test Planning
Verification and
Validation
Project Office
CM/QA
Manuals
Schedule
(%)
Schedule
(Months)
16,73%
24,37%
54,54%
21,10%
Effort
(%)
1,054211
1,535277
3,43652
1,329274
7,00%
17,00%
62,90%
20,10%
Effort
0,404365
0,982028
3,633736
1,160873
Staff
0,383571
0,639643
1,057388
0,873314
Plans and
Product
Integration and
Requirements
Design
Programming Test
0,192618
0,122754
0,145349
0,029022
0,065437
0,402632
0,290699
0,058044
0,011586
0,119637
2,053061
0,39157
0,010848
0,045985
0,151987
0,029022
0,025001
0,061199
0,013414
0,024262
Plans and
Requirements
0,182713
0,062072
0,010991
0,01029
0,023715
0,058052
0,012724
0,023014
Plans and
Requirements
47,63%
16,18%
2,87%
2,68%
6,18%
15,13%
3,32%
6,00%
0,060716
0,124076
0,027667
0,078562
0,260999
0,265893
0,247724
0,218024
0,367238
0,096554
0,096554
0,09287
Product
Integration and
Design
Programming Test
0,079955
0,042296
0,021833
0,262253
0,084591
0,043666
0,077926
0,597424
0,294575
0,029952
0,044227
0,021833
0,039547
0,080817
0,018021
0,051171
0,075949
0,077373
0,072086
0,063443
0,27627
0,072636
0,072636
0,069865
Product
Integration and
Design
Programming Test
12,50%
4,00%
2,50%
41,00%
8,00%
5,00%
12,18%
56,50%
33,73%
4,68%
4,18%
2,50%
6,18%
12,63%
2,82%
8,00%
7,18%
7,32%
6,82%
6,00%
31,63%
8,32%
8,32%
8,00%
1.3 Pert
Il diagramma Pert (Program Evaluation and Review Tecnique), introdotto negli
anni ‘50 per la gestione del progetto Polaris della marina americana, è un grafo
orientato che riporta la sequenza delle attività coinvolte, le loro durate, e le
interdipendenze tra di queste.
Ogni attività è rappresentata da un nodo mentre le dipendenza sono
rappresentate da archi. Una volta stesa la rete delle attività, è possibile
individuare il cammino critico: sequenza di attività che determina l’intera
durata del progetto; le parallelizzazioni tra le mansioni, determinanti nel caso
di sviluppo concorrente, con i tempi di anticipo e di ritardo massimo su ogni
attività.
Per il Pert di questo progetto, l’unico punto di riferimento sui tempi è la stima
cocomo per fase, quindi l’approccio è stato quello di individuare le attività più
importanti di ogni fase, valutarle con delle durate la cui somma rispetti la stima
cocomo.
1.3.1 Fase di analisi
1.3.2 Fase di progetto
1.3.3 Fase di implementazione
1.3.4 Fase di test
1.3.5 Cammino critico
1.3.6 Attività svolte con relativo sforzo
1. Individuazione degli obiettivi del progetto (1)
2. Analisi dei dati (2)
3. Analisi dei requisiti (1)
4. Calcolo degli FP e del COCOMO (1)
5. Realizzazione del Pert e Gantt (1)
6. Progettazione del prototipo (4)
7. Progettazione del database (4)
8. Disegno dell’architettura software (6)
9. Stesura HTML (2)
10. Stesura SQL e creazione DB (3)
11. Realizzazione del manuale di installazione (2)
12. Stesura Java (59)
13. Definizione delle strategie di test (2)
14. Test a scatola nera (7)
15. Test a scatola bianca (10)
16. Eventuale debugging e walkthrough (3)
17. Assenstement del lavoro (1)
18. Installazione (1)
Durata complessiva in giorni/uomo: 110
Durata in giorni per ogni fase sono:
Analisi e pianificazione: 6
Progettazione del sistema: 14
Implementazione: 68
Test e validazione: 22
1.4
Gantt
Il diagramma Gantt (da Henry Gantt 1861-1919) è un diagramma temporale, da
integrare al Pert, che riporta sull’asse dei tempi tutte le attività rispettando
eventuali vincoli temporali. Sul diagramma vengono poi riportate le varie
scadenze (milestones) ed i potenziali parallelismi.
1.4.1 Diagramma
1.4.2 Vincoli del diagramma
Di comune accordo, il team ha deciso di sospendere i lavori nel periodo
dal 19/03/07 al 21/04/07 e dal 25/06/2007 al 22/09/2007 per sostenere i
vari esami e per le vacanze estive.
Inoltre abbiamo sottovalutato il progetto, avendo perso tempo
nell'acquisizione degli strumenti necessari alla realizzazione dello stesso
(studio del linguaggio HTML e JAVASCRIPT, cattura in formato
digitale delle immagini utilizzate: cartellini dei contratti, pedine,
tabellone, installazione di Jakarta Cactus, ecc…).
Di seguito viene riportato il Gantt effettivo:
Data di inizio: 19/01/2007
Data completamento o consegna: 10/4/2008
Pianificazione individuale
Il lavoro è stato pianificato rendendo lo sforzo il più possibile omogeneo su
tutti i membri del gruppo.
Andrea Mancini è il responsabile dell’implementazione del codice HTML,
JavaScript e della documentazione, Claudio Pulerà è il responsabile
dell’implementazione del codice Java, Servlet e Jsp, Vincenzo Manzella è il
responsabile della fase d’analisi e dell’implementazione dei casi di test, ma
comunque ogni partecipante del gruppo ha collaborato in tutti gli altri campi.
C’è da ricordare che le attività sono state sospese nei seguenti periodi sotto
elencati:
1.5.1 Andrea Mancini
Interruzione dal 19/03/07 al 21/04/07 per esami di marzo-aprile e dal
25/06/2007 al 22/09/2007 per esami di giugno-luglio-settembre e
vacanze estive
1.5.2 Claudio Pulerà
Interruzione dal 19/03/07 al 21/04/07 per esami di marzo-aprile e dal
25/06/2007 al 22/09/2007 per esami di giugno-luglio-settembre e
vacanze estive
1.5.3 Vincenzo Manzella
Interruzione dal 19/03/07 al 21/04/07 per esami di marzo-aprile e dal
25/06/2007 al 22/09/2007 per esami di giugno-luglio-settembre e
vacanze estive
Disegno del sistema
1
Architettura Hardware
Il sistema è disegnato per un’architettura di tipo Client/Server.
Lo scenario tipico di impiego è la partita al gioco Monopoli attraverso internet.
Il server è composto da una o più macchine sulle quali risiede il Web Server, le
Application server e il DBMS.
Per la comunicazione la larghezza di banda suggerita è di 4 Mbit/sec per colpa della
pesantezza della pagina del tabellone e del contesto a lei associata.
1.1 Server
I requisiti minimi del server sono essenzialmente legati alla capacità di calcolo
della macchina, al sistema operativo e al DBMS installato.
Il DBMS utilizzato per lo sviluppo è MySQL 5.0; nella sua documentazione
non sono indicati particolari requisiti minimi ed è compatibile con tutti i più
noti sistemi operativi.
La configurazione minima consigliata è la seguente:
• Processore 2 Ghz
• 1024 MB di Ram
• Hard Disk 200 GB
1.2 Client
Il client è un semplice calcolatore provvisto di una connessione ad internet.
La configurazione minima consigliata è la seguente:
• Processore 1 Ghz
• Ram 512 MB
• Spazio libero di 200 MB
1.3 Piattaforma di sviluppo
Notebook Packard Bell (XP)
• Processore Intel Centrino 1.8 Ghz
• 1 GB di Ram
• Hard Disk 80 GB
Notebook ASUS (XP)
• Processore Intel Centrino Duo 1.66 Ghz
• 1 GB di Ram
• Hard Disk 80 GB
Notebook IBM (XP)
• Processore Intel Pentium III 900 MHz
• 256 MB di Ram
• Hard Disk 20 GB
Notebook HP (XP)
• Processore Intel Centrino 1.2 GHz
• 512 MB di Ram
• Hard Disk 100 GB
Notebook IBM (XP)
• Processore Intel Pentium 4 1.9 GHz
• 512 MB di Ram
• Hard Disk 40 GB
Notebook HP (Vista / Linux-Ubuntu 10.7)
• Processore AMD Turion 64x2 2.2 GHz
• 2 GB di Ram
• Hard Disk 250 GB
Desktop Packard Bell (Vista)
• Processore Intel Core2 Duo 2.13 GHz
• 2 GB di Ram
• Hard Disk 500 GB
2
Architettura Software
La struttura di base del software segue quella del pattern MVC (Model, View,
Controller) in cui i vari componenti dell’applicazione vengono separati in moduli
che implementano funzionalità di gestione sui dati (Model), moduli dedicati alla
logica di controllo (Controller) ed i moduli che implementano la logica di
presentazione (View).
Questa soluzione è tra le più adottate nel mondo del software design perché risponde
bene ai canoni di modularità, flessibilità e manutenibilità delle applicazioni moderne
anche se va detto che non sempre viene utilizzata in maniera corretta.
Il codice è scritto in java 1.6 con l’impiego di alcune tecnologia derivate per
l’implementazione della logica di linstening e presentazione dei dati:
• Servlet: Tecnologia java multithreading che estende le funzionalità del Web
server completamente portabile e indipendente dal protocollo di
comunicazione, anche se, come nel nostro caso, si utilizza prevalentemente il
protocollo http. Una servlet è in grado di gestire lo stato degli utenti, leggere i
dati inviati dal client, manipolarli e passarli ad altri componenti.
• Java Servlet Pages (JSP): Particolare tipo di servlet che immerge
direttamente il codice java all’interno di pagine web. Gli scriplet (statement
java) vengono marcati con dei particolari tag e la pagina jsp viene tradotta in
una vera e propria servlet dal server al momento dell’invocazione.
La logica di accesso ai dati persistenti è stata implementata secondo il pattarn DAO
(Data Acces Object). Secondo questo schema, l’accesso ai dati è riservato
esclusivamente a delle classi dedicate, chiamate appunto DAO, in modo da rendere
indipendenti le classi di dominio dalla struttura e dalla rappresentazione degli oggetti
persistenti.
Le pagine web sono scritte in HTML con l’aggiunta di qualche script di tipo
Javascript per supportare la presentazione dei dati e per alleggerire un pò la logica di
controllo lato server.
Per le funzioni Application Server e Servlet Engine è stato utilizzato Apache Tomcat
5.5
3
Progetto della base di dati
A questo punto in cui si dispongono di requisiti sufficientemente stabili, si passa al
progetto del database. Progetto che si articola in progettazione concettuale,
progettazione logica e progettazione fisica. Questa fase viene spesso inserita
nell’analisi del dominio dell’applicazione, ma si è preferito collocarla a questo punto
per avere l’ausilio di un prototipo più raffinato.
3.1 Progettazione concettuale
La progettazione concettuale serve a rappresentare i dati del dominio di
interesse attraverso un modello formale ad alto livello che prende il nome di
scheda concettuale o schema ER (Entity-Relationship). In questa fase siamo
ancora fortemente orientati alla modellazione e l’unico aspetto che interessa
sono la correttezza nella rappresentazione dei dati.
3.1.1 Schema ER
Lo schema descrive la struttura del dominio a livello intenzionale ed ha
moltissimi concetti analoghi al Class Diagram UML tanto che l’uno può essere
ottenuto dall’altro con un processo di traduzione diretta. La differenza di fondo
sta nel fatto che l’ER tratta i dati come entità e non come classi di oggetti .
Degli altri costrutti utilizzati: relazioni, attributi, generalizzazioni se ne è già
parlato nel Class Diagram. È importante scegliere di un identificatore tra gli
attributi di entità. Anche in questo caso, gli aspetti sintattici che non vengono
colti dal modello possono essere scritti in vincoli esterni.
3.1.2 Scelte critiche effettuate nella fase di progettazione
E’ stato necessario aggiungere l’attributo “ora” come attributo
identificativo alle classe Partita. Questo ci ha consentito di poter gestire
il salvataggio di un maggior numero di partite e dando così agli utenti
finali una maggiore libertà nella creazione delle stesse. Abbiamo così
una terna (data, ora, codice) che identifica l’oggetto partita.
3.2
Progettazione logica
Si passa ora dal modello relazionale allo schema logico della base dati.
Vengono ora presi in considerazione anche aspetti legati all’efficienza e alle
prestazioni, per questo lo schema e gli eventuali vincoli, devono essere
corredati dalle informazioni rilevanti sul carico applicativo.
3.2.1 Ristrutturazione schema ER
Questa fase serve a rendere lo schema direttamente traducibile in schema
logico, senza ulteriori scelte progettuali. La ristrutturazione si concentra su quei
costrutti che non possono essere colti dalla struttura relazionale del database ed
i punti che vengono trattati, nel nostro caso, sono:
3.2.2 Schema ER ristrutturato
3.2.3 Schema logico
Utente (nome, cognome, dataNascita, nick, password, e-mail)
Giocatore(nome, cognome, dataNascita, nick, password, e-mail)
foreign key Giocatore [nick] ≤ Utente [nick]
foreign key Giocatore [nick] ≤ Utilizza [nickU]
foreign key Giocatore [nick] ≤ Sosta [nickS]
inclusion Giocatore [nick] ≤ Partecipa [nickP]
Utilizza (nickU, codiceU, dataU, oraU, pedina)
foreign key Utilizza [nickU] ≤ Giocatore [nick]
foreign key Utilizza [codiceU, dataU, oraU] ≤ Partita [codice, data, ora]
inclusion Utilizza [pedina] ≤ Pedina [immagine]
Pedina (immagine)
inclusion Pedina [immagine] ≤ Utilizza [pedina]
Sosta (nickS, codiceS, dataS, oraS, casella)
foreign key Sosta [nickS] ≤ Giocatore [nick]
foreign key Sosta [codiceS, dataS, oraS] ≤ Partita [codice, data, ora]
inclusion Sosta [casella] ≤ Caselle [NumCasella]
Partecipa (nickP, codiceP, data, ora, soldi)
foreign key Partecipa[nickP] ≤ Giocatore [nick]
foreign key Partecipa [codiceP, dataP, oraP] ≤ Partita [codice, data, ora]
Partita (data, codice, data, ora)
foreign key Partita[codice, data, ora] ≤ Possiede [codicePO, dataPO, oraPO]
foreign key Partita[codice, data, ora] ≤ Ha [codiceH, dataPO, oraPO]
inclusion Partita[codice, data, ora] ≤ Partecipa [codiceP, dataP, oraP]
foreign key Partita[codice, data, ora] ≤ Vincitore [codiceV, dataV, oraV]
foreign key Partita[codice, data, ora] ≤ Utilizza [codiceU, dataU, oraU]
foreign key Partita[codice, data, ora] ≤ Sosta [codiceS, dataS, oraS]
Vincitore (Saldofinale, nickV, codiceV, dataV, oraV)
foreign key Vincitore[codiceV, dataV, oraV] ≤ Partita[codice, data, ora]
foreign key Vincitore [nickV] ≤ Giocatore [nick]
Possiede (codicePO, nickPO, contratto)
foreign key Possiede [nickPO] ≤ Giocatore [nick]
foreign key Possiede [codicePO, dataPO, oraPO] ≤ Partita [codice, data, ora]
foreign key Possiede [contratto] ≤ Contratto [nome]
Contratto (pedaggio, nome, prezzo, ipoteca)
foreign key Contratto [nome] ≤ Possiede [contratto]
foreign key Contratto [nome]≤ Associato [nomeC]
Associato (nomeA, coloreA)
Foreign key Associato [nomeA] ≤ Contratto [nome]
Foreign key Associato [coloreA] ≤ Territorio [colore]
Edificabile (valoreCasa, nomeE)
foreign key Edificabile [nomeE] ≤ Contratto [nome]
inclusion Edificabile [nomeE] ≤ Ha [nomeH]
Ha (numeroCase, nickH, codiceH, dataH, oraH, nomeH)
foreign key Ha [nickH] ≤ Giocatore [nick]
foreign key Ha [codiceH, dataH, oraH] ≤ Partita [codice, data, ora]
foreign key Ha [nomeH] ≤ Edificabile [nomeC]
NonEdificabile (nomeNE)
foreign key NonEdificabile [nomeC] ≤ Contratto [nome]
Caselle (numCasella, nomeC)
inclusion key Caselle [numCasella] ≤ Sosta [casella]
Speciali (soldi, testo, numCasellaS)
foreign key [numCasellaS] ≤ casella [numCasella]
Territori (colore, numCasellaT)
foreign key Territori [numCasellaT] ≤ Caselle [numCasella]
foreign key Territori [colore] ≤ Associato [coloreA]
Carte (numId, testo, importo)
Imprevisti (numIdI)
foreign key Imprevisti [numIdI] ≤ Carte [numId]
Probabilità (numIdP)
foreign key Probabilità [numIdP] ≤ Carte [numId]
3.2.4 Vincoli
Vincoli esterni:
La terna Giocatore G, Partita P, Edificabile E della relazione “possiede” deve essere uguale alla
terna presente nella relazione “Ha”
3.2.5 Politiche di cancellazione
Per quanto riguarda le politiche di cancellazione, abbiamo scelto di eliminare i dati
all’interno della base dopo l’operazione di ripristino perché in caso della terminazione della
partita non abbiamo più bisogno di memorizzare i dati avendo così un risparmio eliminando
così la fase di update. Tutto funziona alla perfezione con solo le due fasi di inserimento e
cancellazione.
I dati della partita restano disponibili a runtime e in caso di interruzione, si ha la fase di
salvataggio (insert) che va a memorizzare tutti i dati sulla base, mentre in caso di
terminazione gli unici dati salvati sono quelli relativi alla classifica generale (Vincitore,
Partita e Saldo finale).
3.2.6 Viste
Non sono state necessarie viste per il progetto.
3.3
N°
Glossario
3.3.1 Entità
Entità
Descrizione
Persona che accede a
internet
1
Utente
2
Giocatore
3
Pedina
4
Partita
Utente che partecipa al
Gioco
immagine identificante
il giocatore nella partita
sessione di gioco
Attributi
Password
Nick
DataNascita
Cognome
Nome
E-mail
Immagine
10
Data
Ora
Codice
Territorio in possesso del Pedaggio
Contratto
giocatore o della banca
Nome
Prezzo
Ipoteca
Contratto sul quale è
Valore casa
Edificabile
possibile costruire case
e/o alberghi
Contratto sul quale non è
NonEdificabile possibile costruire case
e/o alberghi
Caselle
unità del tabellone sulle Num casella
quali si svolge il gioco
nome
Speciali
caselle del tipo imprevisti Soldi
O probabilità
Testo
Territori
territori acquistabili
Colore
11
Carte
Cartoncini di imprevisti e
probabilità
12
13
Imprevisti
Probabilità
Carta Imprevisti
Carta delle probabilità
5
6
7
8
9
Testo
Importo
Num Id
Identificatori
Nick
Password
Nick
Password
Immagine
Data
Ora
Codice
Nome
Nome
Nome
num casella
nome
Testo
nome
Colore
nome
Num Id
Num Id
num id
3.3.2 Relazioni
N°
Relazioni
1
Isa U-G
2
Sosta
3
Utilizza
4
Vincitore
5
Partecipa
6
Possiede
7
Ha
8
Isa Co-E
9
Isa Co-Ne
10
Associato
11
Isa C-S
12
Isa C-T
13
Isa C-Im
14
Isa C-Pr
Descrizione
componenti
Utente
Giocatore
casella occuparta dal
Giocatore
giocatore durante la
Partita
Partita
Caselle
Pedina che viene usata
Giocatore
dal giocatore durante la
Pedina
Partita
Partita
Vincitore della partita
Giocatore
Partita
giocatore fa parte della
Giocatore
Parita
Partita
contratto appartenente a Giocatore
Un giocatore durante una Contratto
Partita
Partita
contratto edificabile in
Giocatore
possesso di un giocatore Edificabile
nella partita
Partita
Contratto - edificabile
Contratto
Edificabile
Contratto NonEdificabile
Contratto
NonEdificabile
il contratto si riferisce ad Contratto
una casella del tabellone Territori
Caselle - Speciali
Caselle
Speciali
Caselle - Territori
Caselle
Territori
Carte - Imprevisti
Carte
Imprevisti
Carte - probabilità
Carte
Probabilità
attributi
Utente giocatore
saldofinale
saldo
Numerocase
3.3.3 Attributi
N°
Attributo
Entità/Relazione
Dominio
Descrizione
1
2
3
4
5
6
7
Nick
Password
dataNascita
Cognome
Nome
E-mail
Immagine
Utente / Giocatore
Utente / Giocatore
Utente / Giocatore
Utente / Giocatore
Utente / Giocatore
Utente / Giocatore
Pedina
Stringa
Stringa
Stringa
Stringa
Stringa
Stringa
Stringa
8
9
10
11
Data
Ora
Codice
Pedaggio
Partita
Partita
Partita
Contratto
Stringa
Stringa
Stringa
Intero
12
13
14
Nome
Prezzo
Ipoteca
Contratto
Contratto
Contratto
Stringa
Intero
Intero
15
Valore casa
Edificabile
Intero
16
17
Num casella
Nome
Casella
Casella
Intero
Stringa
18
Soldi
Speciali
Stringa
19
Testo
Speciali
Stringa
20
21
Colore
Testo
Territori
Carte
Stringa
Stringa
22
Importo
Carte
Intero
23
Num Id
Carte
Intero
24
25
Saldo finale
Soldi
Vincitore
Partecipa
Intero
Intero
nome utilizzato nella fase di gioco
codice per identificare un utente
data di nascita dell'utente
Cognome dell'utente
Nome dell'utente
E-mail dell'utente
Immagine della pedina che può
essere scelta dai giocatori
Data nella quale si svolge la partita
Ora di creazione della partita
Codice identificativo della partita
Quota da pagare se ci si ferma
sul territorio indicato
Nome che identifica il contratto
Prezzo per l'acquisto del contratto
Quota da ricevere in caso venga
ipotecato il territorio
Valore da sborzare per l'acquisto
di una casa su quel territorio
numero che identifica la casella
nome della casella
quota da ricevere o versare
quando
si sosta nella casella speciale
Testo visualizzato sulla casella
Colore identificativo di uno
territorio
Testo visualizzato sul cartellino
Quota da pagare/ricevere quando
viene estratto il cartellino Imprevisti
o probabilità
numero che identifica un cartellino
patrimonio accumulato dal
vincitore
soldi del giocatore in una partita
26
numero case
Ha
Intero
numero di case sul territorio
3.4 Sorgenti SQL per la creazione del database
MySQL non supporta la reazione di vincoli con clausola check o di assertion
pertanto verranno gestiti dall’applicazione
3.4.1 Creazione del database, tabelle e prepopolamento.
drop database monopoli;
create database monopoli;
use monopoli;
drop table Utente;
Create table Utente (
nome character (30) not null,
cognome character (30) not null,
dataNascita character (10) not null,
nick character (30) primary key,
password character (30) not null,
e_mail character (62) not null,
unique (nome, cognome, dataNascita)
);
drop table Partita;
Create table Partita (
codice character (30) not null,
data character (10) not null,
ora character (10) not null,
unique (codice, data, ora)
);
drop table Pedina;
create table Pedina (
immagine character (8) primary key
);
drop table Sosta;
Create table Sosta(
nickS character (30) not null,
codiceS character (30) not null,
dataS character (10) not null,
oraS character (10) not null,
casella integer not null,
primary key (nickS, codiceS, dataS, oraS, casella),
foreign key (nickS) references Utente (nick) ON DELETE CASCADE ON
UPDATE CASCADE,
foreign key (codiceS, dataS, oraS) references Partita (codice, data,
ora) ON DELETE CASCADE ON UPDATE CASCADE
);
drop table Partecipa;
Create table Partecipa(
ordine int (1) not null,
soldi int (10) not null,
nickP character (30) not null,
codiceP character (30) not null,
dataP character (10) not null,
oraP character (10) not null,
primary key (nickP, codiceP, dataP, oraP),
foreign key (nickP) references Utente (nick) ON DELETE CASCADE ON
UPDATE CASCADE,
foreign key (codiceP, dataP, oraP) references Partita (codice, data,
ora) ON DELETE CASCADE ON UPDATE CASCADE
);
drop table Contratto;
create table Contratto(
pedaggio integer (4) not null,
nome character (30) primary key,
prezzo integer (4) not null,
ipoteca integer (4) not null
);
drop table Possiede;
Create table Possiede(
nickP character (30) not null,
codiceP character (30) not null,
dataP character (10) not null,
oraP character (10) not null,
contratto character (30) not null,
ipoteca bit not null,
primary key (nickP, codiceP, dataP, oraP, contratto),
foreign key (codiceP, dataP, oraP) references Partita (codice, data,
ora) ON DELETE CASCADE ON UPDATE CASCADE,
foreign key (nickP) references Utente (nick) ON DELETE CASCADE ON
UPDATE CASCADE,
foreign key (contratto) references Contratto (nome) ON DELETE
CASCADE ON UPDATE CASCADE
);
drop table Edificabile;
Create table Edificabile(
valoreCasa integer (4) not null,
nomeE character (30) not null,
unique (valoreCasa, nomeE),
foreign key (nomeE) references Contratto (nome)ON DELETE CASCADE ON
UPDATE CASCADE
);
drop table Ha;
Create table Ha(
numeroCase integer (4) not null,
nickH character (30) not null,
codiceH character (30) not null,
dataH character (10) not null,
oraH character (10) not null,
nomeH character (30) not null,
primary key (nickH, codiceH, dataH, oraH, nomeH),
foreign key (nickH) references Utente (nick)ON DELETE CASCADE ON
UPDATE CASCADE,
foreign key (codiceH, dataH, oraH) references Partita (codice, data,
ora)ON DELETE CASCADE ON UPDATE CASCADE,
foreign key (nomeH) references Edificabile (nomeE)ON DELETE CASCADE
ON UPDATE CASCADE
);
drop table Caselle;
Create table Caselle(
numCasella integer (2) primary key,
nome character (30) not null
);
drop table Speciali;
Create table Speciali(
soldi integer (4) default 0,
testo varchar (300) not null,
numCaselleS integer (2) primary key,
foreign key (numCaselleS) references Caselle (numCasella)ON DELETE
CASCADE ON UPDATE CASCADE
);
drop table Territori;
Create table Territori(
colore character (30) not null,
numCasellaT integer (2) primary key,
foreign key (numCasellaT) references Caselle (numCasella)ON DELETE
CASCADE ON UPDATE CASCADE
);
drop table Carte;
Create table Carte(
numId integer (2) primary key,
testo varchar (300) not null,
importo integer (4) default '0'
);
drop table Imprevisti;
Create table Imprevisti(
numIdI integer (2) primary key references carte (numId),
foreign key (numIdI) references Carte (numId)ON DELETE CASCADE ON
UPDATE CASCADE
);
drop table Probabilita;
Create table Probabilita(
numIdP integer (2) primary key,
foreign key (numIdP) references Carte (numId)ON DELETE CASCADE ON
UPDATE CASCADE
);
drop table Utilizza;
Create table Utilizza (
nickU character (30) not null,
codiceU character (30) not null,
dataU character (10) not null,
oraU character (10) not null,
pedina character (8) not null,
primary key (nickU, codiceU,dataU, oraU, pedina),
foreign key (nickU) references Utente (nick)ON DELETE CASCADE ON
UPDATE CASCADE,
foreign key (codiceU, dataU, oraU) references Partita (codice, data,
ora)ON DELETE CASCADE ON UPDATE CASCADE,
foreign key (pedina) references Pedina (immagine)ON DELETE CASCADE
ON UPDATE CASCADE
);
drop table Associato;
create table Associato(
nomeA character (30) primary key,
numcasellaA integer (2) not null,
foreign key (nomeA) references Contratto (nome)ON DELETE CASCADE ON
UPDATE CASCADE,
foreign key (numcasellaA) references Territori (NumcasellaT)ON
DELETE CASCADE ON UPDATE CASCADE
);
drop table CaseAlberghi;
create table CaseAlberghi(
nomeCA character (30) not null,
numero integer (2) not null,
costo integer (5) not null,
unique (nomeCA, numero, costo),
foreign key (nomeCA) references Contratto (nome)ON DELETE CASCADE ON
UPDATE CASCADE
);
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
Contratto
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
Edificabile
insert
insert
insert
insert
insert
into
into
into
into
into
Caselle
Caselle
Caselle
Caselle
Caselle
(60,'Stazione Nord', 480, 250);
(60, 'Stazione Sud', 480, 250);
(60, 'Stazione Est', 480, 250);
(60, 'Stazione Ovest', 480, 250);
(5, 'Vicolo Corto', 150, 75);
(10, 'Vicolo Stretto', 150, 75);
(15, 'Bastioni Gran Sasso', 250, 125);
(15, 'Viale Monterosa', 250, 125);
(20, 'Viale Vesuvio', 300, 150);
(25, 'Via Accademia', 350, 175);
(25, 'Corso Ateneo', 350, 175);
(30, 'Piazza Universita', 400, 200);
(35, 'Via Verdi', 450, 225);
(35, 'Corso Raffaello', 450, 225);
(40, 'Piazza Dante', 500, 250);
(45, 'Via Marco Polo', 550, 275);
(45, 'Corso Magellano', 550, 275);
(50, 'Largo Colombo', 600, 300);
(55, 'Viale Costantino', 650, 325);
(55, 'Viale Traiano', 650, 325);
(60, 'Piazza Giulio Cesare', 700, 350);
(65, 'Via Roma', 750, 375);
(65, 'Corso Impero', 750, 375);
(70, 'Largo Augusto', 800, 400);
(90, 'Viale dei Giardini', 900, 450);
(125, 'Parco della Vittoria', 1000, 500);
(50, 'Societa Elettrica', 380, 190);
(50, 'Societa Acqua Potabile', 380, 190);
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
(
(
(
(
(
(125,
(125,
(125,
(125,
(125,
(250,
(250,
(250,
(250,
(250,
(250,
(375,
(375,
(375,
(375,
(375,
(375,
(500,
(500,
(500,
(500,
(500,
'Vicolo Corto');
'Vicolo Stretto');
'Bastioni Gran Sasso');
'Viale Monterosa');
'Viale Vesuvio');
'Via Accademia');
'Corso Ateneo');
'Piazza Universita');
'Via Verdi');
'Corso Raffaello');
'Piazza Dante');
'Via Marco Polo');
'Corso Magellano');
'Largo Colombo');
'Viale Costantino');
'Viale Traiano');
'Piazza Giulio Cesare');
'Via Roma');
'Corso Impero');
'Largo Augusto');
'Viale dei Giardini');
'Parco della Vittoria');
01,'Vicolo Corto');
02,'Probabilita');
03,'Vicolo Stretto');
04,'Tassa Patrimoniale');
05,'Stazione Sud');
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
Caselle
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
Territori
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
06,'Bastioni Gran Sasso');
07,'Imprevisti');
08,'Viale Monterosa');
09,'Viale Vesuvio');
10,'Prigione - Transito');
11,'Via Accademia');
12,'Societa Elettrica');
13,'Corso Ateneo');
14,'Piazza Universita');
15,'Stazione Ovest');
16,'Via Verdi');
17,'Probabilita');
18,'Corso Raffaello');
19,'Piazza Dante');
20,'Parcheggio Gratuito');
21,'Via Marco Polo');
22,'Imprevisti');
23,'Corso Magellano');
24,'Largo Colombo');
25,'Stazione Nord');
26,'Viale Costantino');
27,'Viale Traiano');
28,'Societa Acqua Potabile');
29,'Piazza Giulio Cesare');
30,'Prigione');
31,'Via Roma');
32,'Corso Impero');
33,'Probabilita');
34,'Largo Augusto');
35,'Stazione Est');
36,'Imprevisti');
37,'Viale dei Giardini');
38,'Tassa di Lusso');
39,'Parco della Vittoria');
40, 'Via');
('Rosa',01);
('Rosa', 03);
('Stazione', 05);
('Celeste', 06);
('Celeste', 08);
('Celeste', 09);
('Arancione',11);
('Societa', 12);
('Arancione', 13);
('Arancione', 14);
('Stazione', 15);
('Marrone',16);
('Marrone', 18);
('Marrone',19);
('Rosso', 21);
('Rosso', 23);
('Rosso', 24);
('Stazione', 25);
('Giallo', 26);
('Giallo', 27);
('Societa', 28);
('Giallo',29);
( 'Verde',31);
('Verde', 32);
('Verde', 34);
('Stazione', 35);
('Viola', 37);
insert into Territori values ('Viola', 39);
insert into Carte values (01, 'Maturano le cedole delle vostre cartelle di
rendita, ritirate 375 Euro', 375);
insert into Carte values (02, 'Matrimonio in famiglia spese impreviste 375
Euro',375);
insert into Carte values (03, 'Andate fino al Parco della Vittoria', 0);
insert into Carte values (04, 'Andate avanti fino al VIA', 0);
insert into Carte values (05, 'Andate sino a Via Accademia: se passate dal
<<Via!>> ritirate 500 Euro', 500);
insert into Carte values (06, 'Fate tre passi indietro (con tanti auguri!)', 0);
insert into Carte values (07, 'Cena fuori con la tua metà, pagate 50 Euro', 50);
insert into Carte values (08, 'Andate in prigione direttamente e senza passare
dal <<Via!>>', 0);
insert into Carte values (09, 'Avete tutti i vostri stabili da riparare: pagare
60 Euro per ogni casa e 250 Euro per ogni albergo', 0);
insert into Carte values (10, 'Andate sino al Largo Colombo se passate dal
<<Via!>> ritirate 500 Euro', 500);
insert into Carte values (11, 'Dovete pagare un contributo di miglioria
stradale, 100 Euro per ogni casa e 250 Euro per ogni albergo che possedete', 0);
insert into Carte values (12, 'Avete vinto un terno al lotto: ritirate 250
Euro', 250);
insert into Carte values (13, 'Versate 50 Euro per beneficenza', 50);
insert into Carte values (14, 'Andate alla Stazione NORD: se passate dal
<<Via!>> ritirate 500 Euro', 500);
insert into Carte values (15, 'La banca vi paga gli interessi del vostro conto
corrente, ritirate 125 Euro', 125);
insert into Carte values (16, 'Multa di 40 Euro per aver guidato senza patente',
40);
insert into Carte values (17, 'Andate fino al <<Via!>>', 0);
insert into Carte values (18, 'Andate in prigione direttamente e senza passare
dal <<Via!>>', 0);
insert into Carte values (19, 'Cena fuori con la tua metà, pagate 50 Euro', 50);
insert into Carte values (20, 'Complimenti S maturata la cedola delle vostre
azioni ritirate 60 Euro', 60);
insert into Carte values (21, 'Pagate una multa di 25 Euro', 25);
insert into Carte values (22, 'Avete vinto il secondo premio in un concorso di
bellezza: ritirate 25 Euro', 25);
insert into Carte values (23, 'Ritornate al Vicolo Corto', 0);
insert into Carte values (24, 'Scade il vostro premio di assicrazione pagate 125
Euro', 125);
insert into Carte values (25, 'Avete perso una causa: pagate 250 Euro', 250);
insert into Carte values (26, 'Ereditate da un lontano parente 250 Euro', 250);
insert into Carte values (27, 'Pagate il conto del Dottore: 125 Euro', 125);
insert into Carte values (28, 'Rimborso tassa sul reddito: ritirate 50 Euro
dalla Banca', 50);
insert into Carte values (29, 'Auguri!!! il vostro compleanno: ogni giocatore vi
regala 25 Euro', 25);
insert into Carte values (30, 'Avete venduto delle azioni ricavate 125 Euro',
125);
insert into Carte values (31, 'Siete creditori verso la Banca di 500 Euro:
ritirateli', 500);
insert into Carte values (32, 'Avete vinto un premio di consolazione alla
Lotteria di Merano: ritirate 250 Euro', 250);
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
values
values
values
values
values
values
values
(01);
(02);
(03);
(04);
(05);
(06);
(07);
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
Imprevisti
values
values
values
values
values
values
values
values
values
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
Probabilita
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
Associato
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
Pedina
Pedina
Pedina
Pedina
Pedina
Pedina
(08);
(09);
(10);
(11);
(12);
(13);
(14);
(15);
(16);
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
(17);
(18);
(19);
(20);
(21);
(22);
(23);
(24);
(25);
(26);
(27);
(28);
(29);
(30);
(31);
(32);
('Bastioni Gran Sasso', 06);
('Corso Ateneo', 13);
('Corso Impero', 32);
('Corso Magellano', 23);
('Corso Raffaello', 18);
('Largo Augusto', 24);
('Largo Colombo', 34);
('Parco della Vittoria', 39);
('Piazza Dante', 19);
('Piazza Giulio Cesare', 29);
('Piazza Universita', 14);
('Societa Acqua Potabile', 28);
('Societa Elettrica', 12);
('Stazione Est', 35);
('Stazione Nord', 25);
('Stazione Ovest', 15);
('Stazione Sud', 05);
('Via Accademia', 11);
('Via Marco Polo', 21);
('Via Roma', 31);
('Via Verdi', 16);
('Viale Costantino', 26);
('Viale dei Giardini', 37);
('Viale Monterosa', 08);
('Viale Traiano', 27);
('Viale Vesuvio', 09);
('Vicolo Corto', 01);
('Vicolo Stretto', 03);
('Fiasco');
('Fungo');
('Candela');
('Pianta');
('Pera');
('Mela');
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
('Vicolo Corto', 01, 25);
('Vicolo Corto', 02, 75);
('Vicolo Corto', 03, 225);
('Vicolo Corto', 04, 400);
('Vicolo Corto', 05, 625);
('Vicolo Stretto', 01, 50);
('Vicolo Stretto', 02, 150);
('Vicolo Stretto', 03, 450);
('Vicolo Stretto', 04, 800);
('Vicolo Stretto', 05, 1125);
('Bastioni Gran Sasso', 01,75);
('Bastioni Gran Sasso', 02,225);
('Bastioni Gran Sasso', 03,675);
('Bastioni Gran Sasso', 04,1000);
('Bastioni Gran Sasso', 05,1375);
('Viale Monterosa', 01, 75);
('Viale Monterosa', 02, 225);
('Viale Monterosa', 03, 675);
('Viale Monterosa', 04, 1000);
('Viale Monterosa', 05, 1375);
('Viale Vesuvio', 01, 100);
('Viale Vesuvio', 02, 250);
('Viale Vesuvio', 03, 750);
('Viale Vesuvio', 04, 1125);
('Viale Vesuvio', 05, 1500);
('Via Accademia', 01, 125);
('Via Accademia', 02, 375);
('Via Accademia', 03, 1125);
('Via Accademia', 04, 1550);
('Via Accademia', 05, 1875);
('Corso Ateneo', 01, 125);
('Corso Ateneo', 02, 175);
('Corso Ateneo', 03, 1125);
('Corso Ateneo', 04, 1550);
('Corso Ateneo', 05, 1875);
('Piazza Universita', 01, 150);
('Piazza Universita', 02, 450);
('Piazza Universita', 03, 1250);
('Piazza Universita', 04, 1750);
('Piazza Universita', 05, 2250);
('Via Verdi', 01, 175);
('Via Verdi', 02, 500);
('Via Verdi', 03, 1375);
('Via Verdi', 04, 1875);
('Via Verdi', 05, 2375);
('Corso Raffaello', 01, 175);
('Corso Raffaello', 02, 500);
('Corso Raffaello', 03, 1375);
('Corso Raffaello', 04, 1875);
('Corso Raffaello', 05, 2375);
('Piazza Dante', 01, 200);
('Piazza Dante', 02, 550);
('Piazza Dante', 03, 1500);
('Piazza Dante', 04, 2000);
('Piazza Dante', 05, 2500);
('Via Marco Polo', 01, 225);
('Via Marco Polo', 02, 625);
('Via Marco Polo', 03, 1750);
('Via Marco Polo', 04, 2200);
('Via Marco Polo', 05, 2625);
('Corso Magellano', 01, 225);
('Corso Magellano', 02, 625);
('Corso Magellano', 03, 1750);
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
CaseAlberghi
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
('Corso Magellano', 04, 2200);
('Corso Magellano', 05, 2625);
('Largo Colombo', 01, 250);
('Largo Colombo', 02, 750);
('Largo Colombo', 03, 1875);
('Largo Colombo', 04, 2250);
('Largo Colombo', 05, 2750);
('Viale Costantino', 01, 275);
('Viale Costantino', 02, 825);
('Viale Costantino', 03, 2000);
('Viale Costantino', 04, 2500);
('Viale Costantino', 05, 3000);
('Viale Traiano', 01, 275);
('Viale Traiano', 02, 825);
('Viale Traiano', 03, 2000);
('Viale Traiano', 04, 2500);
('Viale Traiano', 05, 3000);
('Piazza Giulio Cesare', 01, 300);
('Piazza Giulio Cesare', 02, 900);
('Piazza Giulio Cesare', 03, 2125);
('Piazza Giulio Cesare', 04, 2625);
('Piazza Giulio Cesare', 05, 3125);
('Via Roma', 01, 325);
('Via Roma', 02, 1000);
('Via Roma', 03, 2250);
('Via Roma', 04, 2750);
('Via Roma', 05, 3250);
('Corso Impero', 01, 325);
('Corso Impero', 02, 1000);
('Corso Impero', 03, 2250);
('Corso Impero', 04, 2750);
('Corso Impero', 05, 3250);
('Largo Augusto', 01, 375);
('Largo Augusto', 02, 1125);
('Largo Augusto', 03, 2500);
('Largo Augusto', 04, 3000);
('Largo Augusto', 05, 3500);
('Viale dei Giardini', 01, 500);
('Viale dei Giardini', 02, 1250);
('Viale dei Giardini', 03, 2750);
('Viale dei Giardini', 04, 3000);
('Viale dei Giardini', 05, 3500);
('Parco della Vittoria', 01, 500);
('Parco della Vittoria', 02, 1500);
('Parco della Vittoria', 03, 3500);
('Parco della Vittoria', 04, 4250);
('Parco della Vittoria', 05, 5000);
drop table Turno;
create table Turno(
nickT character (30) not null,
codiceT character (30) not null,
dataT character (10) not null,
oraT character (10) not null,
primary key (nickT, codiceT,dataT, oraT),
foreign key (nickT) references Utente (nick) ON DELETE CASCADE ON
UPDATE CASCADE
);
drop table Vincitore;
Create table Vincitore(
saldofinale int (10) not null,
nickV character (30) not null,
codiceV character (30) not null,
dataV character (10) not null,
oraV character (10) not null,
primary key (codiceV, dataV, oraV)
);
drop table URL;
Create table URL (
Nome character (30) not null,
Url character (100) primary key,
unique (Nome, Url)
);
insert into Url values ('Vicolo Stretto',
'prototipofreddo5Territori_files/VicoloStretto.jpg');
insert into Url values ('Vicolo StrettoR',
'prototipofreddo5Territori_files/VicoloStretto_retro.jpg');
insert into Url values ('Vicolo Corto',
'prototipofreddo5Territori_files/VicoloCorto.jpg');
insert into Url values ('Vicolo CortoR',
'prototipofreddo5Territori_files/VicoloCorto_retro.jpg');
insert into Url values ('Viale Vesuvio',
'prototipofreddo5Territori_files/VialeVesuvio.jpg');
insert into Url values ('Viale VesuvioR',
'prototipofreddo5Territori_files/VialeVesuvio_retro.jpg');
insert into Url values ('Viale Traiano',
'prototipofreddo5Territori_files/VialeTraiano.jpg');
insert into Url values ('Viale TraianoR',
'prototipofreddo5Territori_files/VialeTraiano_retro.jpg');
insert into Url values ('Viale Monterosa',
'prototipofreddo5Territori_files/VialeMonterosa.jpg');
insert into Url values ('Viale MonterosaR',
'prototipofreddo5Territori_files/VialeMonterosa_retro.jpg');
insert into Url values ('Viale dei Giardini',
'prototipofreddo5Territori_files/VialeDeiGiardini.jpg');
insert into Url values ('Viale dei GiardiniR',
'prototipofreddo5Territori_files/VialeDeiGiardini_retro.jpg');
insert into Url values ('Viale Costantino',
'prototipofreddo5Territori_files/VialeCostantino.jpg');
insert into Url values ('Viale CostantinoR',
'prototipofreddo5Territori_files/VialeCostantino_retro.jpg');
insert into Url values ('Via Verdi',
'prototipofreddo5Territori_files/ViaVerdi.jpg');
insert into Url values ('Via VerdiR',
'prototipofreddo5Territori_files/ViaVerdi_retro.jpg');
insert into Url values ('Via Roma',
'prototipofreddo5Territori_files/ViaRoma.jpg');
insert into Url values ('Via RomaR',
'prototipofreddo5Territori_files/ViaRoma_retro.jpg');
insert into Url values ('Via Marco Polo',
'prototipofreddo5Territori_files/ViaMarcoPolo.jpg');
insert into Url values ('Via Marco PoloR',
'prototipofreddo5Territori_files/ViaMarcoPolo_retro.jpg');
insert into Url values ('Via Accademia',
'prototipofreddo5Territori_files/ViaAccademia.jpg');
insert into Url values ('Via AccademiaR',
'prototipofreddo5Territori_files/ViaAccademia_retro.jpg');
insert into Url values ('Stazione Sud',
'prototipofreddo5Territori_files/StazioneSud.jpg');
insert into Url values ('Stazione SudR',
'prototipofreddo5Territori_files/StazioneSud_retro.jpg');
insert into Url values ('Stazione Ovest',
'prototipofreddo5Territori_files/StazioneOvest.jpg');
insert into Url values ('Stazione OvestR',
'prototipofreddo5Territori_files/StazioneOvest_retro.jpg');
insert into Url values ('Stazione Nord',
'prototipofreddo5Territori_files/StazioneNord.jpg');
insert into Url values ('Stazione NordR',
'prototipofreddo5Territori_files/StazioneNord_retro.jpg');
insert into Url values ('Stazione Est',
'prototipofreddo5Territori_files/StazioneEst.jpg');
insert into Url values ('Stazione EstR',
'prototipofreddo5Territori_files/StazioneEst_retro.jpg');
insert into Url values ('Societa Elettrica',
'prototipofreddo5Territori_files/SocietaElettrica.jpg');
insert into Url values ('Societa ElettricaR',
'prototipofreddo5Territori_files/SocietaElettrica_retro.jpg');
insert into Url values ('Societa Acqua Potabile',
'prototipofreddo5Territori_files/SocietaAcquaPotabile.jpg');
insert into Url values ('Societa Acqua PotabileR',
'prototipofreddo5Territori_files/SocietaAcquaPotabile_retro.jpg');
insert into Url values ('Piazza Universita',
'prototipofreddo5Territori_files/PiazzaUniversita.jpg');
insert into Url values ('Piazza UniversitaR',
'prototipofreddo5Territori_files/PiazzaUniversita_retro.jpg');
insert into Url values ('Piazza Giulio Cesare',
'prototipofreddo5Territori_files/PiazzaGiulioCesare.jpg');
insert into Url values ('Piazza Giulio CesareR',
'prototipofreddo5Territori_files/PiazzaGiulioCesare_retro.jpg');
insert into Url values ('Piazza Dante',
'prototipofreddo5Territori_files/PiazzaDante.jpg');
insert into Url values ('Piazza DanteR',
'prototipofreddo5Territori_files/PiazzaDante_retro.jpg');
insert into Url values ('Parco della Vittoria',
'prototipofreddo5Territori_files/ParcoDellaVittoria.jpg');
insert into Url values ('Parco della VittoriaR',
'prototipofreddo5Territori_files/ParcoDellaVittoria_retro.jpg');
insert into Url values ('Largo Colombo',
'prototipofreddo5Territori_files/LargoColombo.jpg');
insert into Url values ('Largo ColomboR',
'prototipofreddo5Territori_files/LargoColombo_retro.jpg');
insert into Url values ('Largo Augusto',
'prototipofreddo5Territori_files/LargoAugusto.jpg');
insert into Url values ('Largo AugustoR',
'prototipofreddo5Territori_files/LargoAugusto_retro.jpg');
insert into Url values ('Corso Raffaello',
'prototipofreddo5Territori_files/CorsoRaffaello.jpg');
insert into Url values ('Corso RaffaelloR',
'prototipofreddo5Territori_files/CorsoRaffaello_retro.jpg');
insert into Url values ('Corso Magellano',
'prototipofreddo5Territori_files/CorsoMagellano.jpg');
insert into Url values ('Corso MagellanoR',
'prototipofreddo5Territori_files/CorsoMagellano_retro.jpg');
insert into Url values ('Corso Impero',
'prototipofreddo5Territori_files/CorsoImpero.jpg');
insert into Url values ('Corso ImperoR',
'prototipofreddo5Territori_files/CorsoImpero_retro.jpg');
insert into Url values ('Corso Ateneo',
'prototipofreddo5Territori_files/CorsoAteneo.jpg');
insert into Url values ('Corso AteneoR',
'prototipofreddo5Territori_files/CorsoAteneo_retro.jpg');
insert into Url values ('Bastioni Gran Sasso',
'prototipofreddo5Territori_files/BastioniGranSasso.jpg');
insert into Url values ('Bastioni Gran SassoR',
'prototipofreddo5Territori_files/BastioniGranSasso_retro.jpg');
3.4.2 Vincoli implementati tramite check
I vincoli esterni del DB andrebbero espressi tramite check ma, poiché con MySql 5 le check non sono
implementabili tali vincoli sono stati implementati tramite codice java.
Riscrivo comunque un esempio di check:
create assertion disjoint-carte check(
not exists( SELECT i.numIdI
FROM imprevisti i, probabilita p
where i.numIdI=p.numIdP));
create assertion complete-carte check(
not exists ( select numId from carte
exept
(select numIdI from imprevisti
union
select numIdP from probabilita))
);
3.4.3 Vincoli implementati tramite Trigger
DELIMITER !
drop procedure error;
CREATE PROCEDURE error()
BEGIN
DECLARE c1 integer (2);
DECLARE crs CURSOR FOR (SELECT codice FROM partita
WHERE '0' = '1');
OPEN crs;
FETCH crs INTO c1;
END !
drop procedure verifica_Imprevisti;
CREATE PROCEDURE verifica_Imprevisti (Id integer(2))
BEGIN
DECLARE c1 integer(2);
DECLARE crs CURSOR FOR (SELECT numIdI FROM Imprevisti
WHERE numIdI=Id);
DECLARE EXIT HANDLER FOR SQLSTATE ’02000’ BEGIN END;
OPEN crs;
FETCH crs INTO c1;
CALL error();
END !
drop trigger tgr_Imprevisti;
CREATE TRIGGER tgr_Imprevisti BEFORE INSERT ON Probabilita
FOR EACH ROW CALL verifica_imprevisti(NEW.numIdP)!
drop procedure verifica_Probabilità;
CREATE PROCEDURE verifica_Probabilita (Id integer(2))
BEGIN
DECLARE c1 integer(2);
DECLARE crs CURSOR FOR (SELECT numIdP FROM Probabilita
WHERE numIdP=Id);
DECLARE EXIT HANDLER FOR SQLSTATE ’02000’ BEGIN END;
OPEN crs;
FETCH crs INTO c1;
CALL error();
END !
drop trigger tgr_Probabilita;
CREATE TRIGGER tgr_Probabilita BEFORE INSERT ON Imprevisti
FOR EACH ROW CALL verifica_probabilita(NEW.numIdI)!
drop procedure verifica_Speciali;
CREATE PROCEDURE verifica_Speciali(n integer(2))
BEGIN
DECLARE c1 integer(2);
DECLARE crs CURSOR FOR (SELECT numCaselleS FROM Speciali
WHERE numCaselleS=n);
DECLARE EXIT HANDLER FOR SQLSTATE ’02000’ BEGIN END;
OPEN crs;
FETCH crs INTO c1;
CALL error();
END !
drop trigger tgr_Speciali;
CREATE TRIGGER tgr_Speciali BEFORE INSERT ON Territori
FOR EACH ROW CALL verifica_Speciali(NEW.numCasellaT)!
drop procedure verifica_Territori;
CREATE PROCEDURE verifica_Territori(n integer(2))
BEGIN
DECLARE c1 integer(2);
DECLARE crs CURSOR FOR (SELECT numCaselleT FROM Territori
WHERE numCaselleT=n);
DECLARE EXIT HANDLER FOR SQLSTATE ’02000’ BEGIN END;
OPEN crs;
FETCH crs INTO c1;
CALL error();
END !
drop trigger tgr_Territori;
CREATE TRIGGER tgr_Territori BEFORE INSERT ON Speciali
FOR EACH ROW CALL verifica_Territori(NEW.numCaselleS)!
drop procedure verifica_Vincitore;
CREATE PROCEDURE verifica_Vincitore(nickV character(30))
BEGIN
DECLARE c1 character(30);
DECLARE crs CURSOR FOR (SELECT nick FROM Utente
WHERE nick=nickV);
DECLARE EXIT HANDLER FOR SQLSTATE ’02000’ BEGIN END;
OPEN crs;
FETCH crs INTO c1;
CALL error();
END !
drop trigger tgr_Vincitore;
CREATE TRIGGER tgr_Vincitore BEFORE INSERT ON Vincitore
FOR EACH ROW CALL verifica_Vincitore(NEW.nickV)!
CREATE PROCEDURE Verifica_MAXGiocatori(cod character(30), data
character(30), ora character(30))
BEGIN
DECLARE c1 character(30);
DECLARE crs CURSOR FOR (select codiceP from partecipa
where 6 <= (SELECT Count(*) FROM Partecipa p, Utente u
WHERE p.codiceP=cod and p.dataP=data
and p.oraP=ora and p.nickP=u.nick));
DECLARE EXIT HANDLER FOR SQLSTATE ’02000’ BEGIN END;
OPEN crs;
FETCH crs INTO c1;
CALL error();
END !
CREATE TRIGGER tgr_MAXGiocatori BEFORE INSERT ON Partecipa
FOR EACH ROW CALL verifica_MAXGiocatori(NEW.codiceP, NEW.dataP, NEW.oraP)!
DELIMITER ;
3.4.4 Package diagram
src/
|------classi/
| |------Partita
| |
| |------utenti/
| | |------Utente
| |
| |------carta/
| | |------Imprevisti
| | |------Carta
| | |------Probabilita
| |
| |------contratto/
| | |------Contratto
| | |------ContrattoNonEdificabile
| | |------ContrattoTerritorio
| |
| |------casella/
| | |------Casella
| | |------NonEdificabile
| | |------Speciale
| | |------Territori
| |
|
|------servlert/
| |------ServAcq
| |------ServCancPartita
| |------ServCancRipresa
| |------ServCase
| |------ServFall
| |------ServHome
| |------ServIniz
| |------ServIpDis
| |------ServOut
| |------ServReg
| |------ServRipresa
| |------ServRit
| |------ServSa
| |------ServSave
| |------ServSpos
| |------ServTerr
| |------ServTrat1
| |------ServTrat2
| |------ServTrat3
| |------ServVictory
|
|------db
| |------Dao/
| | |------DaoHa
| | |------DaoPartecipa
| | |------DaoPartita
| | |------DaoPossiede
| | |------DaoSosta
| | |------DaoTurno
| | |------DaoUtente
| | |------DaoUtilizza
| | |------DaoVincitore
| |
| |------Dcs/
| | |------DcsHa
| | |------DcsPartecipa
| | |------DcsPartita
| | |------DcsPossiede
| | |------DcsSosta
| | |------DcsTurno
| | |------DcsUtente
| | |------DcsUtilizza
| | |------DcsVincitore
| | |------DcsCarte
| | |------DcsCaselle
| | |------DcsContratto
| | |------DcsEdificabile
| | |------DcsImprevisti
| | |------DcsCaseAlberghi
| | |------DcsProbabilita
| | |------DcsSpeciali
| | |------DcsTerritori
| | |------DcsUrl
| |
| |------ConnectionManager
|
|------Controller/
| |------ControllerCarte
| |------ControllerCaseAlberghi
| |------ControllerCaselle
| |------ControllerContratto
| |------ControllerEdificabile
| |------ControllerHa
| |------ControllerImprevisti
| |------ControllerPartecipa
| |------ControllerPartita
| |------ControllerPossiede
| |------ControllerProbabilita
| |------ControllerSosta
| |------ControllerSpeciali
| |------ControllerTerritori
| |------ControllerTurno
| |------ControllerUrl
| |------ControllerUtente
| |------ControllerUtilizza
| |------ControllerVincitore
|
|------Save
| |------Salvataggio
| |------Ripristino
|
|------utility
| |------Contesto
|
|
|
|
|
|
|
|------Game
|------GameUtil
|------Gruppo
|------PeGio
|------ServletUtil
|------Trattativa
|------Vincitore
4
Prototipazione
L’obiettivo della prototipazione è quello di fornire in tempi rapidi un documento a
scopo dimostrativo che presenti il prodotto. Il fine è quello di dare un’idea di
massima al cliente della struttura dell’applicazione e coinvolgerlo fin da subito nello
sviluppo, ma serve anche e soprattutto a chiarire le idee sui requisiti del sistema e
sulle conseguenti scelte progettuali.
Nel nostro caso viene fornito un prototipo freddo che implementa le funzionalità più
importanti del sistema per ciascun utente.
4.1 Prototipo freddo
Il prototipo freddo è realizzato in pagine HTML e JavaScript.
Il JavaScript è utilizzato per controllare il riempimento e la coerenza dei dati
inseriti nei campi form. I collegamenti tra le pagine sono realizzati attraverso
link statici inseriti come collegamento ipertestuale o come “action” della form;
non vi è dunque alcuna manipolazione sui dati inseriti ma tutto viene simulato
a scopo dimostrativo. A titolo di esempio, riportiamo una delle pagine del
prototipo:
4.2
Schema di navigazione del sito tramite ADM (Araneus Data Model)
Araneus Data Model è un formalismo logico utilizzato nella progettazione di siti web
per modellare pagine ipertestuali. Gli schemi ADM descrivono la struttura delle
pagine (page scheme) e come queste sono collegate tra di loro.
I tipi previsti da ADM sono:
In questo progetto ADM è stato utilizzato per documentare il prototipo freddo e
questi sono gli schemi relativi alle tre aree dell’applicazione:
4.3 Diagramma ADM
*
* Per migliore visualizzazione e chiarezza del diagramma, essendo Trattativa e
TrattativaBis nell’ADM sono state visualizzate come unica pagina web avendo
l’interfaccia molto simile.
5
Design model
Questa fase rappresenta il cuore della progettazione. È qui che vanno a definirsi tutte
le scelte progettuali che caratterizzeranno il sistema in ogni suo dettaglio. È
importante dunque lavorare bene su questa parte, cercando di mantenere una buona
coerenza nella modellazione, in modo da prepararsi al meglio per la stesura del
codice. Tuttavia, proprio per la difficoltà di queste attività (ed anche per la nostra
inesperienza), sarà necessario un intenso lavoro di raffinamento parallelo
all’implementazione.
5.1 Implementation model
L’Implementation model è un insieme di diagrammi UML che descrive come è
strutturato il software dell’applicazione anche rispetto alle risorse Hardware.
5.1.1 Component diagram
Il Component diagram si specializza sui componenti software e su come questi sono
relazionati tra loro.
5.1.2 Deployment diagram
Il Deployment diagram viene utilizzato per modellare il sistema in termini di risorse
hardware in cui ciascuna di queste è rappresentata da un nodo. È utile, come è stato
fatto in questo caso, unire il Deployment diagram al Component diagram per avere
un quadro completo di come i componenti software sono distribuiti rispetto ai nodi.
Come si può vedere, la struttura è quella classica di una web application basata su
database relazionale.
5.2
Domain model
Il Domain model è un raffinamento del diagramma delle classi visto in fase di analisi
al quale vanno aggiunte le strutture di controllo, di accesso ai dati e di presentazione
dei contenuti.
Le classi sono organizzate secondo i pattern MVC e DAC.
Nell’utilizzo del pattern MVC (Model View Controller) con approccio orientato al
DB DAC (Data Access Classes) distinguiamo la presenza di 2 tipologie di classi:
DAO e DCS.
DAO: (Data Access Object) implementano la logica di interfaccia al DB contenendo
solo quei metodi che rispondono alla denominazione CRUD (Create Read Update
Delete).
DCS: (Data Control Service) implementano la logica di interfacciamento al DB
comprendendo tutti gli altri possibili metodi al di fuori della denominazione CRUD
Per ogni classe sono indicati tutti i metodi e le interdipendenze con le altre classi.
Questa è la visione d’insieme del domain model:
Per maggiore chiarezza il diagramma è stato diviso per sezioni:
5.3
Sequence diagram di dettaglio
I Sequence diagram modellano una sequenza di azioni attraverso le quali due o più
entità si scambiano informazioni sottoforma di messaggi. Queste azioni rientrano
nell’ambito di uno scenario di utilizzo dell’applicazione per questo tutte le azioni
iniziano e finiscono da un’attore e coinvolgono successivamente servlet, classi di
controllo, classi di dominio, classi DAO, DCS e JSP.
Per ottenere questi diagrammi, si parte dal riferimento dei Sequence diagram ricavati
dal main success scenario degli Use case; quindi, dopo un intenso lavoro di
raffinamento, si vanno a definire le entità da coinvolgere e le modalità di interazione.
Da quest’ultimo punto si procede prima decidendo la struttura delle informazioni da
scambiare, e questo viene fatto basandosi molto sul prototipo; poi sul come vengono
scambiati i messaggi, ovvero il nome ed i parametri del metodo che viene invocato,
ed il conseguente valore di ritorno.
Lo sequenza descritta nel diagramma fa riferimento ad uno scenario principale quindi
non compaiono scelte dell’utente; tuttavia, in alcuni casi, sono stati considerati anche
scenari alternativi.
Con tutte le informazioni sulle entità in gioco, le interazioni tra queste ed i metodi
utilizzati, che di volta in volta compaiono nei diagrammi, viene dinamicamente
aggiornato il domain model.
Questi sono alcuni dei sequence diagram: