Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Object Oriented
con UML
Esercizi
Esercizio 0
Modelliamo il sistema di gestione dei tirocini di una
universit
Siamo interessati a rappresentare i requisi utente,
quindi usiamo gli use case diagrams.
Gestione tirocini
Le aziende interessate producono delle offerte di
tirocinio.
Il responsabile dei tirocini approva o rifiuta le offerte.
I rifiuti sono notificati allazienda proponente.
Le offerte accettate diventano visibili agli studenti.
ValutazioneOfferta
RifiutoOfferta
AccettazioneOferta
Responsabile
Accordo
Studente
EsaminaOfferta
Approvazione
StampaDoc
UfficioPersonale
GestioneFerie
GestioneMalattie
Operaio
Responsabile
AcquisizioneMezzi
GestioneRiparazioni
AssegnamentoRisorse
GestioneCommesse
AssegnamentoMezzi
Cliente
AperturaCantiere
GestionePagamenti
Banca
Operaio
Mezzo
Operat ivo : bool
Nome : string
Descrizione : string
Nome
Qualifica
DataAssunzione
Cantiere
Dat aA pertura
Luogo
Responsabile
Cliente
Nome
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
La compagnia di assicurazioni stipula diversi tipi di
polizze (RC auto, vita, rischi diversi).
La compagnia ha diversi clienti, ciascuno dei quali
pu sottoscrivere pi contratti.
Compagnia di Assicurazioni:
Class diagram (1)
Cliente
Nome : string
DataNascita : date
Indirizzo : string
CodiceFiscale : string
1
1..n
Contratto
Numero : int
DataStipula : date
ImportoAssicurato
Compagnia
1
0..n
1
Polizza
Testo : string
1..n
Vita
RCAuto
Furto
Compagnia di Assicurazioni:
Class diagram (2)
Cliente
Nome : string
DataNascita : date
Indirizzo : string
CodiceFiscale : string
Assistenza
Inizio : date
Fine : date
Impiegato
1..n
1..n
1..n
Contratto
1..n Numero : int
DataStipula : date
ImportoAssicurato
1
Agenzia
Numero : int
Indirizzo : string
1..n
0..n
1
Polizza
1..n
Testo : string
1
Compagnia
Vita
RCAuto
Furto
Esercizio 3:
Struttura di un Ospedale
Descriviamo la struttura (statica) di un ospedale con
un diagramma delle classi
Lospedale organizzato in reparti, ciascuno dei
quali ha uno staff e dei pazienti.
I pazienti hanno una cartella clinica associata.
Ciascun paziente pu essere ricoverato pi volte.
Si vuole tenere traccia dei ricoveri e delle
dimissioni.
I reparti hanno uno staff medico fisso. Il pronto
soccorso no: tutto lo staff, secondo opportuni turni,
vi lavora.
Paziente
Nome : string
CodiceFiscale : string
DataNascita : date
Ospedale
1
ProntoSoccorso
1..n
PersonaleAmministrativo
Nome : string
Anzianit : int
1
1..n
Turno
Data : date
1..n
1..n
Reparto
1..n
Ricovero
0..n Ingresso : date
Uscita : date
0..n
1
Periodo
Da : date
A : date
1..n
PersonaleMedico
Nome : string
Qualifica : string
1
CartellaClinica
RepartoConStaff
1
1..n 1
1
StoriaRicovero
1..n
Personale
Medicina
Chirurgia
Ostetricia
Esercizio 4:
Sistema di gestione corsi (1)
Si vuole realizzare un sistema per la gestione
amministrativa dei corsi di Master
Ciascun corso pu essere svolto in pi edizioni
Ogni edizione si articola in un certo numero di lezioni e ogni
lezione pu essere tenuta da pi docenti. Possono esistere
docenti assegnati al corso che, per vari motivi, non tengono
alcuna lezione (ad esempio vengono preallocati per possibili
sostituzioni). Ogni lezione ha una data, unorario di inizio, una
durata e unaula assegnata
Ogni lezione pu richiedere lutilizzo di risorse aggiuntive (es.
VideoBeam, PC, etc.)
I docenti si distinguono fra docenti interni ed esterni. Ciascun
corso ha come responsabile un docente interno
Ogni edizione di un corso ha un certo numero di partecipanti,
iscritti a quella specifica edizione, distinti fra studenti di Master
e uditori esterni
0..n
Corso
Nome : string
Edizione
: int
1..n
1
Preallocazione
0..n
Nome : string
1..n
DocenteEsterno
1..2
Allocazione
0..n
Lezione
Numero : int
1..n Argomento : string
Data : date
OraInizio : time
OraFine : time
Iscritto
1..n
Partecipante
0..n
0..n
1..n
1
Studente
0..n
Uditore
Aula
Nome : string
Capienza : int
VideoBeam : bool
0..n
Risorsa
Nome : string
Esercizio 5: Palestra
Si progetti un sistema informativo per la gestione di
una palestra.
Ad ogni cliente, la palestra chiede nome, cognome,
et, indirizzo e professione, nonch la tipologia di
abbonamento e i servizi richiesti.
La palestra offre abbonamenti mensili e annuali (13
mesi).
I clienti possono usufruire della sala pesi, della
piscina, della parete da arrampicata, della sauna e
del bagno turco. Sala pesi, sauna e bagno turco sono
compresi nellabbonamento base; gli altri servizi
sono venduti in aggiunta alla quota base.
Palestra (2)
Ad ogni cliente associata una scheda per la sala
pesi che definisce gli esercizi da compiere, il
numero di ripetizioni e la frequenza. La scheda pu
essere organizzata su una visita alla palestra a
settimana oppure su due.Nel caso i clienti siano
abbonati a servizi aggiuntivi (ad esempio, la
piscina), la scheda pu considerare anche questi
servizi e, di conseguenza, il numero di visite
aumenta.
Palestra (3)
La palestra offre, a chi fosse interessato, uno staff
medico per assistere i clienti, stabilirne il grado di
forma e definire diete opportune. Chi richiede
questo servizio, deve sottoporsi a controlli mensili e
i risultati vengono opportunamente archiviati: peso,
massa grassa, elettrocardiogramma, battiti del
cuore a riposo e sotto sforzo.
Il sistema deve essere in grado di elaborare il
bilancio complessivo (entrate dagli abbonati) della
palestra sia mese per mese, che alla fine di ogni
anno, e deve sollecitare eventuali clienti morosi o
che devono sottoporsi al controllo mensile.
Scheda
NumVisiteSettimanali : Integer
0..n
1..n
Esercizio
Descrizione : String
Palestra
1
ServiziAggiuntivi
1
Cliente
Nome : String
DataNascita : Date
Indirizzo : String
Professione : String
Moroso(d : Date) : Boolean
DeveFareControllo() : Boolean
1
0..n
RisultatoControlloMedico
DataControllo : Date
Peso : Double
MassaGrassa : Double
FreqCardiacaRiposo : Integer
FreqCardiacaStress : Integer
0..n
1..n
1
0..n
Abbonamento
DataInizio : Date
CostoBase : Integer
1
1..n
Servizio
Nome : String
1..n CostoAggiuntivo : Integer
ServiziBase
1..n
AbbonamentoMensile
AbbonamentoAnnuale
CostoMensile() : Integer
CostoAnnuale() : Integer
DataConclusione() : Date
CostoMensile() : Integer
CostoAnnuale() : Integer
DataConclusione() : Date
Pagamento
MesePagato : Date
0..1 ImportoPagato : Integer
0..13
1..n
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)
Il sistema deve consentire
la gestione di un elenco di scommettitori
l'accettazione di scommesse da parte del bookmaker
per conto di scommettitori (gi conosciuti o nuovi)
la determinazione dell'importo totale delle vincite e
delle perdite per il bookmaker al termine delle corse
(quando cio sono noti i vincitori di tutte le corso
sulle quali sono state accettate scommesse)
Persona
Persona(nome : String, cognome : String)
toString() : String
equals(p : Object) : boolean
main(args : String[]) : v oid
Bookmaker
Fantino
peso : f loat
altezza : f loat
n_v ittorie : int
f antino
Scommettitore
Scommettitore(nome : String, cognome : String)
aggiungiScommessa(s : Scommessa) : v oid
totaleScommesse() : int
totaleVincite() : int
equals(s : Object) : boolean
Corridore
co rr id or e
Scommessa
importo : int
quotazione : f loat
cav allo
Scommessa(c : Corsa, corr : Corridore, imp : int, quot : int)
v inta() : boolean
Ca va llo
pe so : flo at
Ca va llo(n : Str ing, p : flo at )
eq uals (c : Obje ct) : bo olea n
corsa
Co rsa
aggiungiCorridore(c : Corridore) : v oid
setVincitore(v : Corridore) : v oid
equals(c : Object) : boolean
Esercizio 7:
Spedizione posta ordinaria
Descrivere con un sequence diagram le operazioni
che caratterizzano linvio di una lettera per posta
ordinaria dal momento della spedizione fino a
quello della ricezione da parte del destinatario.
Introdurre gli attori, le classi e gli oggetti ritenuti
utili per una descrizione sufficientemente completa
del problema.
Eventualmente descrivere diversi scenari alternativi.
Spedizione posta
: Buca per
lettere
portalettere :
Persona
Ufficio destinazione :
Ufficio postale
: Persona
Imbuca lettera
Ritiro posta
Consegna posta
Smistamento posta
consegna posta
Ritiro posta in arrivo
: Cliente
s : Sportello
t : Tessera
: Banca
MioCC :
ContoCorrente
InserisciTessera(Tessera)
LeggiDati
Dati Tessera: Banca, Codice Tessera
tesseraLeggibile()
VerificaAbilitazione(Codice Tessera)
ok
Lista Operazioni
Pre li ev o(I mpo rto )
Richiesta PIN
PIN
EseguiOperazione(Prelievo, Importo, CodiceTessera, PIN)
VerificaDisponibilit(Importo)
ok
ok
Importo
Impo rto Prel ev at o
ImportoPrelevato
AggiornaSaldoCC
RiduciDisponibilitResidua(Importo)
ok
Collaboration diagram
equivalente
4: tesseraLeggibile()
1: InserisciTessera(Tessera)
8: Prelievo(Importo)
10: PIN
16: ImportoPrelevato
: Cliente
7: Lista Operazioni
9: Richiesta PIN
15: Importo
3: Dati Tessera:
Banca, CodiceTessera
2: LeggiDati
t : Tessera
6: ok
14: ok
13: ok
20: ok
12: VerificaDisponibilit(Importo)
18: AggiornaSaldoCC
19: RiduciDisponibilitResidua
(Importo)
MioCC :
ContoCorrente
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 limpostazione
dellorario.
Il primo bottone definisce la modalit di visualizzazione (normale,
impostazione ora, impostazione minuti), mentre il secondo viene
utilizzato in modalit impostazione per incrementare lora o i
minuti correnti.
Orologio digitale:
class diagram
Display
1
1
Orologio
Ore : int
Minuti : int
Ticks : int
+ Click(ButtonId : int)
+ Tick()
- IncrementaOre()
- IncrementaMinuti()
- Aggiorna()
1
1
Timer
+ModeButton
Button
ButtonId : int
1
+InputButton
Orologio digitale
classe orologio: state diagram
InFunzione
Normale
Click(1)
Tick / Aggiorna
Click(1)
ImpostaOre
Click(2) / IncrementaOre
Click(1)
ImpostaMinuti
Click(2) / IncrementaMinuti
Orologio digitale
classe orologio: state diagram
InFunzione
Normale
Click(1)
Click(2) / [Minuti=59] Minuti = 0
Click(1)
Click(2)
[Ore=23]
Ore = 0
ImpostaOre
Click(1)
ImpostaMinuti
Tick / Aggiorna
Caso di Studio:
Sistema di controllo per un ascensore
Contesto
Sistema di controllo degli ascensori in un palazzo di
m piani
Il sistema di controllo deve gestire il movimento
degli ascensori tra i diversi piani in accordo con i
seguenti vincoli:
Ogni ascensore ha un insieme di bottoni
corrispondenti ai diversi piani. Questi bottoni si
illuminano quando vengono premuti indicando la
richiesta di arresto dellascensore al raggiungimento
del piano corrispondente
Contesto
Vincoli (segue):
In ogni piano, ad eccezione del primo e dellultimo,
esistono due bottoni per chiamare lascensore
specificando se si vuole salire o scendere. I bottoni si
illuminano quando vengono premuti. Lilluminazione
si spegne quando lascensore arriva al piano
muovendosi nella direzione corrispondente al bottone
illuminato
Illuminazione bottone
Movimento/Fermata ascensore
<<include>> <<include>>
<<include>>
Chiamata Ascensore
Passeggero
Ascensore
controlla
Controllore Ascensore
controlla
1
comunica
n
Bottone
Bottone_Piano
Porta
Porta
controlla
Controllore Ascensore
closed : Boolean
controlla
open()
close()
move()
stop()
status()
comunica
n
Bot tone
Bottone_Ascensore
Bot tone_Piano
num_piano : Integer
direzione : Boolean
Sequence diagram:
Selezione diretta piano
: Passeggero
: Bottone_Ascensore
: Controllore
Ascensore
: Ascensore
premi bottone
selezione piano
status( )
illumina
[porta aperta] chiudi
move(direzione)
: Porta
Collaboration diagram:
Selezione diretta piano
: Passeggero
2. selezione piano
: Bottone_Ascensore
4. illumina
9. [raggiunto piano finale] disattiva illuminazione
3. status( )
6. move(direzione)
7. piano raggiunto(piano_corrente)
8. [raggiunto piano finale] stop()
:
Ascensore
Sequence diagram:
chiamata ascensore
: Passeggero
:
Bottone_Piano
: Controllore
Ascensore
: Ascensore
premi bottone
richiesta fermata(piano, direzione)
illumina
[ascensore libero] move(piano)
piano raggiunto
status( )
: P orta
Collaboration diagram:
chiamata ascensore
: Passeggero
1. premi bottone
9. apri porta
: Controllore
Ascensore
:
Bottone_Piano
: Porta
3. illumina
8. elimina illuminazione
5. piano raggiunto
:
Ascensore
close()
Aperta
Chiusa
open()
Ascensore:
esempio di diagramma degli stati
piano raggiunto[ ! ultimo_piano ] /
piano_corrente = piano_corrente + 1
^cont ro llore.pi ano_ rag giun to
Salita
move( nuovo_piano )[
nuovo_piano>piano_corrente a...
al piano
Discesa
move( nuovo_piano )[
nuovo_piano<piano corrente a...
Caso di Studio:
Sistema di gestione posta elettronica
Contesto
In un sistema di posta elettronica ogni utente caratterizzato
dal suo username.
Per ogni utente esistono tre mailbox (inbox, outbox, draft)
che, per semplicit, consideriamo insiemi non ordinati di
messaggi.
Si specifichino le operazioni di creazione di una mail e di sua
spedizione:
Use cases
User
Administrator
Invio posta
Rimozione Account
: MailSystem
Requesting user :
Requesting user's
outbox : MailBox
User
1: newMessage(MailMessage)
2: Aggiungi messaggio a outbox del mittente
3:
4:
Invio posta:
Scenario base
: MailSystem
Requesting User :
User
RequestingUser_
ReceivingUser_
OutBox : MailBox
Inbox : MailBox
1: sendMail(Account)
2: Preleva messaggio
3:
: Administrator
: Account
: MailBox
: MailBox
: MailBox
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
: Administrator
UserAccount :
AccountInbox :
Account
MailBox
AccountOutbox
: MailBox
AccountDraft :
MailBox
1: removeAccount(userName)
2: destroy inbox
3: destroy outbox
X
X
4: destroy draft
5: rimuovi account
6:
Costruzione
Identificazione delle entit rilevanti (classi)
Identificazione delle relazioni fra classi
Identificazione degli attributi
Identificazione delle relazioni di
generalizzazione/specializzazione
Eventuale suddivisione in package
0..*
0..*
MailBox
MailMessage
mitt : Account
dest : Account
text : Testo
#outbox
#inbox
0..*
1
#draft
1
Account
1
userName : String
1
1
+theAccount
MailSystem
Account
userName
0..*
MailMessage
mitt : Account
dest : Account
text : Testo
0..*
MailBox
0..*
Inbox
Draft
1
OutBox