Il paradigma a oggetti La programmazione ad oggetti Il progetto del software Obiettivo della progettazione: produrre software con le caratteristiche di qualità che sono state definite nella fase di analisi e specifica dei requisiti. Caratteristiche fondamentali per garantire la qualità del software e ridurre i costi e i tempi di produzione: Affidabilità Modificabilità: un programma utile deve poter essere modificato Comprensibilità: facilità di interpretazione del codice Riusabilità: poter riutilizzare un’applicazione o una sua parte comporta dei vantaggi nella riduzione dei tempi e costi di sviluppo e consente di utilizzare una parte di software già testato Il paradigma ad oggetti 2 Programmazione orientata agli oggetti Basata sul concetto di astrazione dei dati. Si focalizza l’attenzione su categorie concettuali dei dati del dominio applicativo. Costruire il programma in termini di “entità”, rappresentate da una struttura dati interna nascosta operazioni che possono agire sui dati Vantaggi: •Agevola la modularità •Favorisce il controllo sull’integrità dei dati (solo certe funzioni possono agire sui dati) •Favorisce la creazione di componenti autonomi e testati Il paradigma ad oggetti 3 Concetti fondamentali Oggetto: insieme di dati e di metodi per operare sui dati. I dati vengono detti anche attributi Classe: è uno “stampo”, un modello per la creazione di oggetti. A partire da una classe si possono creare più oggetti. Ogni oggetto è detto istanza della classe. Messaggio: consente agli oggetti di comunicare tra loro Eredità: fornisce un meccanismo potente per l’organizzazione e la strutturazione del software. La classe erede incorpora alcuni attributi e alcuni metodi della classe genitore Il paradigma ad oggetti 4 Cosa sono gli oggetti Versione informatica degli oggetti "reali“ o “astratti” Dotati di una loro propria "individualità" Capaci di interagire per scambio di messaggi Caratterizzati da proprietà dati: funzioni: ne descrivono lo “stato” ne descrivono il “comportamento” Un messaggio modifica lo stato e attiva comportamenti Un oggetto è una coppia (stato,funzioni) Il paradigma ad oggetti 5 Oggetto automobile Funzioni - Avviati - Fermati - Accelera -… Il paradigma ad oggetti Dati: - Targa - Colore - Velocità - Livello benzina - ... 6 Il concetto di Classe Una classe può essere vista come “stampo” per la creazione di oggetti. Esempio: classe bicicletta oggetto la mia bicicletta I valori di alcuni attributi possono essere comuni a tutti gli oggetti della classe (variabili di classe) I valori di altri attributi dipendono invece dalla particolare istanza (variabili di istanza) Discorso analogo vale per i metodi. Il paradigma ad oggetti 7 I linguaggi ad oggetti Forniscono come astrazione base la possibilità di definire classi, di mettere in relazione classi tramite l’ereditarietà, di istanziare oggetti a partire da una classe. Linguaggi a Oggetti “puri”: la classe e gli oggetti sono le uniche astrazioni del linguaggio (Smalltalk, Java) Linguaggi a Oggetti “non puri”: aggiungono l’astrazione di classe e oggetto ai costrutti tradizionali della programmazione (C++, Object Pascal, ..) Il paradigma ad oggetti 8 Classi: esempio Classe bicicletta Attributi di classe Numero di ruote Numero di pedali Attributi di istanza Colore Numero di rapporti Tipo Velocità corrente Metodi di istanza (modificano lo stato della particolare bicicletta) Cambiare rapporto Accelerare Frenare Il paradigma ad oggetti 9 Messaggi Definizione: Mezzo di comunicazione tra oggetti Quando un oggetto A vuole che un oggetto B esegua uno dei suoi metodi, gli invia un messaggio A messaggio B Componenti di un messaggio: L’oggetto a cui il messaggio è indirizzato Il nome del metodo da eseguire Eventuali parametri di cui il metodo necessita per essere eseguito Il paradigma ad oggetti 10 Messaggi: esempio Oggetto A: ciclista Oggetto B: bicicletta A invia a B il seguente messaggio m: ciclista m bicicletta m = bicicletta.cambiaRapporto (r ) Il paradigma ad oggetti 11 Java E’ un linguaggio ad oggetti puro: tranne i tipi di dati primitivi di base (int, float, double,...), tutto il resto in una applicazione sono oggetti appartenenti a classi. Un programma è un insieme di classi: non esistono funzioni definite a livello esterno. Anche il metodo main() è definito dentro una classe. Viene fornito con una notevole gerarchia di classi standard già pronte Architettura indipendente dalla piattaforma. Il paradigma ad oggetti 12 Programmi in Java Un programma è definito da un insieme di classi e, durante l’esecuzione, dagli oggetti che a partire da tali classi verranno istanziati. Le classi sono entità statiche, definite prima della esecuzione. Non esiste nulla che non sia definito all’interno di qualche classe. Gli oggetti sono entità dinamiche che assumono esistenza a partire da classe durante l’esecuzione di un programma. All’interno di una classe ci può essere solo una funzione pubblica di nome main() con la seguente interfaccia: public static Il paradigma ad oggetti void main(String args[]) 13 Classi • una classe ha un nome, e contiene due tipi di membri: campi e metodi metodo metodo campi metodo metodo “Tipo di dati astratti” (ADT) Il paradigma ad oggetti 14 Oggetti Un oggetto è una istanza (“esemplare”) di una classe, che viene creato (“instanziato”) dinamicamente (durante l’esecuzione del programma) valori DJ197QA variabili a BQ895SZ Automobile DB117ZW b c Due esemplari della stessa classe sono distinguibili soltanto per il loro stato (il valore dei loro campi), mentre il comportamento è sempre identico Il paradigma ad oggetti 15 Una classe java: Automobile 1. class Automobile { 2. String targa; 3. int velocità; 4. Color colore; 5. ... 6. public void Avviati () { 7. ... 8. } 9. public void Fermati () { 10. } 11. } Il paradigma ad oggetti Nome di classe campi metodi 16 Oggetti esempio Java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. class Automobile { ... } ... Automobile a, b, c; // vengono solo definiti tre riferimenti a oggetti a = new Automobile(); b = new Automobile(); // l’oggetto viene creato e inizializzato c = new Automobile(); ... a.Avviati(); // viene richiesta una operazione all’oggetto ... Il paradigma ad oggetti 17 Incapsulamento Alcuni attributi (dati e metodi) sono pubblici (public) (cioè visibili "all'esterno") Altri attributi sono privati (private) dell'oggetto, e quindi “nascosti” all’esterno (“information hiding”) Il programmatore può modificare le parti private senza effetti per gli utilizzatori dell'oggetto Propagazione delle modifiche assai contenuta Il paradigma ad oggetti 18 Esempio: Automobile Parti "visibili" (interfaccia pubblica): accesso a "ciò che l'auto può fare" volante, freno (ev. a mano) blocchetto di accensione, oppure manovella pedale dell'acceleratore, acceleratore automatico cambio manuale, oppure cambio automatico Parti "nascoste" (implementazione): "come l'auto fa ciò che si può fare" meccanica dello sterzo e dell'alimentazione elettromeccanica dell'avviamento sistema di alimentazione e accensione Il paradigma ad oggetti 19 I’incapsulamento: approcci Approccio "puro" lo stato è privato, e lo si può modificare solo attraverso quei metodi che sono stati dichiarati pubblici . Esempio: Fermati() Approccio di Java anche le componenti dello stato possono essere dichiarate pubbliche e modificate dall'esterno Esempio: velocita=0 Si consiglia comunque di implementare per quanto possibile l’approccio puro Il paradigma ad oggetti 20 Interazioni tra oggetti Gli oggetti possono comunicare e interagire mediante scambio di messaggi attraverso le loro interfacce pubbliche (stato o funzioni) Per mezzo di un messaggio un oggetto può chiedere un'informazione a un altro oggetto, causarne un cambiamento di stato, oppure delegargli un'attività Un messaggio in arrivo viene trattato dal metodo omonimo del ricettore, il quale "si attiva" per rispondere, per cambiare di stato, oppure per intraprendere un'attività Il paradigma ad oggetti 21 Esempio: una automobile Il sistema antiskid durante una frenata invia periodicamente un messaggio alle ruote per "leggere" la loro velocità di rotazione Il galleggiante nel serbatoio del carburante invia messaggi all'indicatore di livello sul cruscotto per "scrivervi" un nuovo stato Il volante tornando alla posizione di riposo invia un messaggio al comando meccanico dell'indicatore di direzione per delegargli il compito di interrompere l'eventuale segnale lampeggiante ("togliere la freccia") Il paradigma ad oggetti 22 Oggetti composti Un oggetto può essere costituito da altri oggetti automobile ruota Il paradigma ad oggetti carrozzeria motore 23 Ereditarietà È il meccanismo che consente di derivare una sottoclasse da una classe data Una sottoclasse si ottiene per aggiunta, per occultamento o per ridefinizione di uno o più membri rispetto alla classe di partenza (che diventa una superclasse della nuova classe) Esempio: StartTassametro EndTassametro Licenza automobile Il paradigma ad oggetti taxi 24 Classe Taxi 1. class Taxi extends Automobile { // eredita le proprietà di Automobile 2. 3. int licenza; // è un nuovo campo 4. 5. public void StartTassametro() { // è un nuovo metodo 6. ... 7. } 8. 9. public void EndTassametro () { // è un nuovo metodo 10. ... 11. } 12. 13. } Il paradigma ad oggetti 25 Esempi Implementazione di un'interfaccia grafica classe "finestra": attributo privato "sfondo" e metodo "cambia-sfondo" sottoclasse "finestra-nera": attributo privato "sfondo" ridefinito con il valore costante "nero", metodo "cambia-sfondo" occultato Libreria di algebra lineare: classe "matrice": metodo "determinante" generico sottoclasse "matrice-diagonale": metodo "determinante" che moltiplica tra di loro gli elementi sulla diagonale Dichiarazione dei redditi classe "contribuente": quadri del modello 740 base classe "autonomi": aggiunta del membro "quadro-E" Il paradigma ad oggetti 26 La gerarchia delle classi Specializzazione Generalizzazione instanziazione Il paradigma ad oggetti 27 Esempio Object Veicolo VeicoloSenza Motore Veicolo A Motore Motocicletta Automobile Taxi Il paradigma ad oggetti 28 Aggiungere sottoclassi Object Veicolo VeicoloSenza Motore Veicolo A Motore Motocicletta Automobile Altro Taxi Il paradigma ad oggetti 29 Ridefinizione dei metodi Veicolo A Motore Noleggia Motocicletta Automobile ereditano il metodo Il paradigma ad oggetti Aereo Noleggia utilizza la versione locale 30 Polimorfismo Una funzione si dice polimorfa se è capace di operare su oggetti di tipo diverso specializzando il suo comportamento in base al tipo dell’oggetto su cui opera. Tutto ciò che è definito per una classe, vale anche per le sue sottoclassi. Se una proprietà viene ridefinita, quando la uso viene selezionata sempre la versione corretta Esempio: Quando uso un metodo di un oggetto generico, non so: a quali livelli è definito quale tra i metodi omonimi nella gerarchia verrà usato Il paradigma ad oggetti 31 Polimorfismo Polimorfismo orizzontale: Studente s = new Studente(“Rossi”); s.print(); Point p = new Point(3, 5); p.print(); Polimorfismo verticale: Persona p = new Studente(“Rossi”); p.print(); // stampa nome e matricola (legame dinamico) Il paradigma ad oggetti 32 Visibilità dei nomi nome gerarchia di classi Il messaggio inviato all’oggetto risale nella gerarchia fino a trovare una definizione b.nome oggetto b Il paradigma ad oggetti oggetto a 33 Ereditarietà multipla Meccanismo che consente di derivare sottoclassi da due o più classi Mezzo Pubblico Automobile Taxi Il problema degli omonimi Java non implementa ereditarietà multipla Il paradigma ad oggetti 34 Riuso del software Classi specifiche Classi specializzate Classi generali sviluppo interno dal fornitore di classi col linguaggio Linguaggio Il paradigma ad oggetti 35 La classe Object: metodi Il paradigma ad oggetti 36 Polimorfismo 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. public class TestToString { static public void main(String[] args) { Object o = new Object(); System.out.println(o); MyObject m = new MyObject(); System.out.println(m); java.lang.Object@720eeb MyObject@310d42 MyObjectExt e = new MyObjectExt(); Oggetto MyObjectExt System.out.println(e); } } class MyObject extends Object { } class MyObjectExt extends MyObject { public String toString() { return "Oggetto MyObjectExt"; } } Il paradigma ad oggetti 37 Polimorfismo 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. public class TestToString { static public void main(String[] args) { Object o = new Object(); System.out.println(o); java.lang.Object@720eeb o = new MyObject(); System.out.println(o); MyObject@310d42 o = new MyObjectExt(); System.out.println(o); Oggetto MyObjectExt } } class MyObject extends Object { } class MyObjectExt extends MyObject { public String toString() { return "Oggetto MyObjectExt"; } } Il paradigma ad oggetti 38