La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Primi principi della OOP Incapsulamento, information hiding, overloading.

Presentazioni simili


Presentazione sul tema: "Primi principi della OOP Incapsulamento, information hiding, overloading."— Transcript della presentazione:

1 Primi principi della OOP Incapsulamento, information hiding, overloading

2 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

3 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

4 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

5 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).

6 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

7 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

8 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.

9 Giovanna Correddu - 05/04/2011 Esempio Classe Automobile Proprietà marca modello colore alimentazione numero porte cilindrata targa ………..Metodi avviati accelera cambia (numero marcia) frena fermati sterza (direzione) ……. Istanza1 miaAutoProprietà marca="Fiat" modello="Punto" colore="verde" alimentazione="ben zina" numero porte=5 cilindrata=1300 targa="....."Istanza2 tuaAutoProprietà marca="Opel" modello="Astra" colore="rosso" alimentazione="dies el" numero porte=5 cilindrata=1800 targa="....."

10 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).

11 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.

12 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

13 Giovanna Correddu - 05/04/2011 Linguaggio naturaleEquivalente Object OrientedRisposta corretta Nomi concretiOggetti (entità del dominio)Red, Toby Nomi astrattiClassi (generalizzazione di oggetti di uno stesso tipo) Animale VerbiMetodi o funzioni membro si muove, ha fame, mangia, fa versi ProprietàAttributinome, colore, età Valori delle proprietàStatonome=Red colore=rosso età=3 nome=Toby colore=grigio età=4

14 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.

15 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.

16 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()

17 Giovanna Correddu - 05/04/2011 Esempio: classe Auto class Auto { // nome classe String marca; //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; }

18 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() }

19 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

20 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

21 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)

22 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.

23 Giovanna Correddu - 05/04/2011 Modello dei dati incapsulato

24 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

25 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

26 Giovanna Correddu - 05/04/2011 Visibilità della classe

27 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)

28 Giovanna Correddu - 05/04/2011 Classe incapsulata privatipubblici 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.

29 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

30 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.

31 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

32 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.

33 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.

34 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!

35 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.

36 Giovanna Correddu - 05/04/2011 Definizione di classe senza rispettare il principio dell'incapsulamento Classe Auto (senza rispettare il principio dell’incapsulamento)Classe TestAuto 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; } 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(); }

37 Giovanna Correddu - 05/04/2011 Classe Auto incapsulataClasse TestAuto class Auto { private String marca; private String modello; private int cil; private int carburante; public Auto(){ // costruttore carburante=0; } public void avviati(){ System.out.println("mi sono avviata"); } public void rifornimento(int Carb) { 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); } 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

38 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

39 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.

40 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

41 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


Scaricare ppt "Primi principi della OOP Incapsulamento, information hiding, overloading."

Presentazioni simili


Annunci Google