Presentazione principi oop

35
Principi della OOP Incapsulamento, information hiding, overloading

description

Introduzione ai principi della oop

Transcript of Presentazione principi oop

Principi della OOP

Incapsulamento, information hiding, overloading

Giovanna Correddu - 05/04/2011

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

EsempioClasse Classe Automobile Automobile Proprietà Proprietà

marcamodellocolorealimentazionenumero portecilindratatarga………..

Metodi Metodi avviatiacceleracambia (numero marcia)frenafermati sterza (direzione)…….

Istanza1Istanza1 miaAuto

Proprietà Proprietà marca="Fiat"modello="Punto"colore="verde" alimentazione="benzina"numero porte=5cilindrata=1300targa="....."

Istanza2Istanza2 tuaAuto

Proprietà Proprietà marca="Opel"modello="Astra"colore="rosso" alimentazione="diesel"numero porte=5cilindrata=1800targa="....."

Giovanna Correddu - 05/04/2011

Test

Fido e Pluto sono cani. Quale è l’oggetto e quale è la classe? Perché?

RispostaFido 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 latoComportamento / Metodi calcolaArea calcolaPerimetroIstanza / 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=Redcolore=rossoetà=3 nome=Tobycolore=grigioetà=4  

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 classeLa costruzione di una classe avviene in due fasi: Dichiarazione o definizione della sua parte

privata e pubblica (attributi e metodi) Implementazione dei metodiLa 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 privatiprivati + metodi pubblicipubblici

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'incapsulamentoClasse Auto (senza rispettare il principio dell’incapsulamento)

Classe TestAuto

class Auto { public String marca; public String modello; public int cil; private int serbatoio;

public Auto(){ // costruttore serbatoio=0;

} public void avviati(){

System.out.println("mi sono avviata");

} public void rifornimento(int Carb) {

serbatoio=serbatoio+Carb; } }

public class Test { public static void main(String args[]){

Auto miaAuto; // dichiarazione //creazione auto 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

Classe Auto incapsulata Classe TestAutoclass Auto {

private String marca; private String modello; private int cil; private int serbatoio;

public Auto(){ // costruttore serbatoio=0;

} public void avviati(){

System.out.println("mi sono avviata"); } public void rifornimento(int Carb) {

serbatoio=serbatoio+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("serbatoio= "+serbatoio);

} }

public class Test { public static void main(String args[]){

Auto miaAuto; // dichiarazione //creazione auto miaAuto=new Auto();

// accesso diretto agli attributi miaAuto.setMarca("Fiat"); miaAuto.setModello("Punto"); miaAuto.setCilindrata(1100); miaAuto.rifornimento(40); miaAuto.mostraDati();

}

}

Definizione di classe rispettando il principio dell'incapsulamento

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 overloadingpublic 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