Primi principi della OOP
Incapsulamento, information hiding, overloading
Origini e sviluppo OOP
Nasce come risposta a tutti i problemi legati alla
produzione di programmi complessi che le tecniche di
progettazione tradizionale di tipo procedurale non
avevano risolto
Punti distintivi:
 Considerare modelli di dati e algoritmi
simultaneamente e non più in modo separato
 Consentire il riutilizzo di software già sviluppato nelle
nuove applicazioni
 Descrive la realtà mediante modelli di dati “vicini” al
modo naturale di pensare dell’uomo

Giovanna Correddu - 05/04/2011
Evoluzione
Anni ‘60:

Con i primi studi sull’intelligenza artificiale compare il principio che l’uomo
sviluppa il proprio pensiero logico utilizzando oggetti
Anni ‘70:

Alan Kay crea il primo linguaggio object oriented, Smalltalk, che sviluppa a
livello di codifica il concetto di oggetto
Anni ’80

Le nuove tecniche si diffondono con C++ e con Visual Basic
Anni ‘90:

Java
Giovanna Correddu - 05/04/2011
Applicazioni OOP
Attualmente le tecniche OO sono molto diffuse
nelle seguenti applicazioni:
 Gestione di basi di dati
 Gestione di interfacce grafiche
 Sistemi multimediali (gestione di immagini, testi,
animazioni, suoni e video)
 Applicazioni per reti di calcolatori
Giovanna Correddu - 05/04/2011
Progettazione procedurale e OO
Il progetto è formato dal modello
dei dati e dall’algoritmo risolutivo
Il progetto si presenta come un insieme
di classi di oggetti che incapsulano al
loro interno sia i modelli dei dati che le
operazioni (metodi).
Giovanna Correddu - 05/04/2011
Classe di oggetti





Nella programmazione OO, una applicazione è composta
da un insieme di CLASSI che rappresentano OGGETTI del
mondo reale che interagiscono tra di loro.
Una classe è una astrazione (idea astratta o modello) che
definisce un insieme di OGGETTI di uno stesso tipo, ovvero
una famiglia di oggetti aventi caratteristiche e
comportamenti simili
la classe è costituita da attributi e metodi
gli attributi indicano le caratteristiche o proprietà che
distinguono ogni esemplare della classe
I metodi sono le funzionalità dell’oggetto, cioè i comandi
che possono essere impartiti ad ogni esemplare della classe
Giovanna Correddu - 05/04/2011
Classi, attributi e metodi


Classe: Automobile (entità astratta, modello generico di
automobile);
ogni automobile è caratterizzata da un colore, da una marca,
da un modello, da una cilindrata,.....: sono gli attributi della
classe
ogni automobile può avviarsi, fermarsi, sterzare, accelerare,
etc... : sono i metodi della classe
Giovanna Correddu - 05/04/2011
Oggetto o istanza






“la mia auto” , "la tua auto", "l'auto del presidente", sono esemplari della
classe Automobile
presentano tutte le medesime proprietà e i medesimi comportamenti: hanno
un colore, un modello, una marca, una cilindrata, si avviano, si fermano,
sterzano, accelerano, ecc....
si dice che la classe è il modello (blueprint), lo stampino degli oggetti.
un'istanza (o oggetto) di una classe corrisponde ad un esemplare reale,
fabbricato da quel modello (da quello stampino)
ogni istanza della classe ha caratteristiche e comportamenti comuni, ma si
differenzia per i valori assunti dalle sue proprietà. Tutte le automobili
hanno una marca, un modello, un colore, una cilindrata e possono avviarsi,
frenare, sterzare, ecc.., ma la cilindrata, il colore, la marca e il modello
variano da oggetto ad oggetto
In ogni istanza le proprietà assumono valori.
Giovanna Correddu - 05/04/2011
Esempio
Classe Automobile Istanza1
Istanza2
Proprietà
marca
modello
colore
alimentazione
numero porte
cilindrata
targa
………..
Metodi
avviati
accelera
cambia (numero
marcia)
frena
fermati
sterza (direzione)
…….
miaAuto
tuaAuto
Proprietà
marca="Fiat"
modello="Punto"
colore="verde"
alimentazione="ben
zina"
numero porte=5
cilindrata=1300
targa="....."
Proprietà
marca="Opel"
modello="Astra"
colore="rosso"
alimentazione="dies
el"
numero porte=5
cilindrata=1800
targa="....."
Giovanna Correddu - 05/04/2011
Test

