Componenti A.Natali Marzo 19991
2 Oggetti u Un oggetto possiede stato, funzionamento e identita'. u 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 Classi u Una classe descrive la struttura interna e il funzionamento di un oggetto. u 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 Il ruolo del costrutto class u Permette protezione e information hiding u Usabile come modulo o come specifiche della struttura e del comportamento di oggetti u Consente di definire e realizzare tipi di dato (astratto)
Componenti A.Natali Marzo class: concetto o meccanismo? u 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 Class: esempio u CAccount c1; c1 e una variabile di tipo CAccount, la classe che specifica –come si costruisce loggetto denotato da c1, –come e fatto loggetto denotato da c1 –quali sono le operazioni eseguibili sulloggetto denotato da c1
Componenti A.Natali Marzo Classi in UML CAccount # amount: Real + debit( v : Real ) + credit( v : Real ) + public - private # protected
Componenti A.Natali Marzo class CAccount public class CAccount { //Variabili istanza (variabili di stato) double amount = 0; //Costruttore CAccount( double v ){ amount = v; } //Metodi public void debit( double v ){ amount -= v; } public void credit( double v ){ amount += v; } }
Componenti A.Natali Marzo Oggetti e variabili CAccount c1; c1 e una variabile (di stile imperativo) che: u 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 Classi e tipi u Molti linguaggi oo fanno coincidere il concetto di classe con quello di tipo. u Il concetto di classe non coincide pero con quello di tipo. u La classe e la realizzazione di un tipo di dato (astratto) u Il concetto di tipo e meglio catturato dal costrutto interface
Componenti A.Natali Marzo Classe e Interfaccia u 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. u Il costrutto interface complementa ed estende il costrutto class. u Il nome di una interfaccia puo' essere usato per denotare un tipo.
Componenti A.Natali Marzo ContoCorrente: interfaccia public interface IAccount{ public void debit( double v ); //prelievo public void credit( double v ); //deposito }
Componenti A.Natali Marzo La classe come realizzazione dellinterfaccia public class CAccount implements IAccount{... } IAccount c1 = new CAccount( 10 ); CAccount c2 = new CAccount( 20 ); c1 = c2;//SI c2 = c1;//NO ???? IAccount c3 = c2; //SI
Componenti A.Natali Marzo Contratti tra cliente e servitore u Linterfaccia esplicita una parte del contratto tra cliente e servitore –Le specifiche sintattiche non bastano u La classe garantisce la consistenza degli oggetti –Occorre esprimere e gestire casi di non conformita (eccezioni)
Componenti A.Natali Marzo Invarianti ed eccezioni u Il valore del conto corrente deve essere sempre superiore a un valore limite prefissato (per una certa categoria di clienti) u 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 Una nuova specifica public interface IAccount{ public void debit( double v ) throws EOverDrawn; //prelievo con eccezione public void credit( double v ); //deposito } IAccount c1 = new CAccount( 10 ); try{ c1.debit( 500 ); }catch( Exception e ){ … }
Componenti A.Natali Marzo Una nuova realizzazione public class CAccount implements IAccount{ //VARIABILE DI CLASSE static double debitLimit = -10; //Variabili istanza (variabili di stato) double amount = 0; //Costruttore CAccount( double v ){ amount = v; } //Metodi public void credit( double v ){ amount += v; }
Componenti A.Natali Marzo Metodi con eccezione //Metodi public void debit( double v ) throws EOverDrawn;{ double t = amount - v; if( v > debitLimit ) amount = t; else throw new EOverDrawn(); }//debit }//
Componenti A.Natali Marzo 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 La classe nella progettazione u 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 Modello ad oggetti u 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: u E orientato alla progettazione per il cambiamento
Componenti A.Natali Marzo La progettazione per il cambiamento u Supporta l'intera sequenza che va dai requisiti (o dalla loro modifica) al sistema funzionate u Supporta lo sviluppo iterativo di un sistema lungo il tutto il suo tempo di vita u Concepisce ciascuna iterazione come una modifica a un sistema esistente
Componenti A.Natali Marzo Una nuova specifica u Il conto corrente deve contenere una lista dei movimenti effettuati u Invariante: –La lista dei movimenti deve corrispondere alla sequenza di richieste
Componenti A.Natali Marzo Ereditarieta u 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). u Scaturisce dall'esigenza di introdurre un meccanismo per condividere (parti di) una descrizione, cioe' per riusare codice gia' funzionante.
Componenti A.Natali Marzo Specifica incrementale public interface IACCOUNT extends IAccount{ public String toString(); //rapprresent. esterna public String log(); //lista movimenti }//IACCOUNT
Componenti A.Natali Marzo Ereditarieta: concetto o meccanismo? u L'interpretazione di una classe come un tipo di dato (astratto) induce a vedere lereditarieta' come un meccanismo per definire sottotipi. Si parla in questo caso di ereditarieta' strict. u L'ereditarieta' tra classi intese come tipi puo' essere interpretata come un meccanismo per introdurre polimorfismo
Componenti A.Natali Marzo Polimorfismo u 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 Vincoli imposti dalle relazioni sui tipi u 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 La regola di conformita u 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 Ereditarieta e subtyping u 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 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 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 Qualificatori di accesso u public u private u protected nessuno: in Java vi e una visibilita a livello di package
Componenti A.Natali Marzo Realizzazione incrementale // specializza le vecchie operazioni public void credit( double v ){ logObj.add(credit + v ); super.credit( v ); }//credit Si riusa loperazione precedente
Componenti A.Natali Marzo 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 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 Java vs. C++ u In C++ loperazione 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 Progetto orientato al cambiamento u Operazioni aperte u Operazioni primitive (dipendenti dalla rappresentazione) e non u Classi astratte
Componenti A.Natali Marzo Operazioni aperte A + m1( v : Real ) + m2( v : Real ) B m1 chiama m2 il funzionamento di m1 dipende dalloggetto che la sta eseguendo
Componenti A.Natali Marzo 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 Classe astratta u Consente di fattorizzare uninterfaccia comune a un insieme di sottotipi (sottoclassi) u Definisce il codice delle operazioni non primitive, lasciando alle sottoclassi la specifica del codice delle primitive (metodi abstract) u Può definire variabili