Specifica della classe Cliente
Ogni istanza di questa classe rappresenta un cliente.
Operazioni di classe:
eta(d:Data): Intero >= 0
pre:
d >= this.nascita
post:
L'operazione non effettua side-effect sui dati.
result = (d - this.nascita) espressa in anni approssimata per difetto
Specifica della classe Crociera
Un’istanza di questa classe rappresenta una crociera.
Operazioni di classe
fine(): Data
- precondizioni: nessuna
- postcondizioni:
- non modifica il livello estensionale.
- sia i il valore dell'attributo 'inizio' di 'this'.
- sia it: Itinerario tale che esista il link
(this, it): croc_itin
- sia d il risultato di it.durata_g()
- result è i + d
posti_liberi(t: DataOra): Intero >= 0 precondizioni: t ⇐ adesso e t ⇐ this.inizio e deve esistere il link di associazione croc_nave che coinvolge ‘this’
post_condizioni:
- Questa operazione non fa side-effect sui dati
- il risultato 'result' è definito come segue:
- sia n: Nave tale che (this, n) è un link croc_nave
- sia c il valore dell'attributo capienza di n
- sia P l'insieme dei p: Prenotazione tali che
(this, p) è un link pren_croc e p.istante <= t
- N = SUM p.posti
p in P
- result = c - N
tocca(d: Destinazione, inizio: Data, fine: Data): Booleano
precondizioni:
inizio ⇐ fine
e
se i periodi (this.inizio, this.fine()) e (inizio, fine) non sono disgiunti
postcondizioni:
- sia i: itinerario l’oggetto coinvolto nell’unico link croc_uitin
con this [(i, this,): croc_itin]
- se d non è in i.destinazione(), result è FALSE
- altrimenti:
- sia i
il valore dell’attributo inizio fi this
- se esiste i link (i, d):
- partenza iniziale, se inizio <= i <= fine
, result è TRUE
.
- altrimenti, se esiste i link (i,d): arrivo_finale, result è TRUE se inizio ⇐ this.fine() ⇐ fine
- altrimenti, se esiste ti: TappaIntermedia
tale che (i, ti): intin_tappa
e (ti, d): tappa_dest
e (this.inizio + ti.arrivo.giorni, this.inizio + ti.ripartenza.giorni)
si sovrappone a (inizio, fine)
, allora result è TRUE
altrimenti è FALSE
====== Vincoli esterni
[V.Crociera.Prenotazione.no_overbooking] Per ogni c: Crociera tale che esiste un link croc_nave che coinvolge c per ogni t: DataOra tale che t ⇐ c.inizio
deve essere vero che c.posti_liberi(t) >= 0
Specifica della classe Destinazione
Un’istanza di questa classe rappresenta una destinazione, ossia un luogo toccato da itinerari di crociera.
Specifica delle operazioni di classe
esotica(): Booleano precondizioni: nessuna postcondizioni: - nessuna modifica al livello estensionale. - il valore di ritorno ‘result’ è così definito: - Sia c:Continente tale che (this,c):dest_cont. result = true se e solo se c.esotico = True
Specifica della classe Itinerario
Un’istanza di questa classe rappresenta un itinerario, cioè una sequenza ordinata di destinazioni, che può essere seguito dalle crociere.
Specifica delle operazioni di classe
durata_g(): Intero >= 0 precondizioni: nessuna postcondizioni: - non modifica il livello estensionale. - il valore di ritorno result è così definito: - sia (this, d):arrivo_finale l’unico link arrivo_finale che coinvolge ‘this’. - result è (this, d).ora.giorno
destinazioni(): Destinazione [1..*] precondizioni: nessuna
postcondizioni:
sia di: Destinazione l'oggetto tale che esiste il link
(this, di): partenza_iniziale
sia df: Destinazione l'oggetto tale che esiste il link
(this, df): arrivo_finale
sia Dt l'insieme degli oggetti d: Destinazione tale che
esista t:TappaIntermedia e (d, t):tappa_dest
e (t, this):itin_tappa
sia 'result' Dt Unione {di} Unione {df}
esotico(): Booleano precondizioni: nessuna postcondizioni: sia D = this.destinazioni() result è TRUE se e solo se esiste almeno un elemento d in D tale che d.esotica() = TRUE
Specifica dei tipi di dato
DeltaDataOra tipo record con i seguenti campi: - giorno: Intero > 0 - ora: Ora
Specifica delle operazioni dello Use-Case GestioneCompletaPrenotazioni
Operazioni
prenota(cl: Cliente, n_posti: Intero > 0, cr: Crociera): Prenotazione
precondizioni:
adesso < cr.inizio
e
esiste il link dell'associazione croc_nave che coinvolge cr
e
cr.posti_liberi(adesso) >= n_posti
postcondizioni:
- il livello estensionale è modificato come segue:
- viene creato l'oggetto p: Prenotazione con
p.istante = adesso e p.posti = n_posti
- viene creato il link (p, cr): pren_croc
- viene creato il link (p, cl): pren_cliente
- il risultato 'result' è p
Specifica dello use-case Statistiche
Operazioni
// Dato un periodo ‘p’, calcolare l’età media dei clienti che hanno prenotato, durante ‘p’, almeno una crociera che prevede una destinazione esotica (v. req. 3.5)
media_esotiche(inizio: Data, fine: Data): Reale >= 0 precondizioni: inizio ⇐ fine e esiste almeno un c: Crociera tale che - sia i: Itinerario tale che (cr, i): croc_itin - i.esotico() è TRUE e esiste un cl:Cliente e p: Prenotazione tale che (cl, p):pren_cliente e (p, cr):pren_croc e p.istante è tra inizio e fine
postcondizioni:
- sia C l'insieme dei cl:Cliente tale
esiste cr:Crociera e p: Prenotazione e i:Itinerario
tali che
(cl, p):pren_cliente e
(p, cr):pren_croc e
(cr, i):croc_itin e
e i.esotico()=TRUE
e inizio <= p.istante <= fine
- result è ( SUM c.eta(oggi) ) / |C| c in C
destinazioni_gettonate( inizio: Data, fine: Data): Reale 0..1
-
precondizioni: inizio ⇐ fine e // deve esistere almeno una destinazione toccata da almeno una crociera nel periodo in input esiste
d: Destinazione
ec: Crociera
tale chec.tocca(d, inizio, fine)
-
postcondizioni:
{
(d, ncl, ncf) | D: Destinazione and ncl = |{c | c:LunaDiMiele and c.tocca(d, inizio, fine)}| andnfc = | {c | c:PerFamiglie and c.tocca(d, inizio, fine)} |
}
- esiste
d