programmazione orientata agli oggetti in linguaggio java€¦ · 12 23 g. mecca - programmazione...
TRANSCRIPT
03/06/2004
1
G. Mecca – Università della Basilicata – [email protected]
Programmazione Orientataagli Oggetti in Linguaggio Java
Ruoli e Responsabilità:Incapsulamento
versione 2.0Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
(vedi ultima pagina)
2G. Mecca - Programmazione Orientata agli Oggetti
Sommario
m Interfaccia e Implementazionem IncapsulamentomUtilizzo delle ListeðLa Media Pesata
m Il Concetto di “interface”
Ruoli e Responsabilità: Incapsulamento >> Sommario
03/06/2004
2
3G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
m Implementazione di un componenteðcodice sorgente di una classe ðche descrive la natura e le capacità del
componenteðquali sono le sue proprietàðquali sono i suoi metodi e di quali operazioni
si compongonoðquali sono i livelli di visibilità
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
4G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
mCiclo di vita di un componenteðdue fasi principali
mSviluppoðconcepimento (progettazione)ðscrittura e compilazione
mUtilizzoðesecuzione dei metodi all’interno di altri
componenti
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
03/06/2004
3
5G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
m In ciascuna faseðintervengono attori diversi
mSviluppoðsviluppatore del componente
mUtilizzoðsviluppatore dei componenti che utilizzano il
componente in questioneðo, nella nostra metafora: altri componenti che
chiamano metodi del componente
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
6G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
mUn principio fondamentaleði diversi attori hanno prospettive diverse
rispetto allo stesso componente
mPer lo sviluppatore del componenteðsono rilevanti tutti i dettagli relativi
all’implementazione del componenteðtutto il codice sorgente della classe
corrispondente
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
03/06/2004
4
7G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
mPer lo sviluppatore degli altri componentiðla prospettiva è completamente diversaðè rilevante solo l’interfaccia del componente
m Interfaccia del componenteðl’elenco dei servizi che il componente è in
grado di offrire all’esternoðe il modo per utilizzarliðin pratica: tutte le proprietà pubbliche ed i
metodi pubblici del componente
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
8G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
package circonferenze;
public class Circonferenza {
private double ascissaCentro;private double ordinataCentro;private double raggio;
public getLunghezza() {return 2 * raggio * PIGRECO;
}...
}
circonferenze
Circonferenza
instance-of
: Principale
lunghezza circonferenza ?
circonferenze ?
implementazione
interfaccia
double ascissaCentrodouble ordinataCentrodouble raggio
98765 : Circonferenza
double getAscissaCentro()double getOrdinataCentro()double getRaggio()double getLunghezza()double getSuperficie()...
03/06/2004
5
9G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
mMetaforaðinterfaccia: quello che il robot sa fare >> i
compiti che è disponibile a svolgereðquali sono e come è possibile richiederliðimplementazione: tutti i dettagli di come lo fa
>> gli strumenti e le tecniche per svolgere i suoi compitiðcosa conosce e quali passi esegue
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
10G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
mAnalogoðsupponiamo che il nostro omino sia un
idraulicoðalla massaia con la lavatrice rotta interessa
la sua interfaccia, ovvero: “riparami la lavatrice”, “ecco fatto, sono 500 Euro”ðnon le interessa la sua implementazione
(come e con quali strumenti ripara la lavatrice)
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
03/06/2004
6
11G. Mecca - Programmazione Orientata agli Oggetti
Interfaccia e Implementazione
m L’accoppiamento con altri componentiðè strettamente collegato all’interfacciaðgli altri componenti inviano messaggi
riguardanti proprietà e metodi pubbliciðcambiare l’interfaccia richiede di cambiare
anche i componenti accoppiati
mCome scegliere l’interfaccia ?ðin modo da minimizzare l’accoppiamento
Ruoli e Responsabilità: Incapsulamento >> Interfaccia e Implementazione
12G. Mecca - Programmazione Orientata agli Oggetti
Incapsulamento
mNella programmazione a oggettiðquesto corrisponde ad un principio
essenzialem Incapsulamento (“Information Hiding”)ðl’interfaccia di un componente deve essere la
più semplice e piccola possibileðl’implementazione dovrebbe essere il più
possibile nascostaðovvero: usare public il meno possibile
Ruoli e Responsabilità: Incapsulamento >> Incapsulamento
ATTENZIONEal principio
di incapsulamento
03/06/2004
7
13G. Mecca - Programmazione Orientata agli Oggetti
Incapsulamento
mAlcune consuetudini generaliðle proprietà di un componente dovrebbero
essere parte dell’implementazione e NON dell’interfaccia >> privateðtutti i metodi “di servizio” del componente –
metodi non destinati ad essere chiamati dall’esterno NON dovrebbero far parte dell’interfaccia >> private
Ruoli e Responsabilità: Incapsulamento >> Incapsulamento
14G. Mecca - Programmazione Orientata agli Oggetti
Incapsulamento
mAttenzioneðil concetto di incapsulamento è un concetto
generale della programmazioneðvale anche per la programm. procedurale
m La grande differenzaðnella programmazione procedurale è una
disciplina: non è possibile nascondere realmente l’implementazione di una libreriaðnella programmazione a oggetti è un vincolo
Ruoli e Responsabilità: Incapsulamento >> Incapsulamento
03/06/2004
8
15G. Mecca - Programmazione Orientata agli Oggetti
Utilizzo delle Liste
mUn esempio tipicoðla libreria per gestire liste
m Tipicamenteðun’unica interfaccia (inserisci, cancella, ...)ðdue principali implementazioniðimplementazione statica (basata su array e
indicatore di riempimento)ðimplementazione doppiamente collegata
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
16G. Mecca - Programmazione Orientata agli Oggetti
Utilizzo delle Liste
mNella programmazione proceduraleðnon è possibile impedire ai programmatori di
utilizzare direttamente parti dell’implementazioneðesempio: non è possibile nascondere
completamente l’indicatore di riempimentoðquesto rende più difficile sostituire una
versione della libreria con l’altra
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
03/06/2004
9
17G. Mecca - Programmazione Orientata agli Oggetti
Utilizzo delle Liste
m In Javaðdue versioni della listaðjava.util.ArrayList: implementazione basata
su array e indicatore di riempimentoðjava.util.LinkedList: implementazione
doppiamente collegataðle classi hanno la stessa interfacciaðl’implementazione è rigorosamente nascostaðdi conseguenza le classi sono sostituibili
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
18G. Mecca - Programmazione Orientata agli Oggetti
Utilizzo delle Liste
m L’interfaccia comune
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
svuota la listavoid clear()
lista vuotaboolean isEmpty()
dimensioneint size()
cerca l’elemento oint indexOf(Object o)
cambia l’elemento i-esimoObject set(int index, Object element)
elimina in posizioneObject remove(int index)
preleva l’elemento i-esimoObject get(int index)
aggiunge in posizione void add(int index, Object element)
aggiunge in codaboolean add(Object o)
03/06/2004
10
19G. Mecca - Programmazione Orientata agli Oggetti
Utilizzo delle Liste
mUna particolarità delle listeðle liste di java.util contengono
esclusivamente riferimenti ad istanze della classe Object
mAttenzioneðqui sono fortemente coinvolti ereditarietà e
polimorfismoðper ora solo regole meccanicheðper illustrarle: la Media Pesata
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
ATTENZIONEalle particolarità
delle liste
20G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
m Tre classi in it.unibas.mediapesataðPrincipaleðStudenteðEsame
m Inoltreðlo studente deve conoscere i suoi esamiðuna lista di esami universitariðjava.util.ArrayList
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
03/06/2004
11
21G. Mecca - Programmazione Orientata agli Oggetti
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
Principale Studente
it.unibas.mediapesata
12345 : Principaledouble ascissaCentrodouble ordinataCentrodouble raggio
98765 : Calcolatricedouble ascissaCentrodouble ordinataCentrodouble raggio
98765 : CalcolatriceString insegnamentoint votoint creditiboolean lode
98765 : Esame
instance-of
instance-of
Esame
432543 : Studente
ArrayList
java.util
8766 : ArrayList
instance-of
instance-of
22G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
m Le operazioni sulla listaðaggiungi esameðfornisci i dati dell’esame i-esimoðfornisci il numero di esami
mAttenzioneðla classe java.util.ArrayList rappresenta una
lista di riferimenti ad oggetti della classe Object
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
03/06/2004
12
23G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
mRicapitolazione veloceðtutte le classi di Java estendono
implicitamente Object
mRegola n. 1: eredità delle caratteristicheðtutti gli oggetti ereditano i metodi di Object
mRegola n. 2: sostituibilitàðtutti gli oggetti di Java possono essere
considerati anche oggetti di tipo Object
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
24G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
mConseguenze della lista di Objectðla lista può contenere riferimenti ad oggetti
qualunque (qualunque oggetto può essere considerato un Object)ðma ci sono piccole conseguenzeðanche in questo caso le vediamo come
regole meccaniche
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
03/06/2004
13
25G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
mRegola n. 1: inserimento in una listaðil riferimento da inserire viene “trasformato”
in un riferimento ad Object (es: rif. ad Esame)ðnon cambia il suo valore
mRegola n. 2: prelevamento dalla listaðil riferimento deve essere “ritrasformato” in
un riferimento del tipo originale attraverso un cast (es: Esame)ðanche in questo caso non cambia il valore
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
26G. Mecca - Programmazione Orientata agli Oggetti
Media Pesatapackage it.unibas.mediapesata;public class Studente {
private String nome; private String cognome; private int matricola;private java.util.ArrayList esami = new java.util.ArrayList();
public void addEsame(Esame esame) {this.esami.add(esame);
}
public Esame getEsame(int i) {return (Esame)this.esami.get(i);
}
public int getNumeroEsami() {return this.esami.size();
}
...
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
il riferimento all’Esame viene trasformato in un rif. a Object: un oggetto di tipo Esame è anche un oggetto di tipo Object
il metodo get restituisce un riferimento ad un Object; il castè necessario per trasformarloin un riferimento ad un Esame
03/06/2004
14
27G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
[0][1][2]...
567 : Object[]
String insegnamentoint votoboolean lodeint crediti
98765 : Esame
2348
String nomeString cognomeint matricolaArrayList esami
948 : Studente
...
1270
...
...
98765
5544
String insegnamentoint votoboolean lodeint crediti
2348 : Esame
String insegnamentoint votoboolean lodeint crediti
5544 : Esame
Object[] valoriint indicatore
1270 : java.util.ArrayList
567
3
28G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
m In realtà peròðle implementazioni dei vari componenti sono
nascoste al loro interno (incapsulamento)
m InfattiðStudente si basa esclusivamente sull’interfaccia di
java.util.ArrayList (add(), get(), size())ðPrincipale si basa esclusivamente sull’interfaccia di
Studente per la gestione della lista di esami (addEsame(), getEsame(), getNumeroEsami())
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
03/06/2004
15
29G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
[0][1][2]...
1270 : java.util.ArrayList
2348
String nomeString cognomeint matricolaArrayList esami
948 : Studente
...
1270
...
...
98765
5544
boolean add(Object o)void add(Object o, int pos)void remove(int pos)int indexOf(Object o)int size()...
- lo studente “vede” solo l’interfaccia della lista, e non vede i dettagli della sua implementazione (tipo di rappresentazione)- Principale vede solo l’interfaccia dello studentee non i dettagli dell’implementazione (tipo di lista)
111 : Principalevoid addEsame(Esame e)Esame getEsame(int i)int getNumeroEsami()...
30G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
mVantaggi dell’incapsulamentoðè possibile cambiare il tipo di listaðper esempio per ragioni di prestazioniðil resto dell’applicazione non è influenzata
package it.unibas.mediapesata;public class Studente {
private String nome; private String cognome; private int matricola;private java.util.LinkedList esami = new java.util.LinkedList();
// il resto del codice della classe resta uguale
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
>> Studente.java
03/06/2004
16
31G. Mecca - Programmazione Orientata agli Oggetti
Media Pesata
Ruoli e Responsabilità: Incapsulamento >> Utilizzo delle Liste
le implementazioni cambiano completamentema non cambiano le interfacce – l’accoppiamento è minimo
[0][1][2]...
1270 : java.util.LinkedList
2348
String nomeString cognomeint matricolaArrayList esami
948 : Studente
...
1270
...
...
98765
5544
boolean add(Object o)void add(Object o, int pos)void remove(int pos)int indexOf(Object o)int size()...
111 : Principalevoid addEsame(Esame e)Esame getEsame(int i)int getNumeroEsami()...
32G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
m In sintesiðdato un componente, i componenti che ne
utilizzano i servizi dipendono esclusivamente dalla sua interfaccia e non dalla sua implementazioneðè possibile cambiare l’implementazione
senza influenzare gli altri componenti dell’applicazioneðpurchè l’interfaccia resti uguale
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
03/06/2004
17
33G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
mDi conseguenzaðè possibile vedere la questione
dell’incapsulamento da due punti di vistamDa una parteðun componente è completamente libero di
scegliere la sua implementazionemD’altra parteðè impegnato nei confronti di altri componenti
a mantenere inalterata la sua interfaccia
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
34G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
mNei linguaggi a oggettiðè possibile vincolare una classe di oggetti a
fornire una certa interfacciaðattraverso le “interface”
m Interfaceðstrumento per definire l’interfaccia di un
componenteðelenco di prototipi di metodi che il
componente si impegna ad implementare
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
03/06/2004
18
35G. Mecca - Programmazione Orientata agli Oggetti
Un Esempio: java.util.Listpackage java.util;
public interface List {
boolean isEmpty();void clear();Object get(int index);Object set(int index, Object element);boolean add(Object o);void add(int index, Object element);Object remove(int index);int indexOf(Object o);int lastIndexOf(Object o);int size();...
}
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
Attenzione: si tratta di unaversione semplificata della
vera java.util.List
NOTA: i metodi elencatinelle interface sono
considerati automaticamentepubblici
36G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
mUna classeðpuò impegnarsi ad implementare
un’interfacciaðdichiarandolo esplicitamente con la clausola
implements
mEsempioðpublic class ArrayList implements List {...}ðpublic class LinkedList implements List {...}
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
03/06/2004
19
37G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
m In questo casoðla classe si impegna a fare in modo che i
suoi oggetti implementino i metodi dell’interfaccia
mChe cosa vuol dire ?ðche dovranno, ad esempio, necessariamente
fornire un metodo pubblico int size()ðnon possono non implementarloðoppure implementarlo con un nome diverso
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
38G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
mMetaforaðuna interface è un “contratto” tra la classe ed
il resto del mondoðovvero una sorta di “specifica tecnica” sul
funzionamento dei robotðla classe si impegna a che gli oggetti che
fabbricherà avranno certe caratteristicheðe cioè saranno in grado di effettuare certi
compiti
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
03/06/2004
20
39G. Mecca - Programmazione Orientata agli Oggetti
Il Concetto di “interface”
m In questo modoðè possibile garantire la reale sostituibilità tra
componenti che implementano la stessa “interface”ðes: ArrayList e LinkedList
Ruoli e Responsabilità: Incapsulamento >> Il Concetto di interface
40G. Mecca - Programmazione Orientata agli Oggetti
Riassumendo
m Interfaccia e Implementazionem IncapsulamentomUtilizzo delle ListeðLa Media Pesata
m Il Concetto di “interface”
Ruoli e Responsabilità: Incapsulamento >> Sommario
03/06/2004
21
41G. Mecca - Programmazione Orientata agli Oggetti
Termini della Licenza
Termini della Licenza
m 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.
m Questo lavoro viene concesso in uso secondo i termini dellalicenza “Attribution-ShareAlike” di Creative Commons. Per ottenereuna copia della licenza, è possibile visitarehttp://creativecommons.org/licenses/by-sa/1.0/ oppure inviare unalettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.