Progettazione Object

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