Object Oriented
con UML
Esercizi
Esercizio 0
InserimentoOfferta
Azienda
ValutazioneOfferta
RifiutoOfferta AccettazioneOferta
Responsabile
Accordo
EsaminaOfferta
Studente
Approvazione StampaDoc
Esercizio 1: Impresa edile
UfficioPersonale
GestioneFerie
GestioneMalattie
Operaio Responsabile
AcquisizioneMezzi
GestioneRiparazioni
AssegnamentoRisorse
GestioneCommesse
AssegnamentoMezzi
AperturaCantiere
Cliente
GestionePagamenti
Banca
Impresa Edile: Class Diagram
Impresa
Operaio Mezzo
Nome Operat ivo : bool
Qualifica Nome : string
DataAssunzione Descrizione : string
Cantiere
Dat aA pertura Cliente
Luogo Nome
Responsabile
Lavoro
Descrizione
Durata
Costo
Pagamento
Esercizio 2:
Compagnia di Assicurazioni
Descriviamo una compagnia di assicurazione
Siamo interessati a descrivere il dominio del
problema, con particolare riferimento agli aspetti di
modellazione statica.
Produciamo un diagramma delle classi
La compagnia di assicurazioni
1..n
Contratto
Compagnia Numero : int
DataStipula : date
ImportoAssicurato
1
0..n
1
Polizza
Testo : string
1..n
1 1..n
Agenzia Contratto
Numero : int 1..n Numero : int
Indirizzo : string DataStipula : date
ImportoAssicurato
1..n
0..n
1
1
1 1..n Polizza
Compagnia
Testo : string
1 Paziente
Ospedale Nome : string
CodiceFiscale : string
1 DataNascita : date 1
ProntoSoccorso 1
1 1..n
1..n 1..n Ricovero
Turno Reparto 1..n 0..n Ingresso : date
1..n Data : date Uscita : date
PersonaleAmministrativo
0..n
Nome : string 1
Anzianità : int Periodo
1..n 1
Da : date
PersonaleMedico A : date CartellaClinica
Nome : string RepartoConStaff
Qualifica : string 1
1..n 1 1
StoriaRicovero
1..n
Personale
0..n 0..n
1..n 0..n
Partecipante 1..n
1 0..n
Aula Risorsa
Nome : string Nome : string
Capienza : int
Studente Uditore
VideoBeam : bool
Esercizio 5: Palestra
Numero : Integer
Frequenza : String
Scheda Esercizio
NumVisiteSettimanali : Integer Descrizione : String
0..n 1..n Palestra
Pagamento
MesePagato : Date
0..1 ImportoPagato : Integer 0..13
Esercizio 6:
Bookmaker
Un Bookmaker vuole ralizzare una applicazione per
la gestione di una lista di scommettitori sulle corse
dei cavalli.
Una corsa è caratterizzata da un certo numero di
corridori e da un vincitore, che deve essere un
corridore partecipante alla corsa
Un corridore è un cavallo guidato da un fantino
Ciascuno scommettitore può effettuare un numero
qualsiasi di scommesse
Ciascuna scommessa è riferita ad una singola corsa,
ad un particolare corridore presente nella corsa ed
è caratterizzata da un importo e da una quotazione
Bookmaker (2)
Bookmaker
Fantino
peso : f loat
Bookmaker(nome : String, cognome : String)
altezza : f loat
aggiungiScommettitore(s : Scommettitore) : v oid
n_v ittorie : int
accettaScommessa(sc : Scommettitore, s : Scommess...
totaleVincite() : int
Fantino(nome : String, cognome : String, p : f loat, a : f loat, n : int)
totalePerdite() : int
equals(f : Object) : boolean
main(args : String[]) : v oid
f antino
Scommettitore
corsa
Co rsa
: Buca per : Uff ici o p osta le Ufficio destinazione : casell a postale destinata rio :
mi tte nte : Person a portalettere : porta let tere2 : : Persona
lettere Ufficio postale Buca per lettere
Persona Persona
Imbuca lettera
Ritiro posta
Consegna posta
Smistamento posta
InserisciTessera(Tessera)
LeggiDati
tesseraLeggibile()
VerificaAbilitazione(Codice Tessera)
ok
Lista Operazioni
Richiesta PIN
PIN
VerificaDisponibilità(Importo)
ok
ok
Importo
ImportoPrelevato
AggiornaSaldoCC
RiduciDisponibilitàResidua(Importo)
ok
Collaboration diagram
equivalente
4: tesseraLeggibile()
1: InserisciTessera(Tessera)
8: Prelievo(Importo) 5: [tesseraLeggibile() = True] VerificaAbilitazione(Codice Tessera)
10: PIN 11: EseguiOperazione(Prelievo, Importo, CodiceTessera, PIN)
16: ImportoPrelevato 17: ImportoPrelevato
: Banca
7: Lista Operazioni 6: ok
: Cliente 9: Richiesta PIN s : Sportello 14: ok
15: Importo
12: VerificaDisponibilità(Importo)
18: AggiornaSaldoCC
19: RiduciDisponibilitàResidua
3: Dati Tessera: (Importo)
13: ok
Banca, CodiceTessera 2: LeggiDati 20: ok
MioCC :
ContoCorrente
t : Tessera
Esercizio 9:
Orologio digitale
Descrivere con un diagramma a stati il comportamento di
un orologio digitale dotato di display per la
visualizzazione e di due bottoni per l’impostazione
dell’orario.
Il primo bottone definisce la modalità di visualizzazione (normale,
impostazione ora, impostazione minuti), mentre il secondo viene
utilizzato in modalità impostazione per incrementare l’ora o i
minuti correnti.
Dalla modalità di visualizzazione normale (nella quale
viene visualizzato l’orario corrente)
premendo una prima volta il bottone che seleziona la modalità di
visualizzazione si passa alla modalità di impostazione dell’ora
premendo una seconda volta si passa all’ impostazione dei minuti
premendolo una terza volta si torna alla modalità di
visualizzazione normale.
Orologio digitale:
class diagram
Display
1 Visualizza(Ore : int, Min : int)
1
Orologio 1 +ModeButton
Ore : int 1
Minuti : int
Button
Ticks : int
ButtonId : int
+ Click(ButtonId : int)
+ Tick() 1 1
- IncrementaOre()
- IncrementaMinuti() +InputButton
- Aggiorna()
1
Timer
Orologio digitale
classe orologio: state diagram
InFunzione
Normale
Click(1)
Click(1) Tick / Aggiorna
InFunzione
Normale
Click(1)
Click(2) Click(1)
[Ore=23] ImpostaOre ImpostaMinuti
Ore = 0
Vincoli (segue):
In ogni piano, ad eccezione del primo e dell’ultimo,
esistono due bottoni per chiamare l’ascensore
specificando se si vuole salire o scendere. I bottoni si
illuminano quando vengono premuti. L’illuminazione
si spegne quando l’ascensore arriva al piano
muovendosi nella direzione corrispondente al bottone
illuminato
Identificazione dei requisiti: use
case
Passeggero
Diagramma delle classi iniziale
1
comunica
n
Bottone
Ascensore
direzione : Boolean Porta
piano_corrente : Integer
Controllore Ascensore closed : Boolean
idle : Boolean controlla controlla
open()
move() 1
close()
stop()
status() comunica
n
Bot tone
Bot tone_Piano
Bottone_Ascensore num_piano : Integer
direzione : Boolean
Sequence diagram:
Selezione diretta piano
premi bottone
selezione piano
status( )
illumina
move(direzione)
: Passeggero
4. illumina
9. [raggiunto piano finale] disattiva illuminazione
3. status( )
7. piano raggiunto(piano_corrente) 6. move(direzione)
8. [raggiunto piano finale] stop()
:
Ascensore
Sequence diagram:
chiamata ascensore
premi bottone
richiesta fermata(piano, direzione)
illumina
[ascensore libero] move(piano)
piano raggiunto
status( )
elimina illuminazione
apri porta
Collaboration diagram:
chiamata ascensore
: Passeggero
1. premi bottone
:
Ascensore
Porta: diagramma degli stati
close()
Aperta Chiusa
open()
Ascensore:
esempio di diagramma degli stati
move( nuovo_piano )[
nuovo_piano>piano_corrente a... al piano
Salita
Discesa
1: newMessage(MailMessage)
2: Aggiungi messaggio a outbox del mittente
3:
4:
Invio posta:
Scenario base
a
2: Preleva messaggio
3:
5:
b
6:
1: newAccount(userName)
2: crea account
new
3: crea inbox
new
4: crea outbox
new
5: crea draft
new
6: result
Rimozione account:
Scenario base
: MailSystem UserAccount : AccountInbox : AccountOutbox AccountDraft :
: Administrator
Account MailBox : MailBox MailBox
1: removeAccount(userName)
2: destroy inbox
3: destroy outbox
X
X
4: destroy draft
5: rimuovi account
X
6: X
Diagramma delle classi
MailSystem
0..* 0..*
#outbox Account
MailBox
MailMessage 1 userName : String
1
mitt : Account #inbox
dest : Account
text : Testo 0..* 1 1
#draft
1 1
1
+theAccount
Diagramma delle classi
(Alternativo)
MailSystem
Account
userName
newMessage(message : MailMessage) : boolean
0..*
sendMail(message : MailMessage) : void
1 1
1
MailMessage 1 1 1
0..*
mitt : Account 0..*
MailBox Inbox Draft OutBox
dest : Account
text : Testo