Fido e Pluto sono cani. Quale è l’oggetto e quale è la
classe? Perché?
Risposta
Fido e Pluto sono oggetti (o istanze) della classe
Cane; hanno stato diverso (ad esempio nome diverso,
età diversa, colore diverso, razza diversa) e
comportamento uguale (stessi metodi: corre, abbaia,
salta, azzanna, mangia).
Giovanna Correddu - 05/04/2011
Metodi, attributi e stato
Classe Quadrato
 un quadrato è caratterizzato da un lato; del quadrato
possiamo calcolare l'area e il perimetro
Proprietà / Attributi
 lato
Comportamento / Metodi
 calcolaArea
 calcolaPerimetro
Istanza / Oggetto
 alla classe Quadrato appartengono oggetti concreti che si
differenziano per la misura del lato.
Giovanna Correddu - 05/04/2011
Attività di lettura


Considera il seguente testo in linguaggio naturale
Red e Toby sono animali. Entrambi mangiano quando
hanno fame, si muovono e fanno versi. Red ha il
mantello rosso e ha 3 anni ; Toby ha il mantello
grigio e ha 4 anni.
Individuare classi, oggetti, metodi , attributi e stato
Giovanna Correddu - 05/04/2011
Linguaggio naturale
Equivalente Object Oriented
Risposta corretta
Nomi concreti
Oggetti (entità del dominio)
Red, Toby
Nomi astratti
Classi (generalizzazione di
oggetti di uno stesso tipo)
Animale
Verbi
Metodi o funzioni membro
si muove, ha fame, mangia, fa
versi
Proprietà
Attributi
nome, colore, età
Valori delle proprietà
Stato
nome=Red
colore=rosso
età=3
nome=Toby
colore=grigio
età=4
Giovanna Correddu - 05/04/2011
Creazione di istanze e costruttori






La creazione di un oggetto (o esemplare) a partire da una classe è
chiamata istanziazione o creazione di un'istanza della classe.
Gli oggetti sono creati per mezzo di metodi speciali chiamati
costruttori.
Il costruttore ha lo stesso nome della classe e non ritorna niente.
Possono esserci più costruttori per una classe a patto che prendano
parametri diversi
Se non viene dichiarato nessun costruttore ne viene creato
automaticamente uno che inizializza tutti i campi con valori di
default e non riceve argomenti. Si chiama costruttore di default
L'oggetto può essere creato all'interno di un'altra classe oppure del
main.
Giovanna Correddu - 05/04/2011
Operatore new





In Java si distingue tra la dichiarazione di una istanza e la
sua vera e propria creazione, che avviene per mezzo di un
operatore che si chiama new che alloca in memoria un
nuovo oggetto del tipo richiesto
Per esempio se in Java devo creare un'istanza della classe
Automobile scriverò:
Automobile miaAuto; // dichiarazione: miaAuto identifica un
esemplare di Automobile
miaAuto=new Automobile(); // creazione: con l'operatore
new creo un nuovo esemplare di automobile e lo associo a
miaAuto
miaAuto è il riferimento (puntatore o reference) all'oggetto
di classe Automobile istanziato.
Giovanna Correddu - 05/04/2011
Riferimento



Dopo aver creato un oggetto si possono usare o modificare i suoi attributi o
eseguire delle operazioni richiamando i suoi metodi.
Per fare riferimento agli attributi di un oggetto si utilizzerà la seguente sintassi,
basata sulla notazione puntata (dot notation):
miaAutomobile.colore indica il colore della mia automobile Per assegnare un valore
all'attributo colore (o per modificarlo) scrivo miaAutomobile.colore="verde"; N.B.:
in Java miaAutomobile è una variabile riferimento ad un oggetto di classe
Automobile, non è l'oggetto stesso! Per far eseguire un'azione all'oggetto utilizzerò
ancora la notazione puntata richiamando uno dei metodi nel seguente modo:

miaAutomobile.avviati() per avviare l’auto

miaAutomobile.cambia(4) per inserire la quarta

Generalizzando, scriverò:

riferimentoOggetto.attributo

