Programmazione ad Oggetti Analisi e Progettazione OO Origini Le metodologie ad oggetti nascono negli anni 70 ma si affermano solo negli anni 80 grazie alla nascita dei linguaggi di programmazione ad oggetti Rappresentano una evoluzione delle metodologie ER Aggiungono una parte comportamentale alla parte strutturale di ER Classi e Oggetti Una classe rappresenta una entità logica Una classe è un tipo di dato complesso Una classe è un contenitore di oggetti Una classe descrive le proprietà strutturali e comportamentali degli oggetti che contiene Una classe è un meta-dato 1
Classi e Oggetti (2) Un oggetto è un entità concreta Un oggetto è un dato complesso Un oggetto appartiene sempre ad una classe Le proprietà strutturali e comportamentali di un oggetto sono quelle descritte dalla classe a cui appartiene Classi e Oggetti (3) Elementi delle classi Elementi strutturali (statici) Attributi: dati elementari rappresentanti la parte strutturale di un oggetto Elementi comportamentali (dinamici) Metodi: operazioni che possono essere eseguite o fatte eseguire dall oggetto e rappresentanti le proprietà comportamentali class name attributes: operations: operations attributes: Classi e Oggetti: Esempi 2
Un esempio completo Problema Si progetti un sistema per la memorizzazione delle operazioni di manutenzione (cambio olio, freni e pneumatici) di due autovetture: una ford fiesta ed un alfa 156. Al momento della realizzazione del sistema, le due autovetture hanno il seguente stato: Alfa 156 27000 Km percorsi Ultimo cambio olio a 25000 Ancora nessun cambio freni e pneumatici Ford Fiesta 123000 Km percorsi Ultimo cambio olio a 120000 Ultimo cambio freni a 100000 Un esempio completo (2) Una classe per Autovettura Un esempio completo (3) Due oggetti Autovettura 3
class Autovettura void stampa_stato () // Stampa lo stato attuale cout<<"auto: "<<Marca<<" "<<Modello<<endl; cout<<"chilometri: "<<Chilometri_percorsi<<endl; cout<<"ultimo cambio olio: "<<Ultimo_cambio_olio<<endl; cout<<"ultimo cambio freni: "<<Ultimo_cambio_freni<<endl; cout<<"ultimo cambio pneumatici: "<<Ultimo_cambio_pneumatici<<endl<<endl; } Corso di Programmazione }; ad Oggetti private: char *Modello; char *Marca; int Chilometri_percorsi; int Ultimo_cambio_olio; int Ultimo_cambio_freni; int Ultimo_cambio_pneumatici; public: void init (char *marca, char *modello, int chilometri, int cambio_olio, int cambio_freni, int cambio_pneumatici) // Inizializza gli attributi della classe Modello modello; Marca = marca; Chilometri_percorsi chilometri; Ultimo_cambio_olio cambio_olio; Ultimo_cambio_freni = cambio_freni; } Ultimo_cambio_pneumatici void aggiorna_chilometri (int chilometri) // Aggiorna i chilometri percorsi Chilometri_percorsi = chilometri; } void aggiorna_olio (int cambio_olio) // Aggiorna l'ultimo cambio olio Ultimo_cambio_olio = cambio_olio; } void aggiorno_pneumatici (int cambio_pneumatici) // Aggiorna l'ultimo cambio pneumatici Ultimo_cambio_pneumatici = cambio_pneumatici; } void aggiorna_freni (int cambio_freni) // Aggiorna l'ultimo cambio freni Ultimo_cambio_freni = cambio_freni; } = cambio_pneumatici; Implementazione void main() } Autovettura Ford; Autovettura Alfa; char char char char *ma1="ford"; *ma2="alfa Romeo"; *mo1="fiesta"; *mo2="156"; // Inizializza Autovetture Ford.init(ma1,mo1,123000,120000,100000,100000); Alfa.init(ma2,mo2,27000,20000,0,0); // Stampo lo stato Ford.stampa_stato(); Alfa.stampa_stato(); // Aggiorna lo stato dell'alfa Alfa.aggiorna_olio(25000); cout<<"stato dell'alfa dopo l'aggiornamento"<<endl<<endl; Alfa.stampa_stato(); Auto: Ford Fiesta Chilometri: 123000 Ultimo cambio olio: 120000 Ultimo cambio freni: 100000 Ultimo cambio pneumatici: 100000 Auto: Alfa Romeo 156 Chilometri: 27000 Ultimo cambio olio: 20000 Ultimo cambio freni: 0 Ultimo cambio pneumatici: 0 Stato dell Alfa dopo l aggiornamento Auto: Alfa Romeo 156 Chilometri: 27000 Ultimo cambio olio: 25000 Ultimo cambio freni: 0 Ultimo cambio pneumatici: 0 Information Hidding Proprietà Ereditarietà Polimorfismo 4
Information Hidding I dati e i dettagli implementativi sono invisibili all utilizzatore I dati e i dettagli implementativi sono incapsulati L accesso ai dati avviene attraverso le funzioni definite E un meccanismo di controllo L accesso ai dati avviene attraverso un interfaccia method # 6 method # 1 method # 5 data method # 2 method # 4 method # 3 Information Hidding (2) Membri pubblici Attributi e metodi direttamente accessibili dagli altri oggetti Membri privati Attributi e metodi non direttamente accessibili dagli altri oggetti Tutti gli attributi dovrebbero essere privati Membri privati Membri pubblici Ereditarietà E il meccanismo attraverso il quale una classe detta figlia eredita le caratteristiche di una classe detta padre Implementa una relazione di generalizzazionespecializzazione Superclasse Specializzazione Generalizzazione Sottoclasse 5
Ereditarietà (2) Ereditarietà semplice La classe figlia eredita da una sola classe padre Ereditarietà (3) Ereditarietà multipla La classe figlia eredita da più classi padre Classi Astratte e Funzioni Virtuali Una classe astratta è una classe non instanziabile E una classe vuota e tipicamente è una superclasse in una gerarchia Una funzione virtuale è una funzione non implementata E una funzione della quale viene fornita solo l interfaccia e l implementazione viene lasciata alle classi figlie 6
Polimorfismo E la possibilità di una funzione di assumere più forme Una funzione all interno di una classe può avere più di una implementazione (overloading) Una funzione ereditata da una classe padre può essere re-implementata nelle classi figlie (overriding) Una funzione virtuale nella classe padre deve essere implementata in tutte le classi figlie Polimorfismo (2) Overloading E la possibilità per una funzione di avere diverse definizioni e diversi comportamenti La distinzione tra le funzioni overloaded avviene in base al numero e/o al tipo dei parametri Polimorfismo (3) Funzioni virtuali Funzioni definite nella classe padre ed implementate nelle classi figlie Si obbliga lo sviluppatore delle classi figlie all implementazione delle funzioni virtuali 7
Supporto a run-time Polimorfismo (4) Oggetto2.funzione1 Oggetto2.funzione3 Oggetto2.funzione2 Oggetto3.funzione1 Oggetto3.funzione2 Oggetto3.funzione3 Relazioni Tipi di Relazioni Generalizzazione/Specializzazione E la relazione esistente tra una classe padre ed una classe figlia Aggregazione E la relazione esistente tra una classe aggregante e le classi aggregate L oggetto aggregante e gli oggetti aggregati hanno cicli di vita indipendenti Composizione E la relazione tra una classe composta e le classi componenti L oggetto composto e gli oggetti componenti hanno cicli di vita correlati Associazione E la relazione tra due classi che non comporta nessuna forma di inclusione né di generalizzazione 8
Associazione E un legame tra oggetti appartenenti a classi diverse Molteplicità della relazione associativa E il numero di legami distinti che un oggetto può avere con oggetti della classe associata Aggregazione Aggregazione lasca Gli oggetti nascono e muoiono in momenti diversi Composizione Aggregazione stretta Gli oggetti nascono e muoiono assieme 9
Identificare le relazioni Una associazione dovrebbe esistere se un concetto possiede controlla è collegata a si riferisce a è parte di ha come parti è membro di oppure ha come membri qualche altro concetto del modello Specificare le molteplicità da entrambi i lati Assegnare un nome chiaro all associazione Azioni piuttosto che associazioni Un errore comune consiste nel considerare azioni come se fossero associazioni. SocioLibreria Errore! Prende In prestito * * * Restituisce Errore! * ArticoloLibreria * Un esempio complesso Si consideri la vendita in un magazzino all ingrosso. Il cassiere prepara note di vendita, ognuna delle quali fa riferimento ad un certo numero di prodotti caratterizzati da un prezzo ed una descrizione. Ogni prodotto compare con la quantità venduta in una diversa linea della nota vendita. Si progetti un sistema per la realizzazione delle note vendita. Vendita Numero 115 Codice Prodotto Descrizione Quantità Prezzo Totale Articolo 17 Scrivania legno 1 500,00 500,00 32 Sedia legno 6 80,00 480,00 12 Tavolo cucina 1 350,00 350,00 Totale 1.330,00 10
Una semplice tecnica per scoprire i concetti dai quali ottenere le classi Analizzare documentazione di partenza, come la descrizione dei requisiti Estrarre nomi e frasi nominali (nomi con aggettivi) Eliminare nomi che: Sono ridondanti (rappresentano la stessa classe) Rappresentano istanze e non concetti Sono vaghi o troppo generici Corrispondono a concetti che non sono necessari al livello considerato Individuazione dei concetti Si consideri la vendita in un magazzino all ingrosso. Il cassiere prepara note di vendita, ognuna delle quali fa riferimento ad un certo numero di prodotti caratterizzati da un prezzo ed una descrizione. Ogni prodotto compare con la quantità venduta in una diversa linea della nota vendita. Si progetti un sistema per la realizzazione delle note vendita. Indentificazione dei Concetti nel caso studio Si consideri la vendita in un magazzino all ingrosso. Il cassiere prepara note di vendita, ognuna delle quali fa riferimento ad un certo numero di prodotti caratterizzati da un prezzo ed una descrizione. Ogni prodotto compare con la quantità venduta in una diversa linea della nota vendita 11
Rappresentazione dei Concetti Utilizzo dei class diagrams UML Cassiere Magazzino Vendita Nota_Vendita Linea Prodotto Quantità Descrizione Prezzo Rappresentazione dei dati C a s s ie re Ma g azzin o Vendita Nota _ Vend ita L in e a P ro d o tto Q u a ntità D e s c rizio n e P re zzo Vendita Numero 115 Codice Prodotto Descrizione Quantità Prezzo Totale Articolo 17 Scrivania legno 1 500,00 500,00 32 Sedia legno 6 80,00 480,00 12 Tavolo cucina 1 350,00 350,00 Totale 1.330,00 Astrazione Permette di passare da un modello concettuale ad un modello di tipi di dato Concetto Prodotto Classe Prodotto ID Descrizione Prezzo 12
Classi dell esempio Quante e quali sono necessarie classi per rappresentare i dati e calcolare il totale della nota vendita? Nota_Vendita Numero totale() 0..n Linea Quantità s ub_totale() 1 Prodotto ID Descrizione Prezzo prezzo() Meccanismi di creazione e distruzione degli oggetti Chi crea le istanze (oggetti) delle classi Nota_Vendita, Linea e Prodotto? E necessario prevedere dei metodi appositi? Creazione degli oggetti Creazione statica Gli oggetti vengono istanziati (creati) staticamente al tempo di compilazione ed allocati al tempo di caricamento Creazione dinamica Gli oggetti vengono istanziati dinamicamente a runtime L istanziazione dinamica di oggetti richiede l esistenza di un metodo speciale della classe chiamato costruttore 13
Creazione degli oggetti (2) Il costruttore è il metodo di una classe che permette la creazione dinamica di oggetti Una invocazione di un costruttore provoca l allocazione a runtime della memoria necessaria a contenere un oggetto Il costruttore è una funzione con lo stesso nome della classe e che non restituisce nessun dato Il distruttore è il metodo di una classe che permette la cancellazione dinamica di un oggetto Una invocazione di un distruttore provoca la deallocazione dell area di memoria riservata all oggetto Il distruttore ha lo stesso nome della classe preceduto dal simbolo 14