Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 1
Vittorio Scarano
Corso di Programmazione DistribuitaLaurea di I livello in Informatica
Università degli Studi di Salerno
Lezione 4Programmazione
Object-Oriented in Java
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
2
Organizzazione della lezione
• La programmazione orientata agli oggetti– motivazioni, obiettivi e principi guida della progettazione
• Unified Modeling Language (UML)• Alcune semplici classi
– Uso della classe Date e GregorianCalendar
– Creazione di una nuova classe (Employee)
• Campi e metodi statici• Parametri dei metodi• Costruzione di oggetti ed inizializzazione
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 2
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
3
Organizzazione della lezione
• La programmazione orientata agli oggetti– motivazioni, obiettivi e principi guida della progettazione
• Unified Modeling Language (UML)• Alcune semplici classi
– Uso della classe Date e GregorianCalendar
– Creazione di una nuova classe (Employee)
• Campi e metodi statici• Parametri dei metodi• Costruzione di oggetti ed inizializzazione
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
4
Hardware/Software: una evoluzione sbilanciata
• Hardware: – progresso tecnologico velocissimo
– i PC di oggi erano chiamati supercomputer 20 anni fa
– uso di processori e memorie in moltissimi manufatti
• Software:– di complessità sempre crescente
– che coinvolge team di programmatori
• Obiettivi contrastanti:– un sistema per risolvere problemi in maniera efficiente che
sia però così semplice da essere “gestibile”
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 3
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
5
Alcune leggi e strategie…
Hofstadter's Law:It always takes longer than you expect, even when you take Hofstadter's Law into account.
Ninety-Ninety Rule of Project Schedules:The first ninety percent of the task takes ninety percent of the time, and the last ten percent takes the other ninety percent.
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
6
La programmazione orientata agli oggetti
• Una metodologia per costruire sistemi software:– robusti– adattabili e portabili– riusabili
• Principio “economico” prima che informatico:– Dell, Compaq, etc. contro IBM, HP, etc.
– McLaren, Williams contro Ferrari (anni 80)
• L’idea:– “Non importa il colore del gatto, basta che acchiappi il topo”
Mao Tze Tung
– Implementazione nascosta dalla interfaccia
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 4
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
7
Obiettivo 1: la robustezza del software
• Software robusto:– capace di trattare in maniera coerente con input “strani”
• Importanza nei sistemi life-critical:– un fallimento: il software per il Therac-25
• cancellazione di caratteri a video ma non dall’input
• Capace di seguire richieste dell’utente:– Esempio: input e memorizzazione di più dati di quelli
previsti
• Correttezza:– per tutti i valori dell’input, compreso i valori detti di
boundary (limite)
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
8
Obiettivo 2: la adattibilità del software
• I programmi hanno una vita molto lunga
• Necessario trattare con la evoluzione dell’ambiente – aumento velocità della CPU, rete
• videogiochi “antichi” non utilizzabili
– sicurezza (alla aumentata “connettività”)
– mutazioni esterne:• anno 2000, Euro, etc.
• Software – capace di evolverecon poco sforzo
– portabile su piattaforme diverse
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 5
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
9
Obiettivo 3: la riusabilità del software
• Sviluppo del software di qualità:– costoso
– veloce
• Necessario poter riutilizzare il software già scritto– importanza del lavoro cooperativo
• Riusabilità fatta con sicurezza– la specifica precisa delle componenti da riutilizzare
– permette di evitare possibili errori
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
10
La programmazione a oggetti
• Il programma è costituito da oggetti– scelti tra quelli disponibili o creati ex-novo
– che espongono delle funzionalità
– la cui implementazione si ignora
• Confronta con programmazione strutturata:– algoritmi per risolvere problemi (funzioni)
– (poi) memorizzazione dati in strutture dati
• La OOP inverte l’ordine:– la organizzazione dei dati precede la scelta delle funzionalità
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 6
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
11
Caratteristiche chiave della OOP
• Ogni oggetto è responsabile delle azioni correlate ai dati che contiene– un oggetto può manipolare i propri dati ma non deve
(dovrebbe) mai manipolare i dati degli altri.
• Un oggetto espone dei metodi:– funzioni
– che permettono di accedere ai dati nella maniera corretta.
• Chi (o cosa) usa un oggetto ignora i dettagli della implementazione
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
12
Il vocabolario della OOP: le classi
• Classe:
– modello (schema) secondo il quale un oggetto verrà creato (istanziato)
• Tutto quanto è disponibile in Java è in una classe:– la libreria standard fornisce “di tutto, di più”
– anche i nostri programmi sono in una o più classi
– necessaria una accurata progettazione OOP
• Principi guida della progettazione OOP:
– Astrazione
– Incapsulamento
– Modularità
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 7
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
13
Principio 1: Astrazione
• Descrizione formale delle caratteristiche fondamentali di un sistema – nomi e funzionalità
• Sufficientemente dettagliata per il comportamento…– sufficientemente astratta (ad alto livello) per non includere dettagli non
necessari
• Astrazione alla progettazione di strutture dati:– Abstract Data Types (ADT)
• modello matematico di organizzazione dei dati
• specifica tipo di dati, operazioni, e parametri delle operazioni
• “cosa fa” non “come lo fa” (interfaccia (interface Java))
• realizzata da una classe Java
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
14
Principio 2: Incapsulamento (Information hiding)
• Le componenti del sistema non devono rivelare dettagli sulle implementazioni interne
• Concede la libertà al programmatore:– le scelte implementative possono essere cambiate
– solo necessario mantenere la interfaccia verso l’esterno
• L’incapsulamento permette la adattabilità– necessario solamente cambiare implementazione interna alla
classe
• L’incapsulamento permette la riusabilità– riuso di componenti con implementazione non nota
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 8
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
15
Principio 3: Modularità
• Struttura organizzata in cui componenti diverse di un sistema sono diverse in unità funzionali separate.– Esempio: una casa suddivisa in:
• unità elettrica• unità di riscaldamento e raffreddamento• unità idraulica• unità strutturale (mura)
• Di norma, strutturata in maniera gerarchica:– definizioni simili vengono raggruppate a livelli dallo
specifico verso il generale– gerarchia “is a” (“ è un”)
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
16
Un esempio di gerarchia “is a”
Edifici
Appartamenti Case Commerciali
In parchi In edifici A 2 piani Basse Grattacieli
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 9
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
17
Il vocabolario della OOP: gli oggetti
• Tre caratteristiche fondamentali:– il comportamento dell’oggetto:
• quali metodi possono essere applicati?
– lo stato dell’oggetto:• come reagisce l’oggetto?
– l’identità dell’oggetto:• come si distingue l’oggetto tra altri oggetti simili?
• Tutti gli oggetti istanza della stessa classe:• hanno lo stesso comportamento
• differiscono di solito nello stato
• differiscono semprenella identità
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
18
Progettare con oggetti
• Identificare le classi ed i metodi da applicare– nella programmazione procedurale si definivano prima gli
algoritmi e poi la struttura dati
• Nella fase di progettazione, si arriva ad una descrizione del problema in linguaggio naturale
• Una regola empirica da applicare : – nella descrizione in linguaggio naturale del problema
• i sostantivi sono le classi
• i verbi sono i metodi
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 10
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
19
Progettare con oggetti: un esempio
• Per elaborare ordini in un magazzino merci:– Le classi possono essere:
• Articolo (Item)• Ordine (Order)• Indirizzo per la spedizione (Shipping Address)• Pagamento (Payment)• Conto (Account)
– I metodi possono essere:• Aggiungere un articolo (add) ad un ordine• Spedire (ship) o annullare (cancel) un ordine• Un pagamento viene applicato (apply) ad un ordine
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
20
Relazioni tra classi
• Tra le tante relazioni possibili, le più importanti:– Dipendenza
– Aggregazione
– Ereditarietà
• Le relazioni tra classi – formano un diagramma delle classi
– usato per modellare il sistema software da progettare
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 11
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
21
Relazioni: Dipendenza
• La relazione più comune e generale:– una classe A dipende da un’altra classe B se gli oggetti di A
devono accedere a metodi degli oggetti di B
• Esempio:– gli oggetti della classe Orderdevono necessariamente usare
oggetti della classe Account • controllano lo stato del conto del cliente prima di effettuare la
spedizione
– gli oggetti della classe Item, invece, non devono accedere a oggetti della classe Account.
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
22
Relazioni: Aggregazione ed ereditarietà
• Aggregazione:– un oggetto della classe A contiene oggetti della classe B
– esempio:• un oggetto della classe Order contiene oggetti della classe Item
• Ereditarietà– relazione tra una classe più specializzata ed una più generale
– esempio:• una classe RushOrder(ordine urgente) specializza (eredita) da una
classe Order– eredita metodi ma ha suoi propri metodi specifici
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 12
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
23
Un esempio sulla ereditarietà
• Una classe Personache ha:– stato: nome, cognome, annoDiNascita
– metodi: getCognome(), getNome(), dimmiEta()
• Una classe Studente specializza Personaaggiungendo– allo stato: matricola, scuola, classe, sezione, voti, etc.
– metodi: annoDiDiploma(), votoMaturità(), etc.
• In questa maniera Studenteeredita i metodi di Persona
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
24
Organizzazione della lezione
• La programmazione orientata agli oggetti– motivazioni, obiettivi e principi guida della progettazione
• Unified Modeling Language (UML)• Alcune semplici classi
– Uso della classe Date e GregorianCalendar
– Creazione di una nuova classe (Employee)
• Campi e metodi statici• Parametri dei metodi• Costruzione di oggetti ed inizializzazione
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 13
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
25
Unified Modeling Language
• Un linguaggio per specificare, visualizzare costruire e documentare le componenti di un sistema software
• UML definisce una ampia varietà di diagrammi:– diagrammi di classe
– diagrammi di collaborazione
– diagrammi di stato
– ….
• Notazione simbolica per rappresentare le relazioni tra classi in maniera semplice, chiara e completa
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
26
Le relazioni tra classi in UML (1)
• Dipendenza– una classe A dipende da un’altra classe B se gli oggetti di A
devono accedere a metodi degli oggetti di B
• Esempio:– gli oggetti della classe Orderdevono necessariamente usare
oggetti della classe Account
Order Account
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 14
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
27
Le relazioni tra classi in UML (2)
• Aggregazione:– un oggetto della classe A contiene oggetti della classe B
• Esempio:• un oggetto della classe Ordercontiene oggetti della classe Item
Order Item
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
28
Le relazioni tra classi in UML (3)
• Ereditarietà– relazione tra una classe più specializzata ed una più generale
• Esempio:• una classe RushOrder(ordine urgente) specializza (eredita) da una
classe Order
Order
RushOrder
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 15
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
29
Un esempio in UML:
Classe Studente
Persona
TasseScolastiche
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
30
Programmazione OO e procedurale (1)
• Programmazione procedurale– Due tecniche:
• top-down: raffinamento graduale di operazioni in operazioni più piccole e semplici fino alla codifica in un linguaggio
• bottom-up: scrittura procedure per compiti semplici e loro composizione per ottenere la funzionalità desiderata
• Di solito, utile una miscela delle due tecniche:– provvedere ad una prima analisi top-downcon scrittura del
codice e composizione bottom-up
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 16
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
31
Programmazione OO e procedurale (2)
• Caratteristica:– identificazione ed isolamento delle classi
– (e solo dopo)identificazione dei metodi delle classi
• Vantaggi:– modularizzazione in maniera indipendente
• lavoro per team di programmatori
– identificazione e raggruppamento chiaro dei metodi• invece di 2000 funzioni, si hanno 100 classi con 20 metodi
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
32
Alcune domande….
• Una buona programmazione procedurale è in effetti programmazione orientata agli oggetti?
• in effetti, scomporre ed isolare le funzioni ed evitare variabili e dati globali è una buona tecnica, indipendentemente dalla metodologiausata
• Si può programmare ad oggetti con un linguaggio che non sia object-oriented?
• posso evitare di imparare Java o C++ e continuare a usare il C?
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 17
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
33
Ed alcune risposte (parziali)…
• “Una buona programmazione procedurale è in effetti programmazione orientata agli oggetti?”– Il vantaggio di avere la classee di usarla per avere più
oggettidello stesso tipo non può essere ottenuto in un linguaggio procedurale
• “Si può programmare ad oggetti con un linguaggio che non sia object-oriented?”– Si, così come è possibile inchiodare un chiodo usando un
cacciavite invece di un martello.• (sarebbe “No”)
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
34
Organizzazione della lezione
• La programmazione orientata agli oggetti– motivazioni, obiettivi e principi guida della progettazione
• Unified Modeling Language (UML)• Alcune semplici classi
– Uso della classe Date e GregorianCalendar
– Creazione di una nuova classe (Employee)
• Campi e metodi statici• Parametri dei metodi• Costruzione di oggetti ed inizializzazione
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 18
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
35
Oggetti e variabili oggetto
• Per lavorare con gli oggetti – si deve costruirli specificando lo stato iniziale
• In Java esistono i costruttori– un metodo speciale offerto dalla classe che permette di
costruire, inizializzandone il valore, nuovi oggetti
• Un esempio:– la classe Date
• Un commento:• perché si ritiene di usare una classe e non un tipo predefinito (come
in alcuni linguaggi)?
• perché una classe è modificabile, un tipo primitivo no.
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
36
La classe Date
• I costruttori hanno sempre lo stesso nome della classe
• Per costruire un nuovo oggetto si combina il costruttore con l’operatore new
• Cosa si fa dell’oggetto creato?– lo si può passare a un metodo:
– si può invocarne un metodo:
– si assegna ad una variabile:
new Date()
System.out.println(new Date());
String s = new Date().toString();
Date compleanno = new Date();
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 19
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
37
Variabili di riferimento ( reference)
• Le variabili oggetto contengono riferimenti a oggetti,non oggetti– l’operatore new restituisce un riferimento all’oggetto
creato
– possibili assegnarle a null per indicare che non fa riferimento ad alcun oggetto
– la copia di variabili oggetto effettua la copia dei riferimenti non degli oggetti
compleanno
scadenza
Date compleanno = new Date();Date scadenza = compleanno;
Date
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
38
Classe Date
• Memorizza un punto temporale:– implementazione: numero (positivo o negativo) di
millisecondi trascorsi dalla epoch• 1 gennaio 1970 Greenwich Mean Time
• La progettazione object-oriented: un esempio– una descrizione di data (31 dicembre 1976, 23:59:59) è una
convenzione arbitraria disciplinata da un calendario– il calendario è quello gregoriano
• (esistono anche quello ebraico, cinese etc.)
– separazionetra il tempo (Date) e la rappresentazione mediante convenzioni (GregorianCalendar)
– possibile usare altri calendari
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 20
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
39
Uso di Date e GregorianCalendar
• Classe Date : pochi metodi
– metodo before e after:
• Classe GregorianCalendar : molti metodi e costruttori
if (today.before(compleanno))System.out.println (“Comprare il regalo!”);
elseSystem.out.println (“Troppo tardi: un’altra figuraccia!”);
GregorianCalendar s1 = new GregorianCalendar(); //data e ora della costruzioneGregorianCalendar s2 = new GregorianCalendar(1999,11,31);GregorianCalendar s3 = new GregorianCalendar(1999,Calendar.DECEMBER,31);GregorianCalendar s4 =
new GregorianCalendar(1999,Calendar.DECEMBER,31, 23, 59, 59);
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
40
Uso di GregorianCalendar
• Metodo get– preleva informazioni da un oggetto
– uso di costanti
• Metodo set– modifica lo stato di un oggetto GregorianCalendar
• Metodo add
GregorianCalendar now = new GregorianCalendar();int mese = now.get(Calendar.MONTH);int giorno = now.get (Calendar.DAY_OF_WEEK);
scadenza.set(2001, Calendar.April, 15);
scadenza.add(Calendar.MONTH, 2); //sposta avanti di 2 mesi
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 21
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
41
Alcuni commenti
• Metodi di modifica– cambiano lo stato dell’oggetto (Es. set, add )
• Metodi di accesso– leggono lo stato dell’oggetto (Es. get)
• Convenzione in Java:– i metodi di modifica iniziano con set
– i metodi di accesso iniziano con get
– Esempio: metodo setTime e getTime
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
42
Conversione tra Date e GregorianCalendar
• Conversione da GregorianCalendar a Date
• Conversione da Date a GregorianCalendar
• Maggiori dettagli…– l’esempio CalendarTest.java (pag. 134-136)
– la nota API a pag. 136 del libro
GregorianCalendar now = new GregorianCalendar();Date ora = now.getTime();
GregorianCalendar now = new GregorianCalendar();now.setTime(ora);int anno = now.get(Calendar.YEAR);
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 22
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
43
Costruzioni di classi personalizzate
• Definizioni di classi più complesse– con più metodi e costruttori
– di norma senza il metodo main
• Una convenzione importante (in Java):– si definiscono prima i metodi di una classe
• la sua interfaccia verso l’esterno
– e poi si definiscono i campi (stato) della classe
• Esempio:– definizione di una classe Employee (impiegato)
– con metodi per il nome, il salario (aumenti etc.), data di assunzione etc.
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
44
Definizione di una classe
• In generale:
class NomeDellaClasse {costruttore1 (..)costruttore2 (..)…………metodo1 (..)metodo2 (..)…………campo1
campo2
…………
}
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 23
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
45
Definizione di una classe Employee
import java.util.*; // per Date e Calendarpublic class Employee {// costruttore
public Employee (String n, double s, int year, int month, int day)
{ name = n;salary = s;GregorianCalendar cal =
new GregorianCalendar(year,month-1, day);
hireDay = cal.getTime(); }public String getName () { return name;}private String name;private double salary;private Date hireDay;
}
• Il costruttore– stesso nome della classe– assegna i campi
dell’oggetto che costruisce
• Un metodo di accesso– restituisce il nome
• Campi della istanza– una stringa (Nome)– un double (salario)– data di assunzione– tutti campi privati
Employee.java
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
46
Definizione di una classe EmployeeTest
import java.util.*; public class EmployeeTest {public static void main (String [ ] args) {
Employee[ ] staff = new Employee [ 3 ] ;staff [0]=new Employee (“Gianni”, 30000,
1987, 12, 10); staff [1]=new Employee (“Giorgio”, 35000,
1985, 10, 31); staff [2]=new Employee (“Ugo”, 28000,
2000, 1, 1); for (int i=0; i< staff.length; i++)
System.out.println (“Nome:”+ staff[i].getName() +“ Salario:” + staff[i].getSalary() +“ Assunto:”+ staff[i].getHireDay() );
}
}
• Dichiarazione di array di Employee
• Assegnazione:– uso del costruttore
• Stampa dei dati inseriti– uso di metodi getSalary() e
getHireDay() definiti in maniera simile a getName() (vedi libro)
EmployeeTest.java
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 24
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
47
Compilazione ed esecuzione
C:\> javac Employee.javaC:\> javac EmployeeTest.javaC:\> java EmployeeTestNome:Gianni Salario:30000.0 Assunto:Thu Dec 10 ….Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 ….Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 ….C:\>
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
48
Java è dinamico, vero?
• La classe Employee viene caricata dalla macchina virtuale durante la esecuzione
• Facciamo una prova:– modifichiamo il costruttore in modo da inserire un salario
negativo (il valore negativo del salario passato dal costruttore!)
– ricompiliamo la classe Employee
– eseguiamo senza ricompilare EmployeeTest
– e….
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 25
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
49
Compilazione ed esecuzione
C:\> javac Employee.javaC:\> javac EmployeeTest.javaC:\> java EmployeeTestNome:Gianni Salario:30000.0 Assunto:Thu Dec 10 …Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 …Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 …C:\> javac Employee.javaC:\> java EmployeeTestNome:Gianni Salario:-30000.0 Assunto:Thu Dec 10 …Nome:Giorgio Salario:-35000.0 Assunto:Thu Oct 31 …Nome:Ugo Salario:-28000.0 Assunto:Sat Jan 01 …C:\>
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
50
Compilazione ed esecuzione
C:\> javac Employee.javaC:\> javac EmployeeTest.javaC:\> java EmployeeTestNome:Gianni Salario:30000.0 Assunto:Thu Dec 10 …Nome:Giorgio Salario:35000.0 Assunto:Thu Oct 31 …Nome:Ugo Salario:28000.0 Assunto:Sat Jan 01 …C:\> javac Employee.javaC:\> java EmployeeTestNome:Gianni Salario:-30000.0 Assunto:Thu Dec 10 …Nome:Giorgio Salario:-35000.0 Assunto:Thu Oct 31 …Nome:Ugo Salario:-28000.0 Assunto:Sat Jan 01 …C:\>
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 26
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
51
Una descrizione in UML
«constructor»+Employee(n: String, s:double, year: int,
month: int, day: int)«misc»+ getName() : String+ getSalary() : double+ getHireDay() : Date+ raiseSalary(perCent double)
- name : String- salary : double- hireDay : Date
Employee
«misc»+ main (String [ ] args)
EmployeeTest
Nome della classe
Variabili delle istanze
Metodi delle istanze
Modificatori di accesso
- = privato+ = pubblico
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
52
Alcuni commenti sui costruttori
• Costruttore: metodo con lo stesso nome della classe
• Attenzione:– un costruttore può essere chiamato solamente con
l’operatore new
– una classe può avere più costruttori– un costruttore può accettare zero, uno o più
parametri– un costruttore non restituisce un valore
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 27
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
53
Un tipico errore nei costruttori
• Dove è l’errore?– stiamo oscurando con variabili locali al costruttore i campi
della istanza:
public class Employee {public Employee (String n, double s, int year, int month, int day){ String name = n;
double salary = s;Date hireDay = new GregorianCalendar(year, month-1,day);
}….
private String name;private double salary;private Date hireDay;
}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
54
Il metodo raiseSalary()
• Per poter modificare il salario di un dipendente
• Implementato così:
• Chiamato così:
public class Employee {….public void raiseSalary (double perCent) {
double raise = salary * perCent/100; // calcolo aumentosalary += raise; // aggiorno stipendio
}….
private String name;private double salary;private Date hireDay;
}
Employee e = new Employee (“tizio”, 1000, 1998, 12, 1);e.raiseSalary(5.3);
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 28
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
55
I parametri di raiseSalary()
• Un parametro esplicito(perCent) ed uno implicito (l’oggetto che figura prima della chiamata del metodo)
• Ci si può riferire al parametro implicito con this
public void raiseSalary (double perCent)
e.raiseSalary(5.3);
public class Employee {….public void raiseSalary (double perCent) {
double raise = this.salary * perCent/100; // calcolo aumentothis.salary += raise; // aggiorno stipendio
}…}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
56
L’importanza della privatezza dei dati
• Campi privati (name, salary, hireDay)– accesso esclusivamente attraverso i metodi (pubblici)
• Se si riscontrano errori: – si conosce esattamente quali sono i metodi che modificano i
campi
– che si trovano all’interno della classe
• Si può modifica la implementazione semplicemente modificando i metodi
• Eventuali errori di assegnazione possono essere riconosciuti dai metodi (salario < 0)
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 29
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
57
Un esempio con la classe Employee
• Ricordiamo che:
– il metodo raiseSalary è pubblico
– mentre il campo salary è privato
public class Employee {….public void raiseSalary (double perCent) {
double raise = salary * perCent/100; // calcolo aumentosalary += raise; // aggiorno stipendio
}….
private String name;private double salary;private Date hireDay;
}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
58
Un errore evitato a tempo di compilazione!!
• Sarebbe possibile scrivere in EmployeeTest:
• Morale:– non dichiarare campi istanza pubblici campo
– ma fornire la implementazione di metodi getCampo(), setCampo() per l’accesso al campo
public class EmployeeTest {public static void main (String [ ] args) {
Employee[ ] staff = new Employee [ 3 ] ;….staff[0].raiseSalary(5.3); // ok, accesso con metodo pubblico…. // poi, per errore….staff[0].salary = 1000; // NO! errore IN COMPILAZIONE!
}}
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 30
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
59
Accesso dei metodi ai dati privati
• Una caratteristica sorprendente:– i metodi di un oggetto accedono ai dati privati di tutti gli
oggetti della stessa classe
• Esempio:
– il metodo equals() accede al campo name sia dell’oggetto a cui appartiene sia al campo privatodell’oggetto Employee other
public class Employee {…boolean equals (Employee other) {
return name.equals(other.name);}
…}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
60
Metodi privati
• Pratica di buona programmazione:– I campi istanza sono privati ed i metodi pubblici
• Eccezione:• metodi privati che suddividono il codice in moduli indipendenti
(usati solo da altri metodi della classe)• possibile cambiarlo senza preoccuparsi di chi lo usa: solamente i
metodi della classe lo usano
• Campi di istanza final– tipo di campo in cui il valore assegnato dal costruttore non può essere
cambiato. Esempio: il nome di un impiegatopublic class Employee {
…String final name;
}
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 31
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
61
Organizzazione della lezione
• La programmazione orientata agli oggetti– motivazioni, obiettivi e principi guida della progettazione
• Unified Modeling Language (UML)• Alcune semplici classi
– Uso della classe Date e GregorianCalendar
– Creazione di una nuova classe (Employee)
• Campi e metodi statici• Parametri dei metodi• Costruzione di oggetti ed inizializzazione
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
62
Campi statici
• Una variabile statica (di classe) è una variabile di cui ne esiste solamente una copia per tutta la classe
• Esempio: supponiamo di voler assegnare un campo ID ad ogni impiegato della classe Employee
– aggiungiamo:• una variabile di istanza (per ogni singolo impiegato) id
• una variabile statica (per tutti gli oggetti della classe) nextId che viene inizializzata (1 volta) ad 1.
public class Employee {…private int id;private static int nextId = 1;
}
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 32
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
63
L’uso di campi statici
• Implementiamo un metodo per assegnare l’id:
• Così dopo ogni chiamata di setId() il prossimo dipendente prenderà una nuova id.
public class Employee {…public void setId() {
id = nextId++;}private int id;private static int nextId = 1;
}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
64
La nuova versione di Employee
import java.util.*; public class Employee {
….public void setId() {
id = nextId++;}public int getId (){
return id;}….
// campi delle istanze della classeprivate String name;private double salary;private Date hireDay;private int id;private static int nextId = 1;
}
• Due nuovi metodi:– uno per settare l’Id– l’altro per leggerla
• Il campo id– risulta essere privato:
• accesso solo tramite setId() e getId()
• Il campo nextId– static (unico per tutta la
classe)– viene incrementato ogni
volta che l’id è usato da un impiegato
Employee.java
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 33
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
65
La nuova classe EmployeeTest
import java.util.*; public class EmployeeTest {public static void main (String [ ] args) {
Employee[ ] staff = new Employee [ 3 ] ;staff [0]=new Employee (“Gianni”, 30000,
1987, 12, 10); staff [1]=new Employee (“Giorgio”, 35000,
1985, 10, 31); staff [2]=new Employee (“Ugo”, 28000,
2000, 1, 1); for (int i=0; i< staff.length; i++) {
staff[i].setId();System.out.println (
“Nome:”+ staff[i].getName() +“ Salario:” + staff[i].getSalary() +“ Assunto:”+ staff[i].getHireDay() +“ Id:” + staff[i].getId() );
}}}
• Per ogni staff– setto la ID
– questo fa incrementare nextId (campo statico)
– alla stampa, l’id sarà 1,2,3 per i tre impiegati
EmployeeTest.java
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
66
Costanti statiche
• Le costanti statiche sono abbastanza comuni– classicamente in Math vengono definiti valori utili
• Tipicamente le costanti statiche sono allo stesso tempo public e final:– questo va bene: risultano accessibili solamente in lettura (di
fatto) non essendo modificabili
• Altri esempi di costanti:– la codifica intera dei mesi nella classe Calendar
public class Math {…public static final double PI = 3.14159;
}
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 34
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
67
Metodi statici
• Sono metodi che non operano su oggetti (non hanno parametri impliciti)
• Esempio: i metodi messi a disposizione da Math– Math.pow(x,y)
• Non è necessario chiamare il metodo statico da un oggetto– basta chiamare il metodo con il nome della classe
• I metodi statici possono accedere ai campi statici:public class Employee {
…public static int getNextId() { return nextId; }
}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
68
Metodi statici particolari
• Metodi fabbricatori– metodi che pur non essendo costruttori restituiscono un
oggetto della classe
• Metodo main ()
– permette la esecuzione di un programma associato ad una classe
– spesso utile aggiungere un metodo main ad una classe anche se non si userà perché può servire per testare il comportamento della classe
• esempio: si può aggiungere un main di test a Employee
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 35
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
69
Organizzazione della lezione
• La programmazione orientata agli oggetti– motivazioni, obiettivi e principi guida della progettazione
• Unified Modeling Language (UML)• Alcune semplici classi
– Uso della classe Date e GregorianCalendar
– Creazione di una nuova classe (Employee)
• Campi e metodi statici• Parametri dei metodi• Costruzione di oggetti ed inizializzazione
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
70
Parametri dei metodi
• Passaggio di parametri:– per valore
• il valore del parametro attuale viene copiato nel parametro formale
• le modifiche effettuate dal metodo non hanno effetto sulla variabile passata al metodo (parametro attuale)
– per riferimento • il metodo riceve la locazione di memoria della variabile
• le modifiche effettuate dal metodo sono effettuate sulla variabile passata al metodo (parametro attuale)
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 36
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
71
Il passaggio di parametri in Java
• Poiché le uniche variabili non di riferimento sono quelle dei tipi primitivi:– tutte i passaggi di parametri di variabili di tipo primitivo
sono fatti per valore
– tutti i passaggi di parametri di oggetti sono fatti passando pervalore la variabile riferimento
• (per i puristi) questo non è un passaggio per riferimento….
• ad esempio non si può fare lo swap
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
72
Alcuni metodi statici in EmployeeTest
import java.util.*; public class EmployeeTest {public static void tripleSalary (Employee x) {
x.raiseSalary (200);}
public static void main (String [ ] args) {Employee[ ] staff = new Employee [ 3 ] ;….// creazione dei tre impiegatitripleSalary (staff[1]); // metodo staticofor (int i=0; i< staff.length; i++) {
staff[i].setId();System.out.println (
“Nome:”+ staff[i].getName() +“ Salario:” + staff[i].getSalary() +“ Assunto:”+ staff[i].getHireDay() +“ Id:” + staff[i].getId() );
}}}
• Definizione metodo statico– passaggio di parametri
di una variabile di riferimento
• le modifiche fatte a x sono fatte a staff[1]
• Stampa degli impiegati
EmployeeTest.java
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 37
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
73
L’overloading dei metodi
• È possibile avere più metodi con lo stesso nome– utile per gestire (ad esempio) costruttori diversi
• Come capisce il compilatore quale metodo usare?– ogni metodo ha una sua firma: la sequenza di nome ed il tipo
(e la successione) dei parametri passati
– ad esempio, la classe String ha 4 metodi indexOf
• indexOf (int)• indexOf (int, int)• indexOf (String)• indexOf (String, int)
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
74
Costruttori predefiniti
• Solo senon si costruisce una classe senza costruttori, allora viene fornito (dal compilatore) il costruttore predefinito (senza parametri)– altrimenti si inserisce esplicitamente, se lo si vuole
public class Employee {….public Employee () { // costruttore vuoto}
}
"Programmazione Distribuita" - Prof. Scarano
Laurea in Informatica
A.A. 2002-2003 Università di Salerno 38
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
75
Inizializzazione di campo esplicita
• I campi possono essere esplicitamente inizializzati:
– anche eventualmente con chiamate a metodi della classe:
public class Employee {….private String qualifica = “Impiegato”;
}
public class Employee {….static int assignId() {
int r = nextId++;return r
}…private int id = assignId();
}
Pro
gra
mm
azio
ne D
istr
ibui
ta.
Vi.t
tori
o S
cara
no
76
Blocchi di inizializzazione
• Blocchi di codice inseriti nella classe– eseguiti ogni voltache viene creato un oggetto
public class Employee {….public Employee (String n, double s) {
name = n;salary = s:
}{ // blocco di inizializzazione
id = nextId;nextId++;
}private String name;private double salary;private int id;private static int nextId=1;
}