Programmazione a Oggetti
Modulo B
UML
Dott. Alessandro Roncato
11/10/2011
Le associazioni tra classi
Prendono spunto dalle relazioni tra oggetti del
mondo reale (per esempio Prodotto
appartiene a un Lotto), ma nella modellazione
a oggetti denotano principalmente il fatto che
dall'oggetto Prodotto è possibile “conoscere”
l'oggetto Lotto al quale appartiene.
2
UML
Uml è un linguaggio visuale semiformale
Permette di “abbozzare” delle soluzioni per
vedere cosa manca
Useremo per fare una “bozza” del progetto
Diagramma delle classi visualizza le classi, le
estensioni e le associazioni
Vista statica del progetto
3
Diagramma UML classi
(parziale)
*
1
Prodotto
Lotto
Associazioni
Scontrino
4
Diagramma UML classi
(parziale)
Prodotto
Is-a
Elettrodomestico
Estensione
...
Alimentare
5
Che campi nelle classi?
I campi (o variabili d'istanza) delle classi devono
permettere di rappresentare l'oggetto stesso
Esempio: per rappresentare un Prodotto, ci
dovrebbe essere il nome del prodotto, il codice,
il prezzo etc.
Java Bean, i campi sono privati, quindi sono un
dettaglio implementativo, si stabiliscono quali
sono le proprietà delle classi
6
Che metodi nelle classi
I metodi devono permettere di usare in maniera
semplice l'oggetto stesso;
Ogni metodo (che non sia get e set) dovrebbe
avere il nome di un verbo ed eventualmente un
complemento:
Esempio: stampa, calcolaTotale
Il verbo è imperativo o passivo (l'oggetto esegue
il comando o subisce l'azione)
7
Esempio
• In linguaggio naturale nell'applicazione il
Negoziante emette uno Scontrino relativo a
una Spesa/Carrello di un Cliente.
• In Java la classe Carrello ha un metodo
emettiScontrino (con eventualmente
parametro di tipo Cliente).
8
Che metodi nelle classi
Generalmente non è bene che un metodo abbia
il nome composto da due verbi: es.
CalcolaEStampa
Significa che probabilmente fa 2 cose distinte,
meglio invece avere 2 metodi distinti: il metodo
Calcola e il metodo Stampa
(Vedremo casi in cui ha senso avere 2 verbi)
9
Che metodi nelle classi
Semplici da usare:
Nome individua chiaramente la funzione
Pochi parametri: quelli indispensabili per dare senso
al metodo
Altri parametri possono essere “impostati” grazie lo
stato dell'oggetto:
Invece che avere o.stampa(testo, position, font, size,
color, shadow, threeDim, rotate)
Meglio un metodo o.stampa(testo, position) e gli altri
parametri impostabili con altri metodi tipo
o.setFont(font) da invocare prima di o.stampa
10
Che metodi nelle classi
Avere pochi metodi pubblici aumenta
l'indipendenza
Ma quali sono i metodi che sono necessari e
pubblici?
Diagrammi di sequenza permettono di “trovare”
i metodi necessari
11
Diagrammi di sequenza
Scopo dei diagrammi di sequenza è illustrare
come oggetti diversi collaborano per risolvere
un certo problema.
In pratica, illustrano la sequenza di invocazioni
dei diversi metodi nei diversi oggetti per un
certa interazione dell'utente
12
Esempio
Diagramma di sequenza che descrive come gli
oggetti collaborano quando il bibliotecario
concede un libro in prestito
Lo scopo è “ipotizzare” come potrebbe avvenire
la collaborazione
I diagrammi vengono usati come strumento
veloce per schematizzare il “funzionamento”
13
Diagramma di sequenza
Carrello
Prodotto
Cliente
*totale+=p.getPrezzo()
sconto=c.getSconto()
new Scontrino(prodotti,cliente,totale)
Scontrino
*venduto()
aggiungiPunti(totale)
14
Aggiornamento Diagramma classi
Prodotto
1
*
Lotto
getPrezzo()
venduto(Utente)
Carrello
Scontrino
Cliente
getSconto
15
Diagramma di sequenza
Carrello
Prodotto
Cliente
*totale+=p.getPrezzo()
sconto=c.getSconto()
new Scontrino(prodotti,cliente,totale)
Scontrino
*venduto()
aggiungiPunti(scontrino)
16
Diagramma di sequenza
Carrello
new Scontrino(prodotti,cliente,carrello)
Prodotto
Cliente
Scontrino
*totale+=p.getPrezzo()
sconto=c.getSconto()
*venduto()
aggiungiPunti(scontrino)
17
Aggiornamento Diagramma classi
Prodotto
1
*
Lotto
getPrezzo()
venduto(Utente)
\
Carrello
Scontrino
Cliente
getSconto()
18
setTotale???
Serve il metodo setTotale nella classe Scontrino?
Nell'approccio a oggetti è preferibile che la
classe Scontrino che calcola da sola il totale
dello scontrino sia l'unica che possa impostare il
relativo totale nello scontrino stesso (ad
esempio se il carrello potesse impostare tale
totale dovrebbe anche accedere al Cliente per
calcolare lo sconto etc.)
Mentre getTotale non crea problemi di questo
tipo
19
setTotale???
Inoltre i metodi pubblici devono agire
sull'oggetto lasciando in uno stato consistente
l'oggetto stesso.
Cosa significherebbe uno scontrino con dei
prodotti e un totale che non ha niente a che
vedere con i prodotti stessi?
20
Diagramma casi d'uso
Servono per capire quali sono le interazioni
dell'utente con l'applicazione
Nel nostro caso possiamo avere due ruoli per gli
utenti ovvero: Responsabile e Cassiere
Un caso d'uso rappresenta una singola
interazione
21
Elenco Casi d'uso
22
Diagramma casi d'uso
Attori (ruoli) sono soggetti esterni
all'applicazione che stiamo descriveno
(generalmente persone ma potrebbero essere
sistemi/applicazioni esterne)
Casi d'uso: rappresentano una azione atomica
gestita dall'applicazione.
I casi d'uso non corrispondono alle funzionalità:
1 funzionalità-> più casi d'uso
23
Come procedere
Abbozzare il diagramma delle classi
Elencare tutti casi d'uso
Abbozzare i diagrammi di sequenza per ogni casi
d'uso
Aggiornare e completare il diagramma delle
classi:
Elencare i metodi
Eventualmente aggiungere le classi mancanti
24
Come procedere 2
Lasciare da parte i problemi di interazione con la
grafica o il parser.
I diagrammi faranno quindi riferimento al
“Modello” del Negozio
Utilizzare Carta e matita per disegnare i
diagrammi (NON usare applicazioni)
25
Prossimamente
Come collegare l'interazione con l'utente nel
nostro modello
Come gestire i diversi comportamenti dei
Prodotti (Polimorfismo)
Come creare gli oggetti
Come gestire oggetti singoli
26
Varie
Per lo sviluppo del progetto è possibile usare
qualsiasi IDE; In laboratorio sono disponibili
solo Netbeans, Eclipse e Jedit.
Nota che Netbeans, Eclipse e Jedit sono
disponibili su tutte le piattaforme (Win, Mac,
e Linux)
Per evitare problemi di compatibilità gli esempi
di codice saranno indipendenti dalle
piattaforme
27
Varie
Gli studenti che hanno già superato MP che
debbono fare l’integrazione per PO devono
implementare lo stesso progetto degli altri
Gli studenti che debbono sostenere MP e che
hanno 1 credito già riconosciuto e quindi devono
integrare solamente 2 crediti dovranno
progettare l'intera applicazione tramite
diagrammi UML e l'implementarne la metà delle
classi.
28
Varie
Gli studenti che debbono sostenere MP e che
hanno 2 crediti già riconosciuti e quindi devono
integrare solamente 1 credito dovranno
progettare l'intera applicazione tramite
diagrammi UML
In tutti e tre i casi (credito 0 integrazione 3, credito
1 integrazione 2, credito 2 integrazione 1) orale
obbligatorio
29