Cinema Miami A.Pasquini 15 Novembre 2010 1 Problema La MIAMI e un azienda che opera nel settore dei servizi integrati di biglietteria per Multisala cinematografiche. Il servizio da sviluppare riguarda la gestione delle prenotazioni per la visione di film nei multisala. Ogni film e caratterizzato dal titolo del film, dal nome del regista e dal nome degli attori che vi partecipano. Per un film si prevedono un certo numero di proiezioni (almeno una), di cui interessa la data, l ora di proiezione, la sala e la tipologia (2D o 3D). Dei posti della sala interessa sapere la posizione (fila e numero). Alcuni posti sono riservati per i disabili. Il prezzo del biglietto e stabilito in base al film e alla tipologia di proiezione (ad esempio, per il film "Alice in Wonderland", il costo del biglietto per la proiezione 3D e 12 euro). I posti possono essere prenotati. Di una prenotazione interessa il nome e cognome del cliente che l ha effettuata, la data in cui e stata effettuata, la proiezione del film a cui la prenotazione si riferisce, ed i posti (almeno uno) che sono stati prenotati. Inoltre, se sono stati prenotati posti per disabili, interessa conoscere il tipo di disabilita di colui per cui e stato prenotato il posto. Si noti che data una prenotazione e di interesse conoscere i posti per disabili eventualmente prenotati (indicando le disabilita per i vari posti prenotati). L utente e interessato ad effettuare alcuni controlli. In particolare: dato un film ed una tipologia di proiezione, restituire il prezzo del biglietto dato un insieme di posti ed una proiezione, restituire i posti che sono ancora disponibili per la proiezione data (cioe i posti che non risultano ancora prenotati per la proiezione). dato un film restituire il numero di proiezioni previste; 1
2 Use Case 3 Class Diagram Nella classe Proiezione abbiamo un attributo Tipologia di tipo booleano, ciò sta a significare che se messo a false, il film è in 2D, altrimenti è in 3D. 2
4 Vincoli OCL 4.1 Questo vincolo afferma che il numero degli attori e il numero di proiezioni di un film devono essere maggiori di 0. Context Film: init: proiezione.size() = 0 inv: titolo <> null inv: regista <> null inv: attori.size()> 0 inv: forall (attori <> null) 4.2 Questo metodo ritorna il numero di istanze di tipo proiezione create dalla classe film Context Film::Proiezioni():Integer post: return = proiezione.size() 4.3 Questo metodo verifica che il valore ritornato dal metodo stesso sia uguale al numero delle associazioni alle proiezioni in 2D Context Film::Proiezioni2D():Integer post: return = proiezione->select(not tipologia).size() 4.4 Questo metodo verifica che il valore ritornato dal metodo stesso sia uguale al numero delle associazioni alle proiezioni in 3D Context Film::Proiezioni3D():Integer post: return = proiezione->select(tipologia).size() 4.5 Questo metodo verifica che il valore ritornato sia uguale al numero delle associazioni alle proiezioni moltiplicate per il costo del biglietto in funzione della tipologia Context Film::Incasso():Integer post:let j:integer= (proiezione->select(not tipologia)->prenotazione->posto.size()) let k:integer=(proiezione->select(tipologia)->prenotazione->posto.size()) return = ((j*10)+(k*12)) 3
4.6 Questo metodo verifica che il valore ritornato sia uguale al numero delle associazioni alle proiezioni moltiplicate per il costo del biglietto 2D Context Film::Incasso2D():Integer post:return = (proiezione->select(not tipologia)->prenotazione->posto.size())*10 4.7 Questo metodo verifica che il valore ritornato sia uguale al numero delle associazioni alle proiezioni moltiplicate per il costo del biglietto 3D Context Film::Incasso3D():Integer post:return = (proiezione->select(tipologia)->prenotazione->posto.size())*12 4.8 Questo metodo ritorna il prezzo del biglietto, controlla se il film è in 3D, nel caso lo fosse il prezzo è di 12, altrimenti sarà di 10 Context Proiezione::Prezzo():Integer post: if (tipologia) then return = 12 else return = 10 4.9 Questo vincolo afferma che una proiezione deve avere almeno 10 posti. Context Proiezione: inv: sala.size() > 0 inv: film.size() = 1 4.10 Questo metodo ritorna la grandezza dell insieme dei posti che non sono stati prenotati. Context Proiezione:: PostiDisponibili():Integer post: return=((sala->posto.size())-(prenotazione->posto.size())) 4.11 Questo metodo ritorna il numero di posti per abili ancora disponibili. Context Proiezione:: PostiAbili():Integer post: return=((sala->posto->select(not disabile).size())- 4
(prenotazione->posto->select(not disabile).size())) 4.12 Questo metodo ritorna il numero di posti per disabili ancora disponibili. Context Proiezione:: PostiDisabili():Integer post: return=((sala->posto->select(disabile).size())- (prenotazione->posto->select(disabile).size())) 4.13 Questi vincoli affermano la consistenza della classe sala Context Sala: init: prenotazione.size()=0 inv: capienza >= 10 && capienza <= 100 inv: posto.size >= 10 && posto.size <= 100 derive: capienza = posto.size() 4.14 Questo metodo permette di inserire altri posti in sala Context Sala: AggiungiPosti(n:Integer) pre: posto->prenotazione.size=0 inv: posto.size() + n <= 100 post: capienza = capienza@pre + n post: posto.size() = posto.size()@pre + n 4.15 Questo metodo permette di eliminare posti in sala Context Sala: EliminaPosti(n:Integer) pre: posto->prenotazione.size=0 inv: posto.size() - n >= 1 post: capienza = capienza@pre - n post: posto.size() = posto.size()@pre - n 4.16 Questa serie di vincoli rendono consistente la classe posto Context Posto: init: prenotazione.size()=0 inv: sala.size()=1 post:((prenotazione.size()=0) (prenotazione.size()=1)) 5
4.17 Questo vincolo permette di creare una prenotazione se ci sono abbastanza posti per una specifica proiezione. Context Prenotazione: pre: let k:integer= ((proiezione->sala->posto->select(not disabile).size())) - ((proiezione->sala->posto->select(not disabile)->prenotazione.size())) k >= abili pre: let j:integer= ((proiezione->sala->posto->select(disabile).size())) - ((proiezione->sala->posto->select(disabile)->prenotazione.size())) j >= disabili inv: proiezione.size() = 1 inv: nome <> null inv: cognome <> null inv: data <= proiezione.data inv: Abili + Disabili >= 1 derive: Tipo_Disabilità.size()= Disabili post: forall(tipo_disabilità[]<> null) post: (abili+disabili)=posto.size() post: posto->select(not disabile).size() = posto->select(not disabile).size()@pre + abili post: posto->select(disabile).size() = posto->select(disabile).size()@pre + disabili post: let k:integer= ((proiezione->sala->posto->select(not disabile).size())) - ((proiezione->sala->posto->select(not disabile)->prenotazione.size())) k=k@pre - abili post: let j:integer= ((proiezione->sala->posto->select(disabile).size())) - ((proiezione->sala->posto->select(disabile)->prenotazione.size())) j=j@pre - disabili 4.18 Questo metodo permette di aggiungere uno o più posti per persone abili, su una prenotazione che è già stata fatta. Context Prenotazioni:: Aggiungi_posti_abili(n:int) 6
pre: let k:integer= ((proiezione->sala->posto->select(not disabile).size())) - ((proiezione->sala->posto->select(not disabile)->prenotazione.size())) k >= n inv: n > 0 post: let k:integer= ((proiezione->sala->posto->select(not disabile).size())) - ((proiezione->sala->posto->select(not disabile)->prenotazione.size())) k=k@pre - n post: posto->select(not disabile).size() = posto->select(not disabile).size()@pre + n post: abili=abili@pre + n 4.19 Questo metodo permette di aggiungere uno o più posti per persone abili, su una prenotazione che è già stata fatta. Context Prenotazioni:: Aggiungi_posti_disabili(n:int) pre: let k:integer= ((proiezione->sala->posto->select(disabile).size())) - ((proiezione->sala->posto->select(disabile)->prenotazione.size())) k >= n inv: n > 0 post: let k:integer= ((proiezione->sala->posto->select(disabile).size())) - ((proiezione->sala->posto->select(disabile)->prenotazione.size())) k=k@pre - n post: posto->select(disabile).size() = posto->select(disabile).size()@pre + n post: disabili=disabili@pre + n 4.20 Questo metodo permette di eliminare uno o più posti per persone abili, su una prenotazione che è già stata fatta. Context Prenotazioni:: Elimina_posti_abili(n:int) 7
pre: abili >= n pre: abili+disabili > n inv: n > 0 post: let k:integer= ((proiezione->sala->posto->select(not disabile).size())) - ((proiezione->sala->posto->select(not disabile)->prenotazione.size())) k=k@pre + n post: abili= abili@pre - n 4.21 Questo metodo permette di eliminare uno o più posti per persone disabili, su una prenotazione che è già stata fatta. Context Prenotazioni:: Elimina_posti_abili(n:int) pre: disabili >= n pre: abili+disabili > n inv: n > 0 post: let k:integer= ((proiezione->sala->posto->select(disabile).size())) - ((proiezione->sala->posto->select(disabile)->prenotazione.size())) k=k@pre + n post: disabili= disabili@pre - n 5 Sequence Diagram 5.1 Proiezioni 8
Permette ad un utente di effettuare una ricerca sulle proiezioni di un film. La classe film prima di ritornare il valore richiama i metodi Proiezione2D() e Proiezione3D() e li somma. 5.2 Aggiungi posti abili Permette al cliente di modificare una prenotazione precedente con l aggiunta di posti per persone abili, se e solamente se ci sono altri posti disponibili. 5.3 Aggiungi posti disabili Permette al cliente di modificare una prenotazione precedente con l aggiunta di posti per persone disabili, se e solamente se ci sono altri posti disponibili. 9
5.4 Aggiungi posti Permette all amministratore di aggiungere dei posti ( n ) in sala, se e solo se il numero dei posti sommati a quelli esistenti non superano 100, altrimenti verrà restituito un errore. 5.5 Elimina posti Permette all amministratore di eliminare dei posti ( n ) in sala, se e solo se il numero dei posti da eliminare sono inferiori a quelli già esistenti, altrimenti verrà restituito un errore. 10
5.6 Incasso Permette all amministratore di sapere quanto un film ha incassato. Il film prima di restituire l incasso richiamerà i suoi metodi incasso2d() e incasso3d() per poi sommarli. 5.7 Prenotazione Permette al cliente di effettuare una prenotazione, se certi vincoli sono rispettati la prenotazione viene creata, altrimenti riceviamo un errore. 11