Progettazione Object-Oriented Generalità, Relazione fra OOA e OOD Concetti di base: Classi e Oggetti, Relazioni fra oggetti, Ereditarietà e Polimorfismo La specifica del Progetto: notazione UML Una metodologia di Progettazione: OMT Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 1 Generalità • OOA (Object-Oriented Analysis) modella il dominio del problema in termini di astrazioni sui dati e loro relazioni • OOD (Object-Oriented Design) modella la soluzione al problema • Negli approcci OOAD (OOA + OOD), la rappresentazione della soluzione include buona parte del modello OOA – la separazione fra OOA ed OOD è in questi casi sfumata – la differenza principale è nel tipo di oggetti estratti dalle due Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 2 1 Relazione fra OOA e OOD Problema reale Rappresentazione del Problema Rappresentazione della Soluzione Analisi Progettazione Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 3 Differenze fra OOA e OOD • Gli oggetti dell’OOA hanno un significato nel dominio del problema (oggetti semantici) • Nell’OOD, gli oggetti identificati durante l’analisi possono essere raffinati ed estesi pensando alla loro realizzazione e nuovi oggetti possono essere aggiunti (oggetti del dominio della soluzione) – oggetti interfaccia: per gestire l’interfaccia con l’utente – oggetti applicativi: per realizzare i meccanismi di controllo richiesti dalla logica dell’applicazione – oggetti di utilità: necessari per supportare i servizi degli oggetti semantici o per implementarli efficientemente (es. Liste, code, tabelle, …) Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 4 2 L’aspetto dinamico e funzionale • Ulteriori aspetti del modello (della soluzione o del problema) da prendere in considerazione, oltre all’aspetto strutturale colto dal modello ad oggetti: – una rappresentazione del comportamento dinamico del sistema • (es. Use-case) – una rappresentazione delle funzionalità offerte dal sistema • una specifica di come gli output del sistema sono prodoti dai rispettivi input (es. DFD) Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 5 Concetti fondamentali dell’OOD • Oggetti ed Incapsulazione: – oggetto come incapsulazione di dati e servizi usabili da oggetti clienti – l’interfaccia dell’oggetto è l’insieme dei servizi richiedibili – ulteriori operazioni per uso interno e non facenti parte dell’interfaccia • L’incapsulazione realizza il concetto di information hiding – disciplina l’accesso alla struttura dati dell’oggetto garantendole l’integrità • La separazione fra interfaccia e implementazione facilita i cambiamenti futuri Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 6 3 Stato, Comportamento ed Identità di un oggetto • Stato di un oggetto: – definito dall’insieme dei dati incapsulati nell’oggetto (gli attributi) i cui valori ne rappresentano lo stato corrente – lo stato persiste fintanto che l’oggetto non è distrutto • Comportamento di un oggetto: – è il modo in cui un oggetto reagisce, in termini di cambiamento di stato, ai servizi ad esso richiesti, oppure che esso richiede ad altri oggetti – lo stato corrente di un oggetto è funzione della sequenza di operazioni svolte su di esso • Identità di un oggetto: – ogni oggetto è un’entità unica identificabile dal suo nome e con un proprio stato (es. Oggetti s1, s2 della classe Stack) Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 7 Classe • La classe rappresenta un ‘template’ che definisce l’insieme delle proprietà per gli oggetti della classe. Ogni classe possiede: – una interfaccia, che definisce quali parti di un oggetto della classe sono accessibili dall’esterno e come – un corpo, che implementa le operazioni dell’interfaccia – le variabili d’istanza, che contengono lo stato di ogni oggetto della classe • Ogni oggetto definisce una sua copia privata delle variabili d’istanza, al momento della creazione • Differisce dall’ADT per l’ereditarietà ed il Polimorfismo Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 8 4 Dichiarazione di una classe in C++ • Tre tipi di dichiarazioni di dati e operazioni: – Public (accessibili dall’esterno della classe) – Protected (accessibili dalla classe stessa e dalle sotto-classi derivate, oltre che dalle classi dichiarate friend) – Private(accessibili dalle classi dichiarate friend) • L’interfaccia della classe consiste in tutto ciò che è stato dichiarato public • All’atto della dichiarazione di un oggetto della classe viene eseguito il costruttore della classe Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 9 Un esempio Class NomeClasse { public: // costruttori // distruttore // operatori // modificatori // selettori protected: // variabili di istanza // funzioni di supporto private: // variabili di istanza // funzioni di supporto // friends }; Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 10 5 Dichiarazione di oggetti in C++ • Dichiarazione statica … NomeClasse unOggetto; …… unOggetto.Metdox( …); • Dichiarazione dinamica … NomeClasse *unOggetto; unOggetto= new NomeClasse; …… unOggetto->Metodox( …); // oppure *unOggetto.Metodox(...); • la dichiarazione dinamica è la più usata perchè consente il binding dinamico dei metodi Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 11 Relazioni fra oggetti • Nei sistemi OO, un oggetto interagisce con altri oggetti attraverso l’invio di messaggi mediante i quali richiede un servizio all’altro oggetto • Gli oggetti che sono in grado di comunicare sono in relazione tra di loro – oggetto cliente che richiede il servizio – oggetto fornitore che fornisce il servizio • La comunicazione è consentita se esiste la necessaria visibilità fra le parti coinvolte – se l’oggetto A invia un messaggio a B, B deve essere visibile ad A Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 12 6 Meccanismi di comunicazione – per passaggio di parametri: l’oggetto fornitore è un parametro di un metodo dell’oggetto cliente – per valore di ritorno: l’oggetto fornitore è restituito come valore da un metodo dell’oggetto cliente – per nome: l’oggetto fornitore è globale rispetto al cliente, o è parte dell’oggetto cliente, o è dichiarato localmente a qualche operazione Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 13 La relazione di aggregazione • • Una aggregazione fra classi implementa una relazione diversa da quella client/server, che riflette una relazione tuttoparti può essere implementata: – usando un puntatore, ossia un attributo che contiene un riferimento ad un oggetto dell’altre classe (aggregazione 1:1) (v. Disk) – oppure usando un array di puntatori (aggregazione 1:n) – dichiarando le parti come oggetti all’interno della classe (v. Track) Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. Class Disk { private: Track *tracks; disk information… }; Class Track { private: Sector sectors[MAX]; ... }; Class Sector { private: … }; 14 7 Ereditarietà • Meccanismo specifico dell’OO che consente di definire nuove classi a partire da classi pre-esistenti • Una classe B che eredita da una classe A, presenterà due parti: una parte derivata da A ed una parte aggiuntiva • Una caratteristica della classe A può anche essere ridefinita/ modificata nella classe B • Ovviamente: un oggetto della classe derivata B è anche una istanza della classe A • L’ereditarietà promuove il riuso • L’ereditarietà crea dipendenza fra la sotto-classe e la super-classe – un cambiamento nella super-classe si propagherà nelle sottoclassi Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 15 Ereditarietà multipla • • Una sottoclasse può ereditare anche da più di una superclasse Problemi di ambiguità causati dalla presenza di proprietà con lo stesso nome in diverse superclassi : Persona Inquilino Proprietario – quale proprietà si applica per la sottoclasse? • Soluzione in C++: – il programmatore deve risolvere l’ambiguità, premettendo al nome della proprietà l’identificatore della classe da cui essa deriva Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. Proprietario-inquilino 16 8 Metodi Virtuali • Una conseguenza dell’ereditarietà: – metodi definiti nelle parti alte di una gerarchia di ereditarietà dovranno essere implementati diversamente per ogni specifico oggetto (es. Il metodo ruota( ) definito per la superclasse OggettoGeometrico, avrà diverse implementazioni nelle varie sotto-classi) • In C++ le operazioni dichiarate in una superclasse e ridefinite in una sottoclasse saranno dichiarate come virtuali nella superclasse • Operazioni virtuali pure (terminano con =0 in C++): – quando l’ operazione dichiarata nella superclasse viene sempre ridefinita in ogni sottoclasse • Una classe con operazioni virtuali pure in C++ è una Abstract Base Class Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 17 Polimorfismo • Anch’esso conseguenza dell’ereditarietà: – proprietà di un oggetto di possedere più di un tipo – infatti un oggetto di una classe derivata è anche un oggetto della sua superclasse • Col polimorfismo, un oggetto possiede un tipo statico ed uno dinamico: – tipo statico è quello della dichiarazione statica dell’oggetto – tipo dinamico è quello assegnato in esecuzione fra i vari possibili tipi della gerarchia di ereditarietà – il tipo dinamico effettivo dell’oggetto è definito nel momento in cui l’oggetto è referenziato • es. Oggetto x di tipo B (sottoclasse) e y di tipo A (superclasse) • se x:= y , allora il tipo dinamico di x cambia da B ad A Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 18 9 Binding Dinamico • Il polimorfimo richiede il binding dinamico dei metodi ossia: – il codice associato alla chiamata di un metodo non è noto fino alla chiamata stessa durante l’esecuzione – ad es., se x è di tipo B, e B è ereditato da A, se O è una operazione definita in A e ridefinita in B, alla chiamata del metodo O su x (ossia x.O) corrisponderà: • la chiamata del metodo O definito in A, se il tipo dinamico di x è A • la chiamata del metodo O definito in B, se il tipo dinamico di x è B – il binding dinamico consente di risparmiare sulla dimensione del codice (non scrivo il codice per le varie possibili chiamate) • Polimorfismo è un esempio di overloading di una caratteristica – una caratteristica può significare cose diverse a seconda del contesto definito a run-time Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 19 Binding dinamico in C++ • In C++ i metodi sono legati staticamente (ossia a compiletime) per default • La parola chiave virtual specifica che il metodo è legato dinamicamente • I legami dinamici sono applicabili solo per i metodi di variabili dichiarate dinamicamente • I costruttori ed i metodi chiamati nei costruttori sono sempre legati staticamente Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 20 10 Classi astratte • • • Le proprietà di classi simili (variabili d’istanza e metodi) sono definite in una superclasse comune: la classe astratta Le classi astratte definiscono un comportamento comune e non sono istanziabili Alcuni metodi delle classi astratte possono essere realizzati, mentre di altri metodi si specifica solo l’interfaccia (nome, argomenti, tipo di ritorno) – in C++ un metodo astratto è precedutoda virtual e finisce con =0 • Le classi astratte richiedono la derivazione di classi concrete che ereditano il protocollo della classe astratta – nella realizzazione della classe astratta, le variabili sono dichiarate dinamicamente e hanno come tipo statico quello della classe astratta e come tipo dinamico quello della classe concreta istanziata – i legami dinamici permettono di ottenere il comportamento specifico Anna Rita Fasolino- Ingegneria del Software Progettazione O.O. 21 11
© Copyright 2025 ExpyDoc