Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

80
Principi OOP A.Natali A prile 1999 1 Principi di oop Dai costrutti alle metodologie

Transcript of Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Page 1: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

1

Principi di oop

Dai costrutti alle metodologie

Page 2: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

2

Costrutti Java Dati primitivi e strutture di controllo:

– identiche a quelle del linguaggio C Interfacce

– come specifiche contrattuali Classi

– come moduli /come specifiche della struttura e del comportamento di oggetti

Packages– come contenitori

Page 3: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

3

Architettura di riferimento

Sistemi software intesi come collezioni di componenti (oggetti) – in uno stesso spazio di indirizzamento o

distribuiti in rete– associati a domini di protezione– supportati da sistemi operativi multitasking e a

finestre

Page 4: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

4

API Packages

Elenco JDK 1.2.1

Page 5: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

5

Java packages

java.lang Package that contains essential Java classes, including numerics, strings, objects, compiler,

runtime, security, and threads. This is the only package that is automatically imported into every Java program.

java.io Package that provides classes to manage input and output streams to read data from and write data to files, strings, and other sources.

Page 6: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

6

Java packagesjava.util Package that contains miscellaneous utility

classes, including generic data structures, bit sets, time, date, string manipulation, random number generation, system properties, notification, and enumeration of data structures.

java.net Package that provides classes for network support, including URLs, TCP sockets, UDP sockets, IP addresses, and a binary-to-text converter.

Page 7: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

7

Java packagesjava.awt Package that provides an integrated

set of classes to manage user interface components such as windows, dialog boxes, buttons, checkboxes, lists, menus, scrollbars, and text fields. (AWT = Abstract Window Toolkit)

java.awt.image Package that provides classes for managing image data, including color models, cropping, color filtering, setting pixel values, and grabbing snapshots.

Page 8: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

8

Java packages

java.applet Package that enables the creation of appletsthrough the Applet class. It also provides several interfaces that connect an applet to its document and to resources for playing audio.

Page 9: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

9

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)

Page 10: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

10

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

Page 11: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

11

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

Page 12: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

12

Specifica UML

CAccount

# amount: Real

+ debit( v : Real )+ credit( v : Real )

+ public- private# protected

Page 13: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

13

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; }}

Page 14: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

14

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);

Page 15: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

15

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

Page 16: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

16

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.

Page 17: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

17

ContoCorrente: interfaccia

public interface IAccount{

public void debit( double v ); //prelievopublic void credit( double v ); //depositopublic String toString(); //lettura

}

Page 18: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

18

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

Page 19: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

19

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)

Page 20: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

20

Invarianti ed eccezioni

Il valore del conto corrente deve essere sempre superiore a un valore limite prefissato

L'operazione debit non restituisce alcun valore in uscita, e quindi non e' in grado di segnalare una eventuale anomalia al cliente

Page 21: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

21

Eccezioni L'insorgere durante una computazione di eventi anomali,

quali violazioni di asserzioni, errori, esaurimento della memoria, etc. induce normalmente un aborto del programma.

Il concetto di eccezione e i correlati meccanismi di exception handling consentono di continuare l'esecuzione e di gestire l'evento anomalo.

Page 22: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

22

Il modello Resumption

Il controllo delle eccezioni segue un modello simile alla ricezione di un interrupt. – Il flusso normale di controllo e' sospeso per

eseguire l'intervento di gestione dell'evento e poi riprende il normale flusso di controllo e' definitivamente interrotto e trasferito a un exception handler

Page 23: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

23

Il modello Termination

Al manifestarsi di una eccezione, il normale flusso di controllo e' definitivamente interrotto e trasferito a un exception handler

Page 24: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

24

Gestione delle eccezioni in Java

Java (come C++) supporta una semantica di terminazione

il sistema effettua automaticamente lo stack unwinding– dealloca i record di attivazione delle operazioni

attive fino al cliente (in C++ chiama i distruttori degli oggetti in vita sullo stack)

Page 25: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

25

Eccezioni: specifica e generazione

public void op( ... )

throws ExceptionXX{

… throw new ExceptionXX();

}

Page 26: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

26

Eccezioni come oggetti

le eccezioni sono intese come oggetti, istanza di una opportuna gerarchia di exception classes.

La gestione della eccezione segue la metafora lancia un oggetto, e cattura un tipo

Page 27: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

27

Eccezioni: gestione

Un cliente puo' invocare una operazione prevedendo che il servitore possa rispondere sollevando una eccezione:

try { <action call>; }catch( <oggetto> ) {

<exception handling>}

Page 28: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

28

Eccezioni: metodologia

Non bisogna usare le eccezioni come un meccanismo di controllo convenzionale.

Seguendo la metafora "lancia un oggetto, e cattura un tipo" conviene che gli argomenti di catch appartengano a classi di eccezioni appositamente definite.

Page 29: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

29

L’eccezione EOverDrawn

public class EOverDrawn extends Exception{};

Page 30: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

30

Una nuova specifica

