1 / 12
© Renato Conte
Università di Padova
Facoltà di Scienze MM.FF.NN Informatica - anno 2009-10 Corso di Ingegneria del Software
Soluzione esercizi compito appello 14 luglio 2010
2 / 12
© Renato Conte
Tradurre in codice C++ e SQL
(esempio “CREATE TABLE” in mySQL) il diagramma UML delle classi
disegnato a fianco.
Nel diagramma mancano le chiavi primarie idA ed idB, delle rispettive classi A e B, che sono da includere solo nel caso di oggetti persistenti su base di dati,
e quindi - nello specifico - solo per tabelle SQL.
La creazione di tali tabelle dovrà soddisfare i vincoli di integrità referenziale che potrebbero risultare necessari per rispettare i vincoli derivanti dallo schema UML ( es. “ON UPDATE RESTRICT” ).
Esercizio 1
A +a1: int +a2: int
B +b1: int
+b2: int *
r
s
3 / 12
© Renato Conte
Soluzione esercizio 1
In questo caso ci possono essere alcune soluzioni equivalenti,
dipende dall'abilità a tradurre i vincoli di uno schema delle classi UML in vincoli SQL, mentre la traduzione in definizioni in linguaggio C++ lascia poche alternative
4 / 12
© Renato Conte
Definizione della struttura in C++
class A { public:
int a1;
int a2;
B * * r;
};
class B { public:
int b1;
int b2;
A s;
};
Soluzione Esercizio 1
A +a1: int +a2: int
B +b1: int
+b2: int *
r
s
Soluzione alternativa
class A { public:
int a1;
int a2;
std::vector<B*> r;
};
5 / 12
© Renato Conte
CREATE TABLE A
( idA INTEGER NOT NULL, PRIMARY KEY(idA), a1 INTEGER, a2 INTEGER, s INTEGER,
FOREIGN KEY(s) REFERENCES B(idB) ON DELETE CASCADE
ON UPDATE CASCADE );
CREATE TABLE B
( idB INTEGER NOT NULL, PRIMARY KEY(idB), b1 INTEGER, b2 INTEGER, r INTEGER,
FOREIGN KEY(r) REFERENCES A(idA) ON DELETE SET NULL
ON UPDATE SET NULL );
Continua soluzione 1: parte SQL -
A +a1: int +a2: int
B +b1: int
+b2: int *
r
s
6 / 12
© Renato Conte
Un televisore può utilizzare le seguenti tipologie di ingressi:
(a) il segnale analogico proveniente dall'antenna tradizionale;
(b) il segnale digitale terrestre; c) l'ingresso ausiliario per il lettore DVD;
(d) l'ingresso da altro dispositivo esterno, p.es.,un computer.
Quando l'ingresso selezionato è di tipo (a) o (b) il televisore offre la possibilità di selezionare canali identificati nell'intervallo 1..10. Tramite telecomando possiamo fare tutte le selezioni (a)-(d) sopra indicate, accendere/spegnere l'apparecchio, e regolare il volume (0..9). I vari comandi si possono anche dare simultaneamente, ovviamente non quando il televisore è spento. Poiché il televisore in questione non ha memoria permanente, all'accensione esso si troverà sempre col volume a zero, con ingresso (a) e la relativa impostazione sul canale 1.
Data questa specifica, si rappresentino i possibili stati del televisore mediante un diagramma UML di stato (corrispondente alla macchina a stati del sistema descritto).
Esercizio 2
7 / 12
© Renato Conte
Soluzione esercizio 2
In questo caso ci possono essere molte soluzioni equivalenti.
Presento una soluzione semplice che soddisfa i requisiti essenziali richiesti dal testo del problema.
Faccio uso di concetti esposti alla lezione sui diagrammi "macchine a stati" (state machine diagram), in particolare alle slide 7 e 8
tratte dal documento 01-03-03.ppt “UML Tutorial Series”
dal sito: www.omg.org
Si suppone di avere un telecomando che possiede i seguenti tasti, che provocano cambiamenti di stato o di variabili, alla macchina a stati:
Ingressi:
in+ : passa all'ingresso successivo in- : passa all'ingresso precedente
a,b,c,d : passa all'ingresso rispettivamente a,b,c,d
Cambio canale: C(n) sta per un tasto compreso tra C1 e C10
Cambio volume: <vol / vol> : cambia la variabile vol diminuendola fino ad un minimo di 0 / aumentandola fino ad un massimo di 10
ON / OFF : accende / spegne il televisore
8 / 12
© Renato Conte
Televisore Acceso
entry / vol:= 0; chan:= 1;
Televisore Spento
ON OFF
(a)
(d) (c)
(b) a, in-
b, in+
d, in+
c, in-
c, in +
b, in - d,
in -
a c
b d a,
in +
C(n) / CambioCanale(n)
Ingressi:
(a) analogico (b) digitale terrestre (c) DVD
(d) dispositivo esterno in+ / in- significa passare al tipo di ingresso succ/prec C(n) provoca l'azione CambioCanale che modifica la variabile chan;
n può essere un valore compreso tra 1 e 10
C(n) / CambioCanale(n)
vol>, <vol
vol> / vol:= (vol+1) fino ad un massimo di 10
<vol / vol:= (vol-1) fino ad un minimo di 0 vol>, <vol
vol>, <vol
vol>, <vol
9 / 12
© Renato Conte
La gestione di un cinema multisala prevede che i clienti possano, tramite un sistema basato su WEB, prenotare un posto in una sala dove si proietta un determinato film ad un certo orario di un dato giorno.
Specificare, mediante diagramma UML delle classi, le entità di livello model necessarie per la realizzazione di un tale sistema.
Disegnare poi un diagramma di sequenza che illustri le fasi salienti di una ricerca con prenotazione, e dell'invio di un promemoria a conferma del successo dell'operazione.
Attenzione: ai fini dell'esercizio basterà considerare le funzioni di ricerca del film e la prenotazione posto, escludendo altre funzionalità quali, p.es., la gestione dei pagamenti e l'interfaccia grafica.
Esercizio 3
10 / 12
© Renato Conte
Bozza soluzione esercizio 3
Esistono molti modi per risolvere il problema: un modo sarebbe di fare il progetto concettuale con gli insiemi entità Sala, Film e l'associazione Proiezione (vedi anche figura pagina 11), tradurre col modello relazionale e ipotizzare un paio di
interrogazioni SQL con Join tra le tre tabelle. L'approccio ad oggetti può apparentemente complicare le cose. Propongo due soluzioni simili.
La classe Cinema potrebbe non essere obbligatoria, è utile come Façade e per gestire eventuali altri cinema
Vincoli molteplicità: un solo film in una determinata sala, ad una certa data/ora
risposta contiene una lista di risposte, anche vuota. Elaborata da Cinema in base alla join delle risposte di disponibilità tra Sale, Fiml e Ora-giorno risposta(x) e' la scelta fatta per la prenotazione
11 / 12
© Renato Conte Film titolo regista + ricercaFilm() 1..*
Cinema {Façade}
+ ricercaFilm() + prenotazione()
*
Sala
+ numSalaPosti(film) + prenotaPosto() - posto: boolean[*]
Proiezione - ora - giorno + dataOra(film)
:Cinema :Film :Proiezione :Sala
ricercaFilm(titolo) ricercaFilm(titolo)
f
dataOra(f) numSalaPosti(f) risposta
prenotazione(risposta(x))
prenotaPosto(risposta(x))
ricevuta
*
gestisce
* *
12 / 12
© Renato Conte Film
titolo regista + ricercaFilm()
1..* *
Cinema {Façade}
+ ricercaFilm() + prenotazione()
proiezione
*
Sala
+ numSalaPosti(film) + prenotaPosto() - posto: boolean[*]
Calendario - ora - giorno
+ dataOra(film)
:Cinema :Film :Calendario :Sala
ricercaFilm(titolo)
ricercaFilm(titolo)
f
dataOra(f) numSalaPosti(f) risposta
prenotazione(risposta(x))
prenotaPosto(risposta(x))
ricevuta
* gestisce *