Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
agli Oggetti
Tecniche di Programmazione:
Conclusioni
versione 4.0
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
(vedi ultima pagina)
Sommario
Riepilogo
Diagrammi UML
Eccezioni
API di Java
java.util.Random
String e StringBuilder
Enumerazioni
2
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Riassumendo
Riassumendo
Interfaccia
tutto quello che un componente sa fare
definisce i compiti del componente
Implementazione
tutti i dettagli di come lo fa (gli strumenti e le
tecniche per svolgere i suoi compiti)
Analogo
massaia ed idraulico
3
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Riassumendo
Riassumendo
Obiettivo
costruire società di componenti organizzati
i componenti si dividono i compiti e
collaborano secondo regole precise
Ruolo e Strato applicativo
il ruolo rappresenta il mestiere del
componente
lo strato applicativo rappresenta il luogo di
lavoro del componente
4
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Riassumendo
Riassumendo
Analogo
la lavanderia
Interfaccia e controllo
compito di relazione con il pubblico
Modello e persistenza
compito di fare funzionare la bottega
Servizi di base
infrastruttura e strumenti di lavoro
5
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Diagrammi UML
In questo argomento
la media pesata
indovina il numero
la morra cinese
Diagrammi di documentazione
riconsideriamo i diagrammi UML degli
esempi
cominciamo dai diagrammi delle classi e poi
vediamo alcuni diagrammi di collaborazione
6
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
it.unibas.mediapesata
Principale
Esame
Studente
+static void main()
+void esegui() * + int getVoto()
+ String getNome() + boolean getLode()
depends + String getCognome() + int getCrediti()
+ int getMatricola()
depends + void addEsame(Esame)
+ Esame getEsame(int i)
+ int getNumeroEsami()
+ double getMediaPesata()
+ String toString()
it.unibas.utilita
associazione unidirezionale tra Studente ed esami;
Console l’associazione è di tipo 1 a molti; al solito viene
trascurato l’oggetto di tipo ArrayList intermedio
7
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Diagrammi UML
Nota
l’associazione tra Studente ed Esame è
unidirezionale (lo studente mantiene la lista
di riferimenti agli esami, ma non il viceversa)
Ma, anche in questo caso
l’associazione avrebbe potuto essere
bidirezionale
es: in Studente una lista di Esami, in Esame
un riferimento allo studente
8
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Diagrammi UML
public class Studente {
private String nome, cognome;
private int matricola;
private List<Esame> esami = new ArrayList<Esame>();
...
}
9
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Principale
Esame
it.unibas.utilita
10
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Diagrammi UML
Indovina il numero
di seguito vediamo prima un possibile
diagramma concettuale
poi il diagramma delle classi finale dell’appl.
e alcuni diagrammi di collaborazione
Al solito
le classi del modello dell’applicazione
discendono dal diagramma concettuale
non tutti i concetti sono diventati classi
11
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
1 1…*
Giocatore Partita
nome gioca > numeroDaIndovinare
numeroDiTentativi
1 1
relativo a >
effettua > *
*
Tentativo
valore
risultato
l’associazione “effettua” è
ridondante; infatti è possibile
risalire al giocatore che ha
effettuato il tentativo “navigando” dal
tentativo alla partita e di lì al giocatore nei ruoli viene utilizzato il verso
(ciclo nel grafo); per suggerire in che modo
leggere l’associazione
12
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Indovina il Numero
it.unibas.indovina
Principale
- Record record
+ static main(String[])
+ void schermoInizioGioco() Partita
- void schermoTentativo()
- String nome
- void schermoFineGioco()
- int numero
- void schermoInterruzione()
- int numeroTentativi
- void schermoUscita()
- boolean trovato
- String suggerimento
- static java.util.Random generatore
+ void setNome()
+ void gestisciTentativo()
+ void reset()
+ boolean getTrovato()
+ String getNome()
+ int getNumTent()
+ int getNumero()
+ String getSuggerim()
it.unibas.utilita
13
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
1. main() Principale
2. p = new Principale()
3. p.esegui()
4. schermoIniziale()
8. schermoTentativi() p : Principale
5. p = new Partita()
7. p.setNome(nome)
6. nome = Console.leggiStringa()
10. p.gestisciTentativo(tentativo)
9. tentativo = Console.leggiIntero()
11. p.getTrovato()
it.unibas.utilita.Console p : Partita
il processo si ripete finchè
l’utente non indovina oppure
interrompe la partita
14
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Principale Console
main()
new
p: Principale
p.esegui()
schermoIniziale()
new
p: Partita
nome = leggiStringa()
p.setNome(nome)
[finchè !trovato] :
Ripetizione
schermoTentativo()
tentativo = leggiTentativo()
p.gestisciTentativo()
trovato = p.getTrovato()
15
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
Diagrammi UML
La Morra Cinese
il diagramma dei casi d’uso
un possibile diagramma concettuale
poi il diagramma delle classi finale
dell’applicazione
un diagramma di collaborazione
20
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
La Morra Cinese
it.unibas.morracinese
Utente gioca
partita
utente
Utente visualizza
punteggi
21
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
l’associazione Giocatore
relativa a >
*
Giocatore Partita
nome maniVinteDalGiocator
e
maniVinteDalCompute
pareggi
sono state omesse le
cardinalità pari a 1 relativo a >
giocata giocatore * *
Oggetto Mano
giocata computer
valore esito
*
22
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
La Morra Cinese
Gioco Mano
- String nomeGiocatore - int giocataGiocatore
- int partiteVinteGiocatore - int giocataComputer
Principale - int partiteVinteComputer - static java.util.Random generatore
+ void setNomeGiocatore() + void gioca(int)
+ int getPartiteGiocatore() + boolean isValida()
+ static void main() + int getPartiteComputer() + int getGiocataGiocatore()
+ void gioca() + void gestisciPartita(Partita) + int getGiocataComputer()
+ Gioco getGioco()
- void setGiocataGiocatore()
- void schermoMenuPrincipale()
- void generaGiocataComputer()
- String schermoIniziale()
+ int getEsito()
- void schermoVittore()
ControlloPartita Partita
- Gioco gioco - int maniVinteDalComputer
- int maniVinteDalGiocatore
+ static String getSimobolo(int)
- int pareggi
+ static String getGiocata(int)
+ void setGioco(Gioco) + int getManiVinteDalGiocatore()
- void giocaNuovaPartita() + int getManiVinteDalComputer()
- int schermoMenuPartita() + int getPareggi()
- void schermoEsitoMano() + void gestisciMano(Mano)
ATTENZIONE: NON ci sono
- void schermoEsitoPartita() + int getStato()
- void schermoPartitaInterrotta()
associazioni tra gli oggetti
(per scelta di progetto)
23
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML
7. cp.giocaNuovaPartita()
8. p = new Partita() 11. m.getStato()
cp : ControlloPartita 11. p.gestisciMano(m)
12. p.getStato()
m : Mano
l’utente sceglie il caso l’utente sceglie il caso 9. m = new Mano()
d’uso n. 2 (punteggi) d’uso n. 1 (partita)
10. m.gioca(mossaGiocatore)
24
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Eccezioni
Eccezioni
Un elemento importante
la gestione degli errori in Java
per ora ne diamo una introduzione sintetica,
ci sarà un modulo nel prossimo corso (>>)
Eccezione
qualsiasi situazione in cui il programma non
può svolgere normalmente il proprio lavoro
e quindi si genera un errore applicativo
25
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Eccezioni
Eccezioni
Possibili cause di eccezioni
errori interni di programmazione
utilizzo “scorretto” da parte dell’utente
malfunzionamento di sistemi esterni
Gestione delle eccezioni
la tecnica per garantire la robustezza è la
gestione delle eccezioni
ovvero riconoscere le condizioni eccezionali
e cercare di mettere riparo senza abortire
26
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Eccezioni
Eccezioni
In caso di errore applicativo
in Java viene “sollevata una eccezione”
Oggetto eccezione
oggetto creato dalla macchina virtuale per
segnalare un malfunzionamento
viene “lanciato” dal metodo in cui si verifica
l’errore
può essere “catturato” e gestito dal metodo
chiamante
27
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Eccezioni
Eccezioni
Le parole chiave di Java (>>)
try {…} catch (Exception e) {…}
blocco controllato che può lanciare
un’eccezione
throw new Exception(…) istruzione per
lanciare un’eccezione
throws: clausola del prototipo con cui si
dichiara che il modulo può lanciare
un’eccezione
28
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
La Piattaforma Java
Package e classi notevoli
java.util.Random
java.lang.StringBuilder
Il package java.util
è noto principalmente come il package delle
collezioni di Java
ma offre anche altri componenti utili
29
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
La Classe java.util.Random
La classe java.util.Random
costruisce generatori di numeri casuali
In particolare
il costruttore crea un oggetto che è un
generatore di numeri casuali inizializzandone
il seme con il valore dell’orologio
per ottenere la sequenza pseudo-casuale:
int nextInt(int max)
30
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
La Classe java.util.Random
Linea guida
è sufficiente creare un unico generatore una
volta per tutte
e utilizzarlo tutte le volte che serve
Un metodo alternativo
java.lang.Math.random()
restituisce un valore di tipo double compreso
fra 0 e 1
31
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
La Classe java.util.Random
package it.unibas.indovinasemplice;
import java.util.Random;
public Partita() {
this.numeroDaIndovinare = generatore.nextInt(100) + 1;
this.trovato = false;
this.numeroDiTentativi = 0;
this.suggerimento = "Ho scelto un numero tra 1 e 100. Prova a indovinarlo.";
}
32
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
String e StringBuilder
java.lang.String
rappresenta stringhe immutabili
ogni volta che concateno stringhe (+) di fatti
sto costruendo nuove stringhe
In alcuni casi
è necessario costruire stringhe
concatenando assieme molti pezzi
in questi casi può essere opportuno utilizzare
uno StringBuilder invece che String
33
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
String e StringBuilder
>> java.lang.StringBuilder
StringBuilder
classe i cui oggetti rappresentano stringhe
modificabili
I principali metodi
append(): concatena alla stringa un’altra
stringa
setCharAt(int i): cambia il carattere i-esimo
insert(): inserisce una stringa in un’altra
34
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
Enumerazioni
Un’ultima annotazione
rappresentazione dei valori di tipi enumerabili
nella Morra Cinese (oggetto ed esito)
La soluzione tradizionale di Java
costanti intere
Esempio: nella classe Gioco
public final static int CARTA = 1;
public final static int FORBICI = 2;
public final static int SASSO = 3;
36
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
Enumerazioni
Vantaggi di questo approccio
molto semplice da utilizzare (es: acquisire i
dati, scrivere il codice)
Svantaggi di questo approccio
il compilatore non effettua nessuna verifica
sui valori della giocata
qualsiasi valore intero è in linea di principio
accettabile come valore della giocata
37
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
ATTENZIONE
Enumerazioni alle enumerazioni
J2SE 5.0
Enumerazioni
Esempio
una enumerazione per l’oggetto giocato
public enum Oggetto {CARTA, FORBICI, SASSO};
Semantica
definisce un nuovo tipo (Oggetto)
i cui membri costanti sono i riferimenti di tipo Oggetto
Oggetto.CARTA, Oggetto.FORBICI, Oggetto.SASSO
Oggetto.CARTA.toString() -> “CARTA”
Oggetto.CARTA.ordinal() -> 0
39
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
...
40
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Sommario
Riassumendo
Riepilogo
Diagrammi UML
API di Java
java.util.Random
String e StringBuilder
Enumerazioni
41
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
Enumerazioni
Attenzione
enum è una parola chiave nuova introdotta in
J2SE 5.0 (prima non lo era)
riduce la compatibilità con il codice esistente
(es: classe che ha una proprietà o variabile
chiamata “enum”)
Per risolvere questo problema
è necessario compilare il codice con
un’opzione particolare
42
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java
Enumerazioni
Il livello dei sorgenti
opzione –source es: javac –source 1.5 Mano.java
valore standard: 1.3
Se il livello è 1.3
enum non è una parola riservata, ma non è
consentito usare enumerazioni
Se il livello è 1.5
enum è una parola riservata, non è
consentito usarla come identificatore
43
G. Mecca - Programmazione Orientata agli Oggetti
Termini della Licenza
44
G. Mecca - Programmazione Orientata agli Oggetti