public interface IAccount{public void debit( double v )

throws EOverDrawn; //prelievo con eccezionepublic void credit( double v ); //depositopublic String toString(); //lettura}IAccount c1 = new CAccount( 10 );

try{c1.debit( 500 );

}catch( Exception e ){ … }

Page 31: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

31

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; }

Page 32: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

32

Variabili di classe

Sono qualificate static Sono condivise tra tutte le istanze di una

classe Possono essere inizializzate a compile time Sono accessibili dalle normali operazioni

Page 33: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

33

Prelievo con eccezione

//Metodipublic void debit( double v )

throws EOverDrawn;{ double t = amount - v;

if( v > debitLimit ) amount = t; else throw new EOverDrawn();

}//debit

Page 34: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

34

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

Page 35: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

35

Rappresentazione esterna

//Metodi

public String toString(){ return ("conto="+ amount + " EURO\n");

}//toString

}//CAccount

Page 36: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

36

Un main program

//file testCAccount.javapublic class testCAccount{static void prelievo( IAccount c1 ){

try{ c1.debit( 500 );}catch( Exception e ){ System.exit(); }

}// prelievopublic static void main( String[] args ){ IAccount c1 = new CAccount( 10 );CAccount c2 = new CAccount( 20 );IAccount c3 = c2;

c1.credit( 20 ); prelievo(c1, 300);}//main}// testCAccount

Page 37: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

37

Metodi static

Possono essere invocati senza istanziare alcun oggetto– le class sono usabili come singoli oggetti

(moduli)

Non possono accedere a variabili istanza Possono invocare solo altri metodi static

Page 38: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

38

Compilazione ed esecuzione

javac EOverDrawn.java javac IAccount.java javac CAccount.javajavac testAccount.java

java testAccount

Page 39: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

39

Principi supportati

Protezione dell’informazione e minimi privilegi di accesso

Separazione tra specifica e implementazione Barriere di astrazione e indipendenza dalla

rappresentazione Modello client-server e contratti d’uso Componenti come enti che preservano invarianti

Page 40: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

40

La progettazione per il cambiamento

Il ruolo dell’ereditarieta’

Page 41: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

41

Progettazione incrementale

L’ereditarieta’ tra classi apre la via alla specifica incrementale del software

il modello ad oggetti (anche se non completamente specificato) e’ orientato alla progettazione per il cambiamento– i concetti su cui si basa sono usabili in modo seamless

come building blocks in tutte le fasi dello sviluppo del software

Page 42: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

42

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.

Page 43: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

43

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

Page 44: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

44

Ereditarieta’ in Java

Tra interfacce: come meccanismo incrementale di specifica di contratti

Tra classi: come meccanismo di riuso di (specifiche di) implementazioni

Page 45: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

45

Una nuova specifica

Il conto corrente deve contenere una lista dei movimenti effettuati

Invariante:– La lista dei movimenti deve corrispondere alla

sequenza di richieste

Page 46: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

46

Specifica incrementale (IConto)

public interface IConto extends IAccount{

public String log(); //lista movimenti

}//IConto

Page 47: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

47

Ereditarieta’: concetto o meccanismo?

Ereditarieta’ is-a– Se B eredita da A, ogni istanza di B ha le stesse

proprieta’ delle istanze di A

Ereditarieta’ is-like– Se B eredita da A, ogni istanza di B ha in se’ la

struttura e il codice delle istanze di A

Page 48: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

48

Ereditarieta’ tra classi

Una classe derivata eredita – tutti i campi dati (tranne private)

– i metodi public e protected

Una classe derivata non eredita– costruttori

– (in C++) distruttore, costruttore di copia, assegnamento

Page 49: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

49

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

Page 50: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

50

In Java “ogni cosa e’ un object”class java.lang.Object

class java.lang.reflect.Array

class java.lang.ClassLoader

class java.awt.Color (implements java.io.Serializable)

class java.awt.Component

(implements java.awt.image.ImageObserver,

java.awt.MenuContainer, java.io.Serializable)

….

CD

Page 51: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

51

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)

Page 52: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

52

Vincoli imposti dalle relazioni sui tipi

Un sottotipo T1 di un tipo T introduce vincoli addizionali alla specifica di T – A T1 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

Page 53: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

53

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.

Page 54: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

54

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?

Page 55: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

55

IComplex

IReal X

Y

Page 56: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

56

IParolaP

AB

parolaLimitata

parolaNonLimitata

IParola p1 = new A(..);p1.charAt( 3 );

P p2=new B(…);p2.charAt(…);

P p2=new P(…);p2.charAt(…);

Page 57: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

57

IParolaP

AB

parolaLimitata

parolaNonLimitata

public char head(){return charAt( 1 );

}

IParola p1 = new A(..);char x = p1.head( );

Page 58: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

58

Realizzazione incrementale (CConto)

public class CConto extends CAccount implements IConto{

// eredita struttura e operazioni di CAccount// accede alle variabili di CAccount

// specializza le vecchie operazioni // realizza le nuove operazioni di IConto

Page 59: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

59

Realizzazione incrementale// specializza le vecchie operazioni

public void credit( double v ){ logObj.addElement(“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

Page 60: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

60

Qualificatori di accesso

public private protected

nessuno: per Java vi e’ una visibilita’ a

livello di package

Page 61: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

61

Realizzazione incrementale

// specializza le vecchie operazioni

public void credit( double v ){ logObj.add(“credit “+ v );

super.credit( v );}//credit

Si riusa l’operazione precedente

Page 62: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

62

Realizzazione incrementale

public void debit( double v ) throws EOverDrawn{//rispeciifca completa per inserire anche il log delle eccezionidouble newamount = amount - v; if ( newamount >= getLimit() ) { //per maggior riuso

amount = newamount;logObj.addElement( new Movimento("prelievo: "+

getTime(), v) ); }else {

logObj.addElement( new Movimento("prelievo rifiutato: "+getTime(), v) );

throw new EOverDrawn();}

}//debit

Page 63: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

63

Realizzazione incrementale

// realizza le nuove operazioni di IConto

Vector logObj = new Vector(10,5);

public String log(){ String s =“”; for(int i = 0; i < logObj.size(); i++ )

s=s+logObj.elementAt(i).toString()+"\n";

}//log

}//CConto

Page 64: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

64

Una operazione polimorfica

static void prelievo( IAccount c1, double v){try{ c1.debit( v );}catch( Exception e ){

System.out.println("ERROR: " + e );System.exit(-1);

} }//prelievo

E’ possibile trasferire come valori a c1 oggetti di classeCAccount o di una qualsiasi sua sottoclasse (CConto)

Page 65: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

65

Java vs. C++

static void prelievo( CAccount c1,...)

In C++ questa operazione 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

Page 66: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

66

Il problema della costruzione

La costruzione di un oggetto procede in due fasi:– costruzione della parte ereditata dalla classe

base (e ricorsivamente dalle superclassi)– costruzione della parte specifica

Page 67: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

67

Il problema della costruzione

La costruzione della parte ereditata puo’ essere indotta– esplicitamente con super( … )– implicitamente (il sistema chiama il costruttore

a zero argomenti della classe base) Java NON disattiva (come fa il C++) il

meccanismo del late binding entro i costruttori

Page 68: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

68

Tecnica errata di costruzione

public CConto( double v ){

super( v );System.out.println("costruito il CConto: " + this );

}

Produce un errore a tempo di esecuzione– il costruttore della classe base invoca la

versione specializzata di credit che accede a una variabile logObj non ancora esistente

Page 69: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

69

Costruzione

public CConto( double v ){

amount = 0;

credit( v ); //late binding

System.out.println("costruito il CConto: " + this );

}

Page 70: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

70

Un nuovo test

public static void main( String[] args ){

CConto c0 = new CConto( 20 );

IConto c1 = c0;

c1.credit( 20 );

prelievo( c1, 10 );

prelievo( c1, 3000 );

System.out.println("movimenti del conto c1: \n" + c1.log() );

}//main

Page 71: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

71

Risultati

costruttore di default di CAccount: conto=0.0 EUROcostruito il CConto: conto=20.0 EURO

ERROR: account.EOverDrawnmovimenti del conto c1:deposito: 132/19:1:12 di 20.0 EUROdeposito: 132/19:1:12 di 20.0 EUROprelievo: 132/19:1:12 di 10.0 EUROprelievo rifiutato: 132/19:1:12 di 3000.0 EURO

Page 72: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

72

Tecniche di progetto oo

Dai meccanismi ai sistemi

Page 73: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

73

Tecniche elementari di progetto

Operazioni “aperte” Operazioni primitive (dipendenti dalla

rappresentazione) e non Classi astratte Wrapping

Page 74: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

74

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

Page 75: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

75

m2

m1

m2

Barriera di astrazione

Page 76: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

76

null: -> listcons : element, list -> list

a, [ 1, 2 ] -> [a,1,2]head: list -> element

head([a,1,2]) -> atail: list -> list

tail ([a,1,2]) -> [1,2]isEmpty list -> boolean

Liste: primitive

Page 77: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

77

Delete: element el, list l1 -> list

if( isEmpty(l1) ) return l1;if( equal( head(l1), el ) return

delete( el, tail(l1) );return cons(head(l1),

delete( el, tail(l1) );

Eliminazione di un elemento

Page 78: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

78

Operazioni non primitive

list insOrd(list l1, listData x){

if ( l1.empty() ) return nl.addFirst( x );

else

if ( x.less( l1.head() ) return l1.addFirst(x);

else return insOrd( l1.tail(),x).addFirst(x);

}//insOrd

Page 79: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

79

Classi astratte

Introdotte come specifiche (operazionali) Non possono essere istanziate Devono essere specializzate da sottoclassi Possono includere operazioni non primitive

Page 80: Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.

Principi OOP A.Natali Aprile 1999

80

Wrapping

Tecnica usata per organizzare in Java il sottosistema di I/O