Principi OOP A.Natali Aprile Principi di oop Dai costrutti alle metodologie
Principi OOP A.Natali Aprile Costrutti Java u Dati primitivi e strutture di controllo: – identiche a quelle del linguaggio C u Interfacce –come specifiche contrattuali u Classi –come moduli /come specifiche della struttura e del comportamento di oggetti u Packages –come contenitori
Principi OOP A.Natali Aprile Architettura di riferimento u 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 API Packages u Elenco JDK 1.2.1JDK 1.2.1
Principi OOP A.Natali Aprile Java packages java.langjava.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.iojava.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 Java packages java.utiljava.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.netjava.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 Java packages java.awtjava.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.imagejava.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 Java packages java.appletjava.applet Package that enables the creation of applets through 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 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)
Principi OOP A.Natali Aprile 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
Principi OOP A.Natali Aprile 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
Principi OOP A.Natali Aprile Specifica UML CAccount # amount: Real + debit( v : Real ) + credit( v : Real ) + public - private # protected
Principi OOP A.Natali Aprile 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; } }
Principi OOP A.Natali Aprile 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);
Principi OOP A.Natali Aprile 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
Principi OOP A.Natali Aprile 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.
Principi OOP A.Natali Aprile ContoCorrente: interfaccia public interface IAccount{ public void debit( double v ); //prelievo public void credit( double v ); //deposito public String toString(); //lettura }
Principi OOP A.Natali Aprile 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
Principi OOP A.Natali Aprile 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)
Principi OOP A.Natali Aprile Invarianti ed eccezioni u Il valore del conto corrente deve essere sempre superiore a un valore limite prefissato u 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 Eccezioni u L'insorgere durante una computazione di eventi anomali, quali violazioni di asserzioni, errori, esaurimento della memoria, etc. induce normalmente un aborto del programma. u 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 Il modello Resumption u 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 Il modello Termination u Al manifestarsi di una eccezione, il normale flusso di controllo e' definitivamente interrotto e trasferito a un exception handler
Principi OOP A.Natali Aprile Gestione delle eccezioni in Java u Java (come C++) supporta una semantica di terminazione u 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 Eccezioni: specifica e generazione public void op(... ) throws ExceptionXX{ … throw new ExceptionXX(); }
Principi OOP A.Natali Aprile Eccezioni come oggetti u le eccezioni sono intese come oggetti, istanza di una opportuna gerarchia di exception classes. u La gestione della eccezione segue la metafora lancia un oggetto, e cattura un tipo
Principi OOP A.Natali Aprile Eccezioni: gestione u Un cliente puo' invocare una operazione prevedendo che il servitore possa rispondere sollevando una eccezione: try { ; } catch( ) { }
Principi OOP A.Natali Aprile Eccezioni: metodologia u Non bisogna usare le eccezioni come un meccanismo di controllo convenzionale. u 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 Leccezione EOverDrawn public class EOverDrawn extends Exception{};
Principi OOP A.Natali Aprile Una nuova specifica public interface IAccount{ public void debit( double v ) throws EOverDrawn; //prelievo con eccezione public void credit( double v ); //deposito public String toString(); //lettura } IAccount c1 = new CAccount( 10 ); try{ c1.debit( 500 ); }catch( Exception e ){ … }
Principi OOP A.Natali Aprile 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 Variabili di classe Sono qualificate static u Sono condivise tra tutte le istanze di una classe u Possono essere inizializzate a compile time u Sono accessibili dalle normali operazioni
Principi OOP A.Natali Aprile Prelievo con eccezione //Metodi public 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 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 Rappresentazione esterna //Metodi public String toString(){ return ("conto="+ amount + " EURO\n"); }//toString }//CAccount
Principi OOP A.Natali Aprile Un main program //file testCAccount.java public class testCAccount{ static void prelievo( IAccount c1 ){ try{c1.debit( 500 ); }catch( Exception e ){ System.exit(); } }// prelievo public 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 Metodi static u Possono essere invocati senza istanziare alcun oggetto –le class sono usabili come singoli oggetti (moduli) u Non possono accedere a variabili istanza u Possono invocare solo altri metodi static
Principi OOP A.Natali Aprile Compilazione ed esecuzione javac EOverDrawn.java javac IAccount.java javac CAccount.java javac testAccount.java java testAccount
Principi OOP A.Natali Aprile Principi supportati u Protezione dellinformazione e minimi privilegi di accesso u Separazione tra specifica e implementazione u Barriere di astrazione e indipendenza dalla rappresentazione u Modello client-server e contratti duso u Componenti come enti che preservano invarianti
Principi OOP A.Natali Aprile La progettazione per il cambiamento Il ruolo dellereditarieta
Principi OOP A.Natali Aprile Progettazione incrementale u Lereditarieta tra classi apre la via alla specifica incrementale del software u il modello ad oggetti (anche se non completamente specificato) e orientato alla progettazione per il cambiamentomodello ad oggetti –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 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 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
Principi OOP A.Natali Aprile Ereditarieta in Java u Tra interfacce: come meccanismo incrementale di specifica di contratti u Tra classi: come meccanismo di riuso di (specifiche di) implementazioni
Principi OOP A.Natali Aprile 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
Principi OOP A.Natali Aprile Specifica incrementale (IConto) public interface IConto extends IAccount{ public String log(); //lista movimenti }//IConto
Principi OOP A.Natali Aprile Ereditarieta: concetto o meccanismo? u Ereditarieta is-a –Se B eredita da A, ogni istanza di B ha le stesse proprieta delle istanze di A u 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 Ereditarieta tra classi u Una classe derivata eredita –tutti i campi dati (tranne private) –i metodi public e protected u Una classe derivata non eredita –costruttori –(in C++) distruttore, costruttore di copia, assegnamento
Principi OOP A.Natali Aprile 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
Principi OOP A.Natali Aprile In Java ogni cosa e un object class java.lang.ObjectObject class java.lang.reflect.ArrayArray class java.lang.ClassLoaderClassLoader class java.awt.Color (implements java.io.Serializable)ColorSerializable class java.awt.ComponentComponent (implements java.awt.image.ImageObserver,ImageObserver java.awt.MenuContainer, java.io.Serializable)MenuContainerSerializable …. CD
Principi OOP A.Natali Aprile 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)
Principi OOP A.Natali Aprile Vincoli imposti dalle relazioni sui tipi u 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 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.
Principi OOP A.Natali Aprile 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?
Principi OOP A.Natali Aprile IComplex IReal X Y
Principi OOP A.Natali Aprile IParola P A B 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 IParola P A B parolaLimitata parolaNonLimitata public char head(){ return charAt( 1 ); } IParola p1 = new A(..); char x = p1.head( );
Principi OOP A.Natali Aprile Realizzazione incrementale (CConto) public class CConto extends CAccount implements IConto{IConto // eredita struttura e operazioni di CAccountCAccount // accede alle variabili di CAccount // specializza le vecchie operazioni // realizza le nuove operazioni di IConto IConto
Principi OOP A.Natali Aprile Realizzazione incrementale // specializza le vecchie operazioni public void credit( double v ){ logObj.addElement(credit + v ); amount += v; //MEGLIO DI NO!! }//credit u 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 Qualificatori di accesso u public u private u protected nessuno: per Java vi e una visibilita a livello di package
Principi OOP A.Natali Aprile Realizzazione incrementale // specializza le vecchie operazioni public void credit( double v ){ logObj.add(credit + v ); super.credit( v ); }//credit Si riusa loperazione precedente
Principi OOP A.Natali Aprile Realizzazione incrementale public void debit( double v ) throws EOverDrawn{EOverDrawn //rispeciifca completa per inserire anche il log delle eccezioni double 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();EOverDrawn } }//debit
Principi OOP A.Natali Aprile Realizzazione incrementale // realizza le nuove operazioni di IConto 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 Una operazione polimorfica static void prelievo( IAccount c1, double v){IAccount 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 classe CAccountCAccount o di una qualsiasi sua sottoclasse (CConto)CConto
Principi OOP A.Natali Aprile Java vs. C++ static void prelievo( CAccount c1,...) u 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 Il problema della costruzione u 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 Il problema della costruzione u La costruzione della parte ereditata puo essere indotta –esplicitamente con super( … ) –implicitamente (il sistema chiama il costruttore a zero argomenti della classe base) u Java NON disattiva (come fa il C++) il meccanismo del late binding entro i costruttori
Principi OOP A.Natali Aprile Tecnica errata di costruzione public CConto( double v ){ super( v ); System.out.println("costruito il CConto: " + this ); } u 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 Costruzione public CConto( double v ){ amount = 0; credit( v );//late binding System.out.println("costruito il CConto: " + this ); }
Principi OOP A.Natali Aprile 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 Risultati costruttore di default di CAccount: conto=0.0 EURO costruito il CConto: conto=20.0 EURO ERROR: account.EOverDrawn movimenti del conto c1: deposito: 132/19:1:12 di 20.0 EURO prelievo: 132/19:1:12 di 10.0 EURO prelievo rifiutato: 132/19:1:12 di EURO
Principi OOP A.Natali Aprile Tecniche di progetto oo Dai meccanismi ai sistemi
Principi OOP A.Natali Aprile Tecniche elementari di progetto u Operazioni aperte u Operazioni primitive (dipendenti dalla rappresentazione) e non u Classi astratte u Wrapping
Principi OOP A.Natali Aprile Operazioni aperte A + m1( v : Real ) + m2( v : Real ) B m1 chiama m2 il funzionamento di m1 dipende dalloggetto che la sta eseguendo
Principi OOP A.Natali Aprile m2 m1 m2 Barriera di astrazione
Principi OOP A.Natali Aprile null:-> list cons : element, list -> list a, [ 1, 2 ] -> [a,1,2] head: list -> element head([a,1,2]) -> a tail: list -> list tail ([a,1,2]) -> [1,2] isEmpty list -> boolean Liste: primitive
Principi OOP A.Natali Aprile 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 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 Classi astratte u Introdotte come specifiche (operazionali) u Non possono essere istanziate u Devono essere specializzate da sottoclassi u Possono includere operazioni non primitive
Principi OOP A.Natali Aprile Wrapping u Tecnica usata per organizzare in Java il sottosistema di I/O sottosistema di I/O