Sei sulla pagina 1di 40

Programmazione Orientata

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)

G. Mecca – Università della Basilicata – mecca@unibas.it


Ruoli e Responsabilità: Conclusioni >> Sommario

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

viene descritta solo


Esempio: Media Pesata l’interfaccia

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>();
...
}

public class Esame {


private String insegnamento;
private int vodo, crediti;
private boolean lode;
private Studente studente;
...
}

9
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> Diagrammi UML

Media Pesata: Diagramma delle Classi


it.unibas.mediapesata

Principale
Esame

+static void main() Studente


+void esegui() * + int getVoto()
- void setVoto(int)
depends + String getNome() 1 + boolean getLode()
+ String getCognome() - void setLode(boolean)
depends + int getMatricola() + int getCrediti()
+ void addEsame(Esame) - void setCrediti(int)
+ Esame getEsame(int i) + void setStudente(Studente s)
+ int getNumeroEsami() + Studente getStudente()
+ double getMediaPesata()
+ String toString()

it.unibas.utilita

Console associazione bidirezionale


tra Studente ed esami; vengono
specificate entrambe le cardinalità

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

Indovina il Numero cardinalità minima e massima


(un giocatore può giocare una o
più partite)

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

Indovina il Numero: Collaborazione


Oggetto

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

La Morra Cinese gioca Partita sarebbe


ridondante

in questo caso sono state Gioco


omesse le associazioni gioca > * vittorieComputer
ridondanti; il grafo risultante
vittorieGiocatore
è aciclico

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

La Morra Cinese: Collaborazione


il processo si ripete
ControlloPrincipale finchè la partita non
1. main() termina
2. p = new Principale()
p.esegui()
3. g = new Gioco()
p : ControlloPrincipale g : Gioco
6. schermoVittorie()

13. g.gestisciPartita(p) 14. p.getStato()


4. cp = new ControlloPartita()
5. cp.setGioco(g) p : Partita

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 class Partita {

private static Random generatore = new Random();


private String nome; private String suggerimento;
private int numeroDaIndovinare; private int numeroDiTentativi;
private boolean trovato;

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

private static String getSimbolo(int mossa) {


StringBuilder simbolo = new StringBuilder();
if (mossa == Mano.CARTA) {
simbolo.append(" _____ \n");
simbolo.append("| ___ \\ \n");
simbolo.append("| ___ | \n");
simbolo.append("| ___ | \n");
simbolo.append("|_____| \n");
} else if (mossa == Mano.FORBICI) {
simbolo.append(" \\\\ // \n");
simbolo.append(" \\\\ // \n");
simbolo.append(" \\\\// \n");
simbolo.append(" //\\\\ \n");
simbolo.append(" // \\\\ \n");
simbolo.append(" () () \n");
} else if (mossa == Mano.SASSO) {
simbolo.append(" ___ \n");
simbolo.append(" ( ) \n");
simbolo.append("( ( ) \n");
simbolo.append("(____) \n");
}
return simbolo.toString();
}
35
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

A partire da J2SE 1.5


è possibile definire in Java enumerazioni
 Enumerazione (“Typesafe Enum”)
classe Java semplificata
i cui membri sono esclusivamente costanti
ciascuna costante è un oggetto
trasformabile in stringa con toString()
e in intero con ordinal()
38
G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Conclusioni >> La Piattaforma Java

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

essendo una classe, se è contenuta


Enumerazioni nel file Mano.java non può essere pubblica
ma deve essere friendly;
package it.unibas.morracinese; alternativa: in Oggetto.java

enum Oggetto {CARTA, FORBICI, SASSO};

public class Mano {

private Oggetto giocataGiocatore;


private Oggetto giocataComputer;

public boolean isValida(int giocata) {


return (giocata >= Oggetto.CARTA.ordinal()
&& giocata <= Oggetto.SASSO.ordinal());
}

...

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

Termini della Licenza


 This work is licensed under the Creative Commons Attribution-
ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to
Creative Commons, 559 Nathan Abbott Way, Stanford, California
94305, USA.

 Questo lavoro viene concesso in uso secondo i termini della


licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere
una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una
lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way,
Stanford, California 94305, USA.

44
G. Mecca - Programmazione Orientata agli Oggetti

Potrebbero piacerti anche