La programmazione ad oggetti 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
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
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
Un oggetto è una coppia (stato,funzioni) 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: ne descrivono lo “stato” funzioni: ne descrivono il “comportamento” Un messaggio modifica lo stato e attiva comportamenti Un oggetto è una coppia (stato,funzioni) Il paradigma ad oggetti
Oggetto automobile Funzioni Dati: - Avviati - Targa - Fermati - Colore - Accelera - Velocità - … - Livello benzina - ... Il paradigma ad oggetti
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
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
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
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 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 messaggio A B Il paradigma ad oggetti
Messaggi: esempio Oggetto A: ciclista Oggetto B: bicicletta A invia a B il seguente messaggio m: m = bicicletta.cambiaRapporto (r ) ciclista m bicicletta Il paradigma ad oggetti
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
public static void main(String args[]) 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 void main(String args[]) Il paradigma ad oggetti
“Tipo di dati astratti” (ADT) Classi una classe ha un nome, e contiene due tipi di membri: campi e metodi campi metodo “Tipo di dati astratti” (ADT) Il paradigma ad oggetti
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 b DB117ZW 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
Una classe java: Automobile class Automobile { String targa; int velocità; Color colore; ... public void Avviati () { } public void Fermati () { Nome di classe campi metodi Il paradigma ad oggetti
Oggetti esempio Java 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
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
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
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
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
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
Oggetti composti Un oggetto può essere costituito da altri oggetti automobile ruota carrozzeria motore Il paradigma ad oggetti
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 taxi Il paradigma ad oggetti
Classe Taxi class Taxi extends Automobile { // eredita le proprietà di Automobile int licenza; // è un nuovo campo public void StartTassametro() { // è un nuovo metodo ... } public void EndTassametro () { // è un nuovo metodo Il paradigma ad oggetti
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
La gerarchia delle classi Specializzazione Generalizzazione instanziazione Il paradigma ad oggetti
Esempio Object Veicolo Il paradigma ad oggetti VeicoloSenza Motore Veicolo A Motore Motocicletta Automobile Taxi Il paradigma ad oggetti
Aggiungere sottoclassi Object Veicolo VeicoloSenza Motore Veicolo A Motore Motocicletta Automobile Altro Taxi Il paradigma ad oggetti
Ridefinizione dei metodi Veicolo A Motore Noleggia Motocicletta Automobile Aereo Noleggia ereditano il metodo utilizza la versione locale Il paradigma ad oggetti
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
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
Visibilità dei nomi Il messaggio inviato all’oggetto nome gerarchia di classi Il messaggio inviato all’oggetto risale nella gerarchia fino a trovare una definizione b.nome oggetto b oggetto a Il paradigma ad oggetti
Ereditarietà multipla Meccanismo che consente di derivare sottoclassi da due o più classi Il problema degli omonimi Java non implementa ereditarietà multipla Taxi Automobile Mezzo Pubblico Il paradigma ad oggetti
Riuso del software Classi specifiche sviluppo interno Classi specializzate dal fornitore di classi Classi generali col linguaggio Linguaggio Il paradigma ad oggetti
La classe Object: metodi Il paradigma ad oggetti
Polimorfismo 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); MyObjectExt e = new MyObjectExt(); System.out.println(e); } class MyObject extends Object { } class MyObjectExt extends MyObject { public String toString() { return "Oggetto MyObjectExt"; java.lang.Object@720eeb MyObject@310d42 Oggetto MyObjectExt Il paradigma ad oggetti
Polimorfismo public class TestToString { static public void main(String[] args) { Object o = new Object(); System.out.println(o); o = new MyObject(); o = new MyObjectExt(); } class MyObject extends Object { } class MyObjectExt extends MyObject { public String toString() { return "Oggetto MyObjectExt"; java.lang.Object@720eeb MyObject@310d42 Oggetto MyObjectExt Il paradigma ad oggetti