Ingegneria del Software Analisi Object Oriented ed Elementi di Programmazione OO Origini Le metodologie ad oggi nascono negli anni 70 ma si affermano solo nelgi 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 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: Rappresentazione UML Classi e Oggetti (4)
Classi e Oggetti: Esempi Un esempio completo Problema Un semplice programma per la memorizzazione delle operazioni di manutenzione (cambio olio, freni e pneumatici) di due autovetture: una ford fiesta ed un alfa 156. Analisi Modello delle classi e degli oggetti
class Autovettura 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 = 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; } 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 Ingegneria }; del Software 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 Relazioni associative, aggregative e compositive 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
Membri pubblici Information Hidding (2) 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
Ereditarietà semplice Ereditarietà (2) La classe figlia eredita da una sola classe padre Ereditarietà multipla Ereditarietà (3) 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 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 Una funzione virtuale nella classe padre deve essere implementata in tutte le classi figlie
Overloading Polimorfismo (2) 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 Funzioni virtuali Polimorfismo (3) Funzioni definite nella classe padre ed implementate nelle classi figlie Si obbliga lo sviluppatore delle classi figlie all implementazione delle funzioni virtuali
Supporto a run-time Polimorfismo (4) Oggetto2.funzione1 Oggetto2.funzione3 Oggetto2.funzione2 Oggetto3.funzione1 Oggetto3.funzione2 Oggetto3.funzione3 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
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 lasca Aggregazione Gli oggetti nascono e muoiono in momenti diversi
Aggregazione stretta Composizione Gli oggetti nascono e muoiono assieme Creazione statica Creazione degli oggetti 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
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