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

Post on 01-May-2015

215 views 0 download

Transcript of 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

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

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

Principi OOP A.Natali Aprile 1999

4

API Packages

Elenco JDK 1.2.1

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.

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.

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.

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.

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)

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

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

Principi OOP A.Natali Aprile 1999

12

Specifica UML

CAccount

# amount: Real

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

+ public- private# protected

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

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

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

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.

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

}

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

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)

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

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.

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

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

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)

Principi OOP A.Natali Aprile 1999

25

Eccezioni: specifica e generazione

public void op( ... )

throws ExceptionXX{

… throw new ExceptionXX();

}

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

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

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.

Principi OOP A.Natali Aprile 1999

29

L’eccezione EOverDrawn

public class EOverDrawn extends Exception{};

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 ){ … }

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

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

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

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

Principi OOP A.Natali Aprile 1999

35

Rappresentazione esterna

//Metodi

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

}//toString

}//CAccount

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

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

Principi OOP A.Natali Aprile 1999

38

Compilazione ed esecuzione

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

java testAccount

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

Principi OOP A.Natali Aprile 1999

40

La progettazione per il cambiamento

Il ruolo dell’ereditarieta’

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

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.

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

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

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

Principi OOP A.Natali Aprile 1999

46

Specifica incrementale (IConto)

public interface IConto extends IAccount{

public String log(); //lista movimenti

}//IConto

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

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

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

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

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)

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

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.

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?

Principi OOP A.Natali Aprile 1999

55

IComplex

IReal X

Y

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

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

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

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

Principi OOP A.Natali Aprile 1999

60

Qualificatori di accesso

public private protected

nessuno: per Java vi e’ una visibilita’ a

livello di package

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

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

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

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)

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

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

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

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

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

}

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

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

Principi OOP A.Natali Aprile 1999

72

Tecniche di progetto oo

Dai meccanismi ai sistemi

Principi OOP A.Natali Aprile 1999

73

Tecniche elementari di progetto

Operazioni “aperte” Operazioni primitive (dipendenti dalla

rappresentazione) e non Classi astratte Wrapping

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

Principi OOP A.Natali Aprile 1999

75

m2

m1

m2

Barriera di astrazione

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

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

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

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

Principi OOP A.Natali Aprile 1999

80

Wrapping

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