riferimentoOggetto.metodo()
Giovanna Correddu - 05/04/2011
Esempio: classe Auto
class Auto {
String marca;
// nome classe
//definizione attributi
String modello;
int cil;
int carburante;
Auto(){
// definizione costruttore
carburante=0;
}
void avviati(){
//definizione metodo avviati (non ha parametri né restituzione)
System.out.println("mi sono avviata");
}
void rifornimento(int carb) {
// metodo rifornimento (con paremetro quantità di carburante)
carburante=carburante+carb;
}}
Giovanna Correddu - 05/04/2011
Creare istanze
La seguente classe TestAuto crea un’istanza di auto e testa alcuni metodi
public class TestAuto {
public static void main(String args[]){
Auto miaAuto;
// dichiarazione riferimento ad Auto
miaAuto=new Auto();
//creazione istanza
miaAuto.marca="Fiat"; // accede agli attributi utilizzando il riferimento
miaAuto.modello ="Punto";
miaAuto.cil=1100;
miaAuto.rifornimento(40); //chiama il metodo rifornimento
System.out.println("marca "+miaAuto.marca); //accede agli attributi per mostrare il valore
System.out.println("modello= "+miaAuto.modello);
System.out.println("cilindrata= "+miaAuto.cil);
miaAuto.avviati();
//chiama il metodo avviati()
}}
Giovanna Correddu - 05/04/2011
Accedere agli attributi

Nell’esempio appena visto chi scrive la classe TestAuto che
utilizza la classe Auto, modifica il valore degli attributi
scrivendo:
miaAuto.marca="Fiat";
miaAuto.modello ="Punto";
miaAuto.cil=1100;


Questo non è un buon modo di programmare: è come se il
programmatore “aprisse” l’oggetto auto e vi “mettesse le mani
dentro”
Nella realtà chi utilizza un oggetto, “non lo apre” e può non
conoscerne i dettagli implementativi
Giovanna Correddu - 05/04/2011
Incapsulamento





L'incapsulamento è la proprietà per cui un oggetto contiene
("incapsula") al suo interno gli attributi (dati) e i metodi (procedure)
che accedono ai dati stessi.
i dati (attributi) di un oggetto possono essere manipolati solo
attivando i suoi metodi
un metodo è attivato dall’oggetto a fronte di una specifica richiesta
di servizio (messaggio)
solo l’interfaccia pubblica dell’oggetto, costituita dai servizi che
l’oggetto può offrire, è nota all’esterno
si comunica con un oggetto inviandogli un messaggio in cui si
specifica che cosa si vuole da esso
Giovanna Correddu - 05/04/2011
Visibilità
Gli attributi e i metodi possono essere
---> pubblici visibili/accessibili direttamente dall'esterno ----> costituiscono
l'interfaccia pubblica dell'oggetto
---> privati non sono visibili/accessibili all'esterno --->information hiding
(occultamento delle informazioni)
Ogni classe di ha due livelli, uno esterno (pubblico) ed uno interno (privato)
Livello esterno o interfaccia pubblica

Metodi e attributi visibili all’esterno, definisce i servizi che l’oggetto può
fornire
Livello interno o privato

definisce le proprietà dell’oggetto (i dati) e le modalità di trattamento di
questi dati (implementazione dei metodi)
Giovanna Correddu - 05/04/2011
Information hiding


Nella programmazione orientata agli oggetti è
buona regola occultare gli attributi (lo stato degli
oggetti) rendendoli privati e dare accesso ai dati
solo attraverso i metodi pubblici . L'occultamento
prende il nome di Information hiding.
Information hiding e incapsulamento sono due
concetti distinti, ma strettamente legati.
Giovanna Correddu - 05/04/2011
Modello dei dati incapsulato
Giovanna Correddu - 05/04/2011
Dichiarazione e implementazione di
una classe
La costruzione di una classe avviene in due fasi:
 Dichiarazione o definizione della sua parte privata e
pubblica (attributi e metodi)
 Implementazione dei metodi
La visione di una classe è diversa per:
 Progettisti, che vedono anche l’implementazione interna
della classe
 Utenti (altri progettisti e programmatori), che sono
interessati solo all’interfaccia pubblica, con la
dichiarazione delle intestazioni dei metodi
Giovanna Correddu - 05/04/2011
Vantaggi interfaccia pubblica
Grazie all’interfaccia, gli utenti sono in grado di
utilizzare gli oggetti di una classe per:
 impostare e recuperare il valore degli attributi
 richiamare i metodi
Giovanna Correddu - 05/04/2011
Visibilità della classe
Giovanna Correddu - 05/04/2011
Vantaggi incapsulamento


L'incapsulamento nasconde i dettagli implementativi, impedisce di
falsare lo stato dell'oggetto con dei valori non ammessi
I valori delle variabili possono essere cambiati solo dall’oggetto e
non dall'esterno.
L’incapsulamento soddisfa le seguenti esigenze:



programmazione molto disciplinata, a vantaggio del riuso e della
manutenzione
il bisogno di modularità
la necessità di distinguere nettamente tra definizione e
implementazione di un servizio (metodo)
Giovanna Correddu - 05/04/2011
Classe incapsulata
Classe incapsulata =
attributi privati + metodi pubblici
I vantaggi principali portati dall'incapsulamento sono:
robustezza, indipendenza e l'estrema riusabilità
degli oggetti creati. Inoltre la sua manutenzione
risulterà più semplice al programmatore.
Giovanna Correddu - 05/04/2011
Esempio
Se non dichiaro privato l'attributo 'nome' della
classe Animale, il suo contenuto può essere
cambiato facilmente senza nessun controllo.
Animale fido = new Animale(“Fido”);
fido.nome = “Ralph"; // ma non era Fido??
 Questa è una violazione dell'incapsulamento. Non
abbiamo adeguatamente nascosto la variabile
nome da modifiche arbitrarie

Giovanna Correddu - 05/04/2011
La black box



L’incapsulamento permette di vedere l'oggetto come una black-box, cioè
una scatola nera della quale conosciamo l'interfaccia e sappiamo cosa fa,
ma non come lo fa. All'interno della scatola nera sono occultati tutti i suoi
meccanismi segreti.
Ciò è quello che avviene anche nella realtà. Si pensi ad oggetti comuni
quali videogame, computer e automobile: noi non vediamo cosa c'è al loro
interno, ma possiamo utilizzarli e interagire con essi.
Per es. noi utilizziamo e guidiamo l'oggetto auto senza sapere come essa è
fatta al suo interno, ma agendo su di essa attraverso leve, pulsanti, pedali,
pulsanti che costituiscono l'interfaccia tra l'oggetto e noi e che ci consentono
di attivare tutte le sue funzionalità. Allo stesso modo richiamiamo le diverse
funzioni del nostro computer col mouse attraverso un'interfaccia grafica.
Giovanna Correddu - 05/04/2011
Il videogame
Noi usiamo il videogame schiacciando dei pulsanti
che attivano funzioni: conosciamo e utilizziamo solo
la sua interfaccia
pubblica
Giovanna Correddu - 05/04/2011
Il telefono




Se volessimo fare un altro esempio potremmo prendere in
considerazione un telefono.
La maggior parte degli utenti, infatti, sa utilizzare il
telefono, ma ne ignora il funzionamento interno.
Chiunque può alzare la cornetta, comporre un numero
telefonico e conversare con un'altra persona, ma pochi
conoscono in dettaglio la sequenza dei processi scatenati da
queste poche, semplici azioni.
Evidentemente, per utilizzare il telefono, non è necessario
prendere una laurea in telecomunicazioni: basta conoscere
la sua interfaccia pubblica (costituita dalla cornetta e dai
tasti), non la sua implementazione interna.
Giovanna Correddu - 05/04/2011
Conto Corrente Bancario




Per fare un altro esempio pensiamo ad un conto bancario.
Le informazioni utili (le proprietà) potranno essere rappresentate
da: numero di conto, saldo, nome del cliente, indirizzo, tipo di conto,
tasso di interesse e data di apertura.
Le azioni che operano su tali informazioni (i metodi) saranno, invece:
apertura, chiusura, versamento, prelevamento, cambio tipologia
conto, cambio cliente e cambio indirizzo. L'oggetto Conto
incapsulerà queste informazioni e azioni al suo interno. Noi
possiamo modificare lo stato del conto (il saldo, per es.) attraverso
l'operazione (metodo) di prelevamento o di versamento, e tutto
questo senza accedere mai direttamente alla cassaforte della
banca.
Allo stesso modo è possibile interagire con l'oggetto attraverso la
sua interfaccia pubblica, costituita da metodi pubblici.
Giovanna Correddu - 05/04/2011
Implementazione e segnatura


L'implementazione dei metodi, ovvero il loro codice,
è sempre nascosta; può essere visibile solo
l'interfaccia, ovvero la firma o segnatura (la
definizione).
Allo stesso modo quando avviamo l'automobile
dobbiamo solo sapere quale chiave girare, ma
tutto ciò che accade dopo non lo vediamo e
possiamo guidare l'auto anche ignorandolo!
Giovanna Correddu - 05/04/2011
Implementazione dell’incapsulamento



Come già detto, a livello di implementazione, si ottiene
l'incapsulamento semplicemente dichiarando privati gli
attributi di una classe e quindi inaccessibili fuori dalla classe
stessa. A tale scopo Java introduce il modificatore di
metodo private.
L'accesso ai dati potrà essere fornito da un'interfaccia
pubblica costituita da metodi dichiarati public e quindi
accessibili da altre classi.
Se l'incapsulamento è gestito in maniera intelligente, le
nostre classi potranno essere utilizzate nel modo migliore e
più a lungo, giacché le modifiche e le revisioni potranno
riguardare solamente parti di codice non visibili all'esterno.
Giovanna Correddu - 05/04/2011
Definizione di classe senza rispettare il principio dell'incapsulamento
Classe Auto (senza rispettare il principio
dell’incapsulamento)
class Auto {
public String marca;
public String modello;
public int cil;
private int carburante;
public Auto(){
carburante=0;
}
public void avviati(){
System.out.println("mi sono avviata");
}
public void rifornimento(int Carb)
{
Carburante=carburante+Carb;
}
}
Classe TestAuto
public class Test {
public static void main(String args[]){
Auto miaAuto;
miaAuto=new Auto();
// accesso diretto agli attributi
miaAuto.marca="Fiat";
miaAuto.modello ="Punto";
miaAuto.cil=1100;
miaAuto.rifornimento(40);
System.out.println("marca
"+miaAuto.marca);
System.out.println("modello=
"+miaAuto.modello);
System.out.println("cilindrata=
"+miaAuto.cil);
miaAuto.avviati();
}
}
Giovanna Correddu - 05/04/2011
Definizione di classe rispettando il principio dell'incapsulamento
Classe Auto incapsulata
Classe TestAuto
class Auto {
public class Test {
private String marca;
public static void main(String args[]){
private String modello;
Auto miaAuto; // dichiarazione
private int cil;
//creazione auto
private int carburante;
miaAuto=new Auto();
public Auto(){ // costruttore
carburante=0;
}
// accesso diretto agli attributi
public void avviati(){
miaAuto.setMarca("Fiat");
System.out.println("mi sono avviata");
miaAuto.setModello("Punto");
}
miaAuto.setCilindrata(1100);
public void rifornimento(int Carb)
miaAuto.rifornimento(40);
{
miaAuto.mostraDati();
carburante=carburante+Carb;
}
}
//metodi per l'accesso agli attributi privati
}
public void setMarca(String m){
marca=m;
}
public void setModello(String m){
modello=m;
}
public void setCilindrata(int c){
cil=c;
}
public void mostraStato(){
System.out.println("marca "+marca);
System.out.println("modello= "+modello);
System.out.println("cilindrata= "+cil);
System.out.println(“carburante= "+carburante);
}}
Giovanna Correddu - 05/04/2011
Overloading
Consente di avere più metodi con definizione e
implementazione diversa, ma con lo stesso nome
Esempio:
 Immaginiamo di avere una classe Cane e una classe
Gatto. Nella classe Cane possiamo definire i metodi

void insegue (Cane c)
oppure
void insegue (Gatto g)
I due metodi hanno stesso nome, ma diversa segnatura
(cambia il tipo del parametri) e implementano due
comportamenti diversi dello stesso animale
Giovanna Correddu - 05/04/2011
L’operatore “+”
Pensiamo ad un operatore aritmetico che ci è molto
familiare: il “+”, ovvero l’operatore di somma.
 la somma può essere fatta su tipi diversi, numeri interi,
numeri in virgola mobile e perfino stringhe (in questo
caso avremo la concatenazione)
 si tratta di operazioni diverse, su domini diversi, che
presentano però notevole similitudine concettuale in
quello che fanno, per cui noi le indichiamo con lo stesso
nome
In realtà l'uomo è abituato a pensare per similitudini, per
cui l'overloading degli operatori, si rivelano un utile
meccanismo.
Giovanna Correddu - 05/04/2011
L’istruzione println




Un altro esempio di overload riguarda il metodo che in Java
prende il nome di println() (ma ci sono istruzioni analoghe in tutti i
linguaggi)
Esistono almeno una decina di metodi println() diversi.
È possibile passare al metodo non solo stringhe, ma anche interi,
boolean, array di caratteri o addirittura Object.
Anche in questo caso si tratta di metodi diversi con stesso nome e
notevoli analogie. Il loro uso ci viene naturale e non ci piacerebbe
certo se il linguaggio di programmazione a nostra disposizione ci
costringesse ad utilizzare per fare operazioni simili molteplici metodi
diversi come, per esempio:



printIntero() per stampare interi
printReale() per visualizzare numeri reali
printString() per visualizzare dati di tipo String
Giovanna Correddu - 05/04/2011
Esempio di implementazione di
overloading
public class Matematica{
………………….
public int somma(int a, int b) { // somma interi e restituisce un intero
return a + b;
}
public float somma(float a, float b) { // somma reali e restituisce un relae
return a + b;
}
……………………………………
}
Quale metodo sarà utilizzato?

Dipende dal tipo di parametri che verranno passati al momento della
chiamata
Giovanna Correddu - 05/04/2011
Scarica

dispensa