Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie.
-
Upload
antonino-salvadori -
Category
Documents
-
view
215 -
download
0
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