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: