Upload
savio-palla
View
217
Download
1
Embed Size (px)
Citation preview
Componenti A.Natali Marzo 1999 1
Componenti A.Natali Marzo 1999 2
Oggetti
Un oggetto possiede stato, funzionamento e identita'.
Struttura e funzionamento di oggetti simili sono definiti nella loro classe comune (di cui sono istanze). – I termini istance ed object sono intercambiabili
Componenti A.Natali Marzo 1999 3
Classi
Una classe descrive la struttura interna e il funzionamento di un oggetto.
Gli oggetti di una stessa classe hanno la stessa rappresentazione interna, le stesse operazioni e lo stesso funzionamento.
name
Attributes
Operations
Componenti A.Natali Marzo 1999 4
Il ruolo del costrutto class
Permette protezione e information hiding Usabile come modulo o come specifiche della
struttura e del comportamento di oggetti Consente di definire e realizzare tipi di dato
(astratto)
Componenti A.Natali Marzo 1999 5
class: concetto o meccanismo?
Il costrutto class mescola vari piani:
– specifica come si costruisce– specifica cosa si vede– specifica come e’ fatto– specifica come funziona
Componenti A.Natali Marzo 1999 6
Class: esempio
CAccount c1;
c1 e’ una variabile di tipo CAccount, la classe che specifica – come si costruisce l’oggetto denotato da c1, – come e’ fatto l’oggetto denotato da c1 – quali sono le operazioni eseguibili sull’oggetto
denotato da c1
Componenti A.Natali Marzo 1999 7
Classi in UML
CAccount
# amount: Real
+ debit( v : Real )+ credit( v : Real )
+ public- private# protected
Componenti A.Natali Marzo 1999 8
class CAccount
public class CAccount {//Variabili istanza (variabili di stato)double amount = 0;
//CostruttoreCAccount( double v ){ amount = v; }
//Metodipublic void debit( double v ){ amount -= v; }public void credit( double v ){ amount += v; }}
Componenti A.Natali Marzo 1999 9
Oggetti e variabili
CAccount c1;
c1 e’ una variabile (di stile imperativo) che: in C++: contiene la rappresentazione di
una istanza della classe CAccount in Java: contiene un riferimento null;
Caccount c1=new Caccount(10);
Componenti A.Natali Marzo 1999 10
Classi e tipi
Molti linguaggi oo fanno coincidere il concetto di classe con quello di tipo.
Il concetto di classe non coincide pero’ con quello di tipo.
La classe e’ la realizzazione di un tipo di dato (astratto)
Il concetto di tipo e’ meglio catturato dal costrutto interface
Componenti A.Natali Marzo 1999 11
Classe e Interfaccia
Java introduce il costrutto interface che consente di definire una collezione di prototipi di operazioni ciascuna delle quali dovra' essere realizzata come metodo di una qualche classe.
Il costrutto interface complementa ed estende il costrutto class.
Il nome di una interfaccia puo' essere usato per denotare un tipo.
Componenti A.Natali Marzo 1999 12
ContoCorrente: interfaccia
public interface IAccount{
public void debit( double v ); //prelievopublic void credit( double v ); //deposito
}
Componenti A.Natali Marzo 1999 13
La classe come realizzazione dell’interfaccia
public class CAccount implements IAccount{...}
IAccount c1 = new CAccount( 10 );CAccount c2 = new CAccount( 20 );
c1 = c2; //SIc2 = c1; //NO ????
IAccount c3 = c2; //SI
Componenti A.Natali Marzo 1999 14
Contratti tra cliente e servitore
L’interfaccia esplicita una parte del contratto tra cliente e servitore– Le specifiche sintattiche non bastano
La classe garantisce la consistenza degli oggetti– Occorre esprimere e gestire casi di non
conformita’ (eccezioni)
Componenti A.Natali Marzo 1999 15
Invarianti ed eccezioni
Il valore del conto corrente deve essere sempre superiore a un valore limite prefissato (per una certa categoria di clienti)
L'operazione debit non restituisce alcun valore in uscita, e quindi non e' in grado di segnalare una eventuale anomalia al cliente
Componenti A.Natali Marzo 1999 16
Una nuova specifica
public interface IAccount{public void debit( double v )
throws EOverDrawn; //prelievo con eccezionepublic void credit( double v ); //deposito}
IAccount c1 = new CAccount( 10 );
try{c1.debit( 500 );
}catch( Exception e ){ … }
Componenti A.Natali Marzo 1999 17
Una nuova realizzazione
public class CAccount implements IAccount{//VARIABILE DI CLASSE static double debitLimit = -10;
//Variabili istanza (variabili di stato)double amount = 0;
//CostruttoreCAccount( double v ){ amount = v; }
//Metodipublic void credit( double v ){ amount += v; }
Componenti A.Natali Marzo 1999 18
Metodi con eccezione
//Metodipublic void debit( double v )
throws EOverDrawn;{ double t = amount - v;
if( v > debitLimit )amount = t;
else throw new EOverDrawn();
}//debit
}//
Componenti A.Natali Marzo 1999 19
Consistenza ed asserzioni
Invariant == (amount > debLimit)public void debit( double v )
throws EOverDrawn;{ require: true;
double t = amount - v;if( v > debitLimit ) amount = t; else throw new EOverDrawn();
ensure: (amount==oldAmount-v) && invariant
}//debit
Componenti A.Natali Marzo 1999 20
La classe nella progettazione
Apre la via alla specifica incrementale del software secondo i principi-base del modello ad oggetti (un modello non ancora completamente specificato)
Componenti A.Natali Marzo 1999 21
Modello ad oggetti
I concetti su cui si basa:– classi– oggetti– e sulle loro relazioni
sono usabili in modo seamless come building blocks in tutte le fasi dello sviluppo del software:
E’ orientato alla progettazione per il cambiamento
Componenti A.Natali Marzo 1999 22
La progettazione per il cambiamento
Supporta l'intera sequenza che va dai requisiti (o dalla loro modifica) al sistema funzionate
Supporta lo sviluppo iterativo di un sistema lungo il tutto il suo tempo di vita
Concepisce ciascuna iterazione come una modifica a un sistema esistente
Componenti A.Natali Marzo 1999 23
Una nuova specifica
Il conto corrente deve contenere una lista dei movimenti effettuati
Invariante:– La lista dei movimenti deve corrispondere alla
sequenza di richieste
Componenti A.Natali Marzo 1999 24
Ereditarieta’
Nasce come una relazione tra classi in cui una classe condivide la struttura e/o il funzionamento definito in un'altra classe (ereditarieta' singola) o in varie altre classi (ereditarieta' multipla).
Scaturisce dall'esigenza di introdurre un meccanismo per condividere (parti di) una descrizione, cioe' per riusare codice gia' funzionante.
Componenti A.Natali Marzo 1999 25
Specifica incrementale
public interface IACCOUNT extends IAccount{
public String toString(); //rapprresent. esterna public String log(); //lista movimenti
}//IACCOUNT
Componenti A.Natali Marzo 1999 26
Ereditarieta’: concetto o meccanismo?
L'interpretazione di una classe come un tipo di dato (astratto) induce a vedere l’ereditarieta' come un meccanismo per definire sottotipi. Si parla in questo caso di ereditarieta' strict.
L'ereditarieta' tra classi intese come tipi puo' essere interpretata come un meccanismo per introdurre polimorfismo
Componenti A.Natali Marzo 1999 27
Polimorfismo
In linguaggi polimorfici un valore o una variabile puo' denotare istanze di molti diversi tipi ( classi ) ammesso che questi siano collegati tra loro da relazioni tipo-sottotipo ( classe-sottoclasse ).
dataType min(dataType v1, dataType v2)
Componenti A.Natali Marzo 1999 28
Vincoli imposti dalle relazioni sui tipi
Un sottotipo T1 di un tipo T introduce vincoli addizionali alla specifica di T, cui corrisponde un sottoinsieme piu' limitato di oggetti rispetto all'insieme di oggetti definito da T. – Una variabile di tipo T puo' denotare un oggetto di
tipo T1 ma non viceversa
– Infatti e' vero che ogni oggetto di tipo T1 e' anche di tipo T, ma non e' vero il contrario
Componenti A.Natali Marzo 1999 29
La regola di conformita’
Ogni oggetto di tipo T1, sottotipo di T, puo’ essere usato in tutti i contesti in cui e' ammissibile un oggetto del tipo T.
Componenti A.Natali Marzo 1999 30
Ereditarieta’ e subtyping
La specifica di un sottotipo deve continuare a soddisfare ai vincoli del tipo-genitore.
– come garantire la regola di conformita' ?
– cosa significa raffinare il contratto rappresentato dall'interfaccia e dal funzionamento di una classe?
Componenti A.Natali Marzo 1999 31
Realizzazione incrementale
public class CACCOUNT extends CAccount implements IACCOUNT{
// eredita struttura e operazioni di CAccount// accede alle variabili private di CAccount
// specializza le vecchie operazioni // realizza le nuove operazioni di IACCOUNT
Componenti A.Natali Marzo 1999 32
Realizzazione incrementale
// specializza le vecchie operazioni
public void credit( double v ){ logObj.add(“credit “+ v );amount += v; //MEGLIO DI NO!!
}//credit
L'ereditarieta' puo' compromettere il principio dell'incapsulamento dell'informazione se una classe derivata ha accesso ai dati di una classe genitore.
Componenti A.Natali Marzo 1999 33
Qualificatori di accesso
public private protected
nessuno: in Java vi e’ una visibilita’ a livello di package
Componenti A.Natali Marzo 1999 34
Realizzazione incrementale
// specializza le vecchie operazioni
public void credit( double v ){ logObj.add(“credit “+ v );
super.credit( v );}//credit
Si riusa l’operazione precedente
Componenti A.Natali Marzo 1999 35
Realizzazione incrementale
// realizza le nuove operazioni di IACCOUNT
Vector logObj = new Vector(10,5);
public String toString(){ return “”+ amount; }public String log(){ return logObj;}//log
}//CACCOUNT
Componenti A.Natali Marzo 1999 36
Una operazione polimorfica
void credit100( CAccount a1 ){a1.credit( 100 );
}//credit100;
IAccount c1 = new CAccount( 10 );IACCOUNT c2 = new CACCOUNT( 20 );
credit100( c1 );credit100( c2 );System.out.println( c2.log() );
Componenti A.Natali Marzo 1999 37
Java vs. C++
In C++ l’operazione precedente non e’ polimorfica:– il trasferimento degli argomenti implica la
copia degli oggetti – il meccanismo di binding e’ di tipo eager,
mentre il polimorfismo richiede un meccanismo di late binding
Componenti A.Natali Marzo 1999 38
Progetto orientato al cambiamento
Operazioni “aperte” Operazioni primitive (dipendenti dalla
rappresentazione) e non Classi astratte
Componenti A.Natali Marzo 1999 39
Operazioni “aperte”
A
+ m1( v : Real )+ m2( v : Real )
B
+ m2( v : Real )
m1 chiama m2il funzionamento di m1 dipende dall’oggetto che la sta eseguendo
Componenti A.Natali Marzo 1999 40
Operazioni non primitive
list insOrd( list l1, listData x){if ( l1.isEmpty() )
return nl.addFirst( x );else if ( x.less( l1.head() ) )
return l1.addFirst(x); else return insOrd( l1.tail(),x ).addFirst(x);
}//insOrd
Componenti A.Natali Marzo 1999 41
Classe astratta
Consente di fattorizzare un’interfaccia comune a un insieme di sottotipi (sottoclassi)
Definisce il codice delle operazioni non primitive, lasciando alle sottoclassi la specifica del codice delle primitive (metodi abstract)
Può definire variabili