La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "Principi OOP A.Natali Aprile 19991 Principi di oop Dai costrutti alle metodologie."— Transcript della presentazione:

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

2 Principi OOP A.Natali Aprile 19992 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

3 Principi OOP A.Natali Aprile 19993 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

4 Principi OOP A.Natali Aprile 19994 API Packages u Elenco JDK 1.2.1JDK 1.2.1

5 Principi OOP A.Natali Aprile 19995 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.

6 Principi OOP A.Natali Aprile 19996 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.

7 Principi OOP A.Natali Aprile 19997 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.

8 Principi OOP A.Natali Aprile 19998 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.

9 Principi OOP A.Natali Aprile 19999 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)

10 Principi OOP A.Natali Aprile 199910 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

11 Principi OOP A.Natali Aprile 199911 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

12 Principi OOP A.Natali Aprile 199912 Specifica UML CAccount # amount: Real + debit( v : Real ) + credit( v : Real ) + public - private # protected

13 Principi OOP A.Natali Aprile 199913 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; } }

14 Principi OOP A.Natali Aprile 199914 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);

15 Principi OOP A.Natali Aprile 199915 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

16 Principi OOP A.Natali Aprile 199916 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.

17 Principi OOP A.Natali Aprile 199917 ContoCorrente: interfaccia public interface IAccount{ public void debit( double v ); //prelievo public void credit( double v ); //deposito public String toString(); //lettura }

18 Principi OOP A.Natali Aprile 199918 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

19 Principi OOP A.Natali Aprile 199919 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)

20 Principi OOP A.Natali Aprile 199920 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

21 Principi OOP A.Natali Aprile 199921 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.

22 Principi OOP A.Natali Aprile 199922 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

23 Principi OOP A.Natali Aprile 199923 Il modello Termination u Al manifestarsi di una eccezione, il normale flusso di controllo e' definitivamente interrotto e trasferito a un exception handler

24 Principi OOP A.Natali Aprile 199924 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)

25 Principi OOP A.Natali Aprile 199925 Eccezioni: specifica e generazione public void op(... ) throws ExceptionXX{ … throw new ExceptionXX(); }

26 Principi OOP A.Natali Aprile 199926 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

27 Principi OOP A.Natali Aprile 199927 Eccezioni: gestione u Un cliente puo' invocare una operazione prevedendo che il servitore possa rispondere sollevando una eccezione: try { ; } catch( ) { }

28 Principi OOP A.Natali Aprile 199928 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.

29 Principi OOP A.Natali Aprile 199929 Leccezione EOverDrawn public class EOverDrawn extends Exception{};

30 Principi OOP A.Natali Aprile 199930 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 ){ … }

31 Principi OOP A.Natali Aprile 199931 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; }

32 Principi OOP A.Natali Aprile 199932 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

33 Principi OOP A.Natali Aprile 199933 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

34 Principi OOP A.Natali Aprile 199934 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

35 Principi OOP A.Natali Aprile 199935 Rappresentazione esterna //Metodi public String toString(){ return ("conto="+ amount + " EURO\n"); }//toString }//CAccount

36 Principi OOP A.Natali Aprile 199936 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

37 Principi OOP A.Natali Aprile 199937 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

38 Principi OOP A.Natali Aprile 199938 Compilazione ed esecuzione javac EOverDrawn.java javac IAccount.java javac CAccount.java javac testAccount.java java testAccount

39 Principi OOP A.Natali Aprile 199939 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

40 Principi OOP A.Natali Aprile 199940 La progettazione per il cambiamento Il ruolo dellereditarieta

41 Principi OOP A.Natali Aprile 199941 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

42 Principi OOP A.Natali Aprile 199942 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.

43 Principi OOP A.Natali Aprile 199943 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

44 Principi OOP A.Natali Aprile 199944 Ereditarieta in Java u Tra interfacce: come meccanismo incrementale di specifica di contratti u Tra classi: come meccanismo di riuso di (specifiche di) implementazioni

45 Principi OOP A.Natali Aprile 199945 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

46 Principi OOP A.Natali Aprile 199946 Specifica incrementale (IConto) public interface IConto extends IAccount{ public String log(); //lista movimenti }//IConto

47 Principi OOP A.Natali Aprile 199947 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

48 Principi OOP A.Natali Aprile 199948 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

49 Principi OOP A.Natali Aprile 199949 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

50 Principi OOP A.Natali Aprile 199950 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

51 Principi OOP A.Natali Aprile 199951 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)

52 Principi OOP A.Natali Aprile 199952 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

53 Principi OOP A.Natali Aprile 199953 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.

54 Principi OOP A.Natali Aprile 199954 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?

55 Principi OOP A.Natali Aprile 199955 IComplex IReal X Y

56 Principi OOP A.Natali Aprile 199956 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(…);

57 Principi OOP A.Natali Aprile 199957 IParola P A B parolaLimitata parolaNonLimitata public char head(){ return charAt( 1 ); } IParola p1 = new A(..); char x = p1.head( );

58 Principi OOP A.Natali Aprile 199958 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

59 Principi OOP A.Natali Aprile 199959 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

60 Principi OOP A.Natali Aprile 199960 Qualificatori di accesso u public u private u protected nessuno: per Java vi e una visibilita a livello di package

61 Principi OOP A.Natali Aprile 199961 Realizzazione incrementale // specializza le vecchie operazioni public void credit( double v ){ logObj.add(credit + v ); super.credit( v ); }//credit Si riusa loperazione precedente

62 Principi OOP A.Natali Aprile 199962 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

63 Principi OOP A.Natali Aprile 199963 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

64 Principi OOP A.Natali Aprile 199964 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

65 Principi OOP A.Natali Aprile 199965 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

66 Principi OOP A.Natali Aprile 199966 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

67 Principi OOP A.Natali Aprile 199967 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

68 Principi OOP A.Natali Aprile 199968 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

69 Principi OOP A.Natali Aprile 199969 Costruzione public CConto( double v ){ amount = 0; credit( v );//late binding System.out.println("costruito il CConto: " + this ); }

70 Principi OOP A.Natali Aprile 199970 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

71 Principi OOP A.Natali Aprile 199971 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 3000.0 EURO

72 Principi OOP A.Natali Aprile 199972 Tecniche di progetto oo Dai meccanismi ai sistemi

73 Principi OOP A.Natali Aprile 199973 Tecniche elementari di progetto u Operazioni aperte u Operazioni primitive (dipendenti dalla rappresentazione) e non u Classi astratte u Wrapping

74 Principi OOP A.Natali Aprile 199974 Operazioni aperte A + m1( v : Real ) + m2( v : Real ) B m1 chiama m2 il funzionamento di m1 dipende dalloggetto che la sta eseguendo

75 Principi OOP A.Natali Aprile 199975 m2 m1 m2 Barriera di astrazione

76 Principi OOP A.Natali Aprile 199976 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

77 Principi OOP A.Natali Aprile 199977 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

78 Principi OOP A.Natali Aprile 199978 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

79 Principi OOP A.Natali Aprile 199979 Classi astratte u Introdotte come specifiche (operazionali) u Non possono essere istanziate u Devono essere specializzate da sottoclassi u Possono includere operazioni non primitive

80 Principi OOP A.Natali Aprile 199980 Wrapping u Tecnica usata per organizzare in Java il sottosistema di I/O sottosistema di I/O


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

Presentazioni simili


Annunci Google