Perché paradigmi diversi? Programmazione ad Oggetti • Esistono numerose metodologie per lo sviluppo di software, che dipendono dalle applicazioni (studiate in Ingegneria del Software) (BREVE CORSO INTRODUTTIVO) • La scelta opportuna di un linguaggio di programmazione può favorire l'adozione di una metodologia e facilitare la soluzione di un problema Matteo Baldoni Dipartimento di Informatica - Universita` degli Studi di Torino C.so Svizzera, 185 - I-10149 Torino (Italy) e-mail: [email protected] - URL: http://www.di.unito.it/~baldoni Programmazione ad Oggetti Astrazione Il ruolo dell'astrazione • Astrazione: identificare le proprietà importanti di un fenomeno, trascurando quelle irrilevanti • Un programma realizza delle astrazioni. E' essenziale concentrarsi solo sulle proprietà rilevanti del fenomeno che si vuole modellare • La mente umana può ricordare solo pochi concetti contemporaneamente • Un linguaggio di programmazione deve esser il più possibile svincolato dalla macchina su cui viene eseguito, ed essere vicino al problema da risolvere • Un linguaggio di programmazione deve fornire strumenti che facilitino lo sviluppo di astrazioni. In particolare: – astrazioni sulle operazioni (procedure) – astrazioni sui dati (moduli, tipi di dati astratti, classi) • Lo sviluppo di un programma può procedere per livelli di raffinamento successivo delle astrazioni Programmazione ad Oggetti 2 Programmazione ad Oggetti 3 Paradigmi 4 Alcuni linguaggi Prolog • Linguaggi imperativi: basati sulle nozioni di variabili e assegnamento - realizzano un astrazione sull'architettura delle macchine Lisp Scheme ML Simula67 Miranda Smalltalk Java C++ • Linguaggi funzionali e logici: basati su modelli astratti di computazione derivati da teorie formali (funzioni ricorsive, logica) Cobol C Algol Pascal Ada Modula2 Fortran 1960 Programmazione ad Oggetti 5 1970 1980 Programmazione ad Oggetti 1990 2000 6 1 Linguaggi ad oggetti Programmazione ad oggetti • I linguaggi di programmazione ad oggetti consentono di applicare metodologie di sviluppo di programmi "object oriented", ossia basate sugli oggetti (dati) che il sistema software manipola. • In molti casi l'organizzazione ad oggetti risulta la più naturale perché rispecchia in modo diretto il mondo che si vuole rappresentare: – simulazione (automobili, semafori, aerei, …) – software grafico (finestre, bottoni, menu, …) • Questa metodologia si contrappone a quella più tradizionale di sviluppare un programma secondo un approccio funzionale (programmazione strutturata). Programmazione ad Oggetti • Progetto object oriented di software: costruzione di sistemi software come collezioni strutturate di implementazioni di tipi di dati astratti (B. Meyer) Programmazione ad Oggetti 7 I principali linguaggi ad oggetti 8 Caratteristiche dei linguaggi ad oggetti Sette passi verso la felicità (secondo B. Meyer) 1. Struttura modulare basata sugli oggetti. • Simula: progettato nel 1967 - capostipite dei linguaggi ad oggetti • Smalltalk: linguaggio ad oggetti "puro" - linguaggio "dinamico” non c'è controllo statico dei tipi 3. Gestione automatica della memoria. (garbage collection) • C++: linguaggio "ibrido" - garantisce la compatibilità con il C • Java: il più recente. Programmazione ad Oggetti 2. Gli oggetti sono implementazioni di tipi di dati astratti. 4. Classi. Ogni tipo non semplice è un modulo, e ogni modulo ad alto livello è un tipo. Programmazione ad Oggetti 9 Caratteristiche dei linguaggi ad oggetti 10 Java • Le caratteristiche principali di Java 5. Ereditarietà. Una classe può essere definita come estensione o restrizione di un'altra. • Object oriented: – progettato per essere un linguaggio ad oggetti, anche se meno puro di Smalltalk 6. Polimorfismo e binding dinamico. Possibilità di fare riferimento ad oggetti di più di una classe. • Robusto – non ci sono puntatori Le operazioni possono avere realizzazioni diverse in classi diverse. – garbage collection • Distribuito 7. Ereditarietà multipla. Possibilità di ereditare da più di una classe. Programmazione ad Oggetti – costrutti per la concorrenza 11 Programmazione ad Oggetti 12 2 Sommario della presentazione Java • Indipendente dall'architettura • • • • • • Ogni oggetto ha un’interfaccia Ogni oggetto ha un tipo Riuso del software: composizione Riuso del software: ereditarieta` Polimorfismo e binding dinamico Gli oggetti prima di tutto: GUI, Event-driven programming e l’architettura modello-vistacontrollore • Java: dove e come • Java oltre: Applet, Servlet , RMI, ... – il compilatore genera codice intermedio (bytecode) che viene interpretato • Applicazioni su internet – applet – sicurezza • Ambiente ricco di tipi di dati predefiniti – grafica – programmazione su internet – accesso a database Programmazione ad Oggetti 13 Programmazione ad Oggetti 14 Oggetti Un oggetto rappresenta un dato, ed è costituito da Ogni oggetto ha un’interfaccia e ogni oggetto ha un tipo Programmazione ad Oggetti • stato: collezione di variabili • comportamento: collezione di operazioni (metodi) Esempio - contatore STATO int c; METODI void iniz(int i) void incr() void decr() int val() 15 Incapsulamento inizializza il contatore a i incrementa il contatore di 1 decrementa il contatore di 1 restituisce il valore del contatore Programmazione ad Oggetti 16 Contatore • I dati e le procedure che li manipolano sono raggruppati in un’unica entità, l’oggetto. • Il mondo esterno ha accesso ai dati solo tramite un insieme di operazioni (metodi) che costituiscono l’interfaccia dell’oggetto. I dettagli dell’implementazione sono nascosti (INFORMATION HIDING) void iniz(int i) void incr() void decr() int val() int c; void iniz(int i) {c=1;} void incr() {++c;} void decr() {--c;} int val() {return c;} INTERFACCIA IMPLEMENTAZIONE CONTATORE • Un oggetto realizza una ASTRAZIONE DEI DATI Programmazione ad Oggetti 17 Programmazione ad Oggetti 18 3 Invio di Messaggi Invio di Messaggi • Un programma è costituito da un insieme di oggetti. • Gli oggetti sono dinamici - creati e distrutti durante l'esecuzione del programma. • Un oggetto A, per agire su un altro oggetto B, invia un messaggio a B chiedendogli di eseguire uno dei metodi della sua interfaccia. finestra display contatore invia valore di c 0 c esegui incr() Es.: esegui il metodo m1 bottone 3 bottone 1 bottone 2 • Lo scambio di messaggi è l'unico modo di comunicare tra oggetti Programmazione ad Oggetti Programmazione ad Oggetti 19 Invio di Messaggi Invio di Messaggi • invio di messaggio = invocazione di un metodo • In Java, e altri linguaggi, si usa la notazione con il punto: oggetto.metodo(…) cont1 3 • In un linguaggio tradizionale, per eseguire una operazione su un dato, dovremmo passare il dato come parametro: – incr(cont1) o iniz(cont1, 3) int x,y; cont1.incr(); cont2.decr(); x = cont1.val(); y = cont2.val(); • Nella programmazione ad oggetti, invece, l'oggetto su cui si esegue una operazione non viene passato come parametro, perché figura già come destinatario del messaggio (può essere considerato come un parametro implicito) – cont1.incr() o cont1.iniz(3) cont2 10 20 x ha valore 4 e y ha valore 9 Programmazione ad Oggetti Programmazione ad Oggetti 21 Classi 22 Classi (Java) • I più diffusi linguaggi ad oggetti sono basati sul concetto di classe come insieme di oggetti con struttura e comportamento simili • La classe definisce un tipo • Istanza di una classe = oggetto della classe • Una classe realizza l'implementazione di un tipo di dato astratto. • In Java: class Contatore { int c; void iniz(int i) {c = i;} void incr() {++c;} void decr() {--c;} int val() {return c;} } Istanze cont1 cont2 3 Programmazione ad Oggetti 10 23 Programmazione ad Oggetti 24 4 Classi (Java) Variabili private (Java) • Per realizzare information hiding si usano le parole riservate – public - interfaccia – private - implementazione • Per il momento trascuriamo questo aspetto class Contatore { private int c; public void iniz(int i) {c = i;} public void incr() {++c;} public void decr() {--c;} public int val() {return c;} } Programmazione ad Oggetti class Contatore { private int c; public void iniz(int i) {c = i;} public void incr() {++c;} public void decr() {--c;} public int val() {return c;} } • Si noti che, se la variabile c fosse public, il metodo val sarebbe inutile: per conoscere il valore di un contatore cont basterebbe usare cont.c • Tuttavia è buna norma di programmazione impedire l’accesso diretto alle variabili di un oggetto, dichiarandole private. Programmazione ad Oggetti 25 Tipi Tipi di dato primitivi (Java) • Java è un linguaggio tipato: tutte le variabili hanno un tipo. • Il tipo di una variabile deve sempre essere dichiarato e può essere: – una classe – un tipo primitivo Contatore cont; int x,y; char ch; Programmazione ad Oggetti 27 Come si crea un’istanza • Java fornisce diversi tipi semplici primitivi. • A differenza di altri linguaggi, la dimensione dei tipi numerici è fissata per consentire la portabilità dei programmi: – – – – – – – – byte short int long float double char boolean 8 16 32 64 32 64 16 bit bit bit bit bit bit bit (Unicode) Programmazione ad Oggetti 28 Gestione della memoria • new Contatore() • Nella maggior parte dei linguaggi di programmazione le attivazioni di procedure sono gestite con uno stack (pila) • Crea un nuovo oggetto di tipo Contatore e ne restituisce il puntatore (handle) • Quando una procedura è chiamata, si inserisce un record di attivazione in cima alla pila, e lo si toglie quando l'esecuzione della procedura termina • Tutti gli oggetti sono allocati dinamicamente (quando si esegue la new) e sono manipolati attraverso una handle (puntatore) (assegnamento, passaggio di parametri) Programmazione ad Oggetti 26 29 • Un record di attivazione contiene le informazioni sul controllo (indirizzo di ritorno) ed i dati locali • Possibilità di chiamate ricorsive di procedure Programmazione ad Oggetti 30 5 Gestione della memoria Recupero della memoria STATICA dati globali • Garbage collection (Scheme, Prolog, Java) STACK record di attivaz. dati locali Codice • Il programmatore può solo allocare dati dinamici • Una procedura di sistema, il garbage collector, si preoccupa di recuperare tutte le aree di memoria nello heap non più raggiungibili in modo da poterle riutilizzare • Altri linguaggi come Pascal o C lasciano al programmatore la responsabilità di recuperare la memoria, con possibilità di commettere errori HEAP dati dinamici Programmazione ad Oggetti 31 Allocazione dinamica Contatore cont1, cont2; Programmazione ad Oggetti 32 Allocazione dinamica Contatore cont1, cont2; cont1 = new Contatore(); cont2 = new Contatore(); cont1.iniz(3); cont2.iniz(10); cont1 cont2 cont1 cont2 3 10 HEAP Programmazione ad Oggetti 33 Allocazione dinamica Contatore cont1, cont2; cont1 = new Contatore(); cont2 = new Contatore(); cont1.iniz(3); cont2.iniz(10); cont2 = cont1; Programmazione ad Oggetti 34 Puntatori (Java) • In Java non esistono puntatori espliciti cont1 cont2 Contatore cont; 3 • Fino a quando non si esegue una new, la variabile cont non è associata a nessun oggetto • Viceversa in C++ si può dichiarare Questo oggetto non è più accessibile. Può essere recuperato dal garbage collector. sia Contatore cont1; sia Contatore *cont2; 10 • cont1 è associato ad un contatore creato "staticamente”, cont2 è associato ad un contatore creato dinamicamente (vedi Java) HEAP Programmazione ad Oggetti 35 Programmazione ad Oggetti 36 6 Come si inizializza un oggetto • Si può chiamare esplicitamente un metodo di inizializzazione: Contatore cont1; cont1 = new Contatore(); cont1.iniz(3); 37 Overloading di metodi (e costruttori) Contatore cont; cont = new Contatore(3); int x = 10; cont x 3 • Esistono classi wrapper che trasformano tipi semplici in oggetti 39 THIS HEAP Programmazione ad Oggetti 40 Programmi in Java • Come può un oggetto mandare un messaggio a se stesso, ossia invocare un proprio metodo? • Con la parola chiave this • Un programma in Java è una collezione di classi • Una di queste deve contenere un metodo main • L'esecuzione inizia dal main • Il metodo main deve essere statico, perché altrimenti bisognerebbe creare un oggetto della classe Esempio prima di poterlo eseguire In alcuni casi this è indispensabile class Esempio { public static void main(String arg[]) { System.out.println("questo è un esempio"); } } si può anche scrivere solo p() this viene aggiunto dal compilatore Programmazione ad Oggetti 38 • I tipi semplici, come ad es. gli interi, non vengono allocati dinamicamente nello heap, a differenza di altri linguaggi "puri" come Smalltalk class Contatore { int c; Contatore() {c = 0;} Contatore(int i) {c = i;} void incr() {++c;} void incr(int n) {c += n;} void decr() {--c;} int val() {return c;} } class A { ... void p() {...} void m() { ... this.p(); ...} } Programmazione ad Oggetti I tipi semplici non sono oggetti (Java) • Overloading: metodi diversi possono avere lo stesso nome. • I metodi "overloaded" si distinguono uno dall'altro in base alla lista dei tipi degli argomenti. Programmazione ad Oggetti costruttore • L'oggetto viene inizializzato al momento della creazione, invocando automaticamente il costruttore. • L’istruzione Contatore cont1 = new Contatore(3); crea un contatore e lo inizializza a 3. • L'inizializzazione di un oggetto è una operazione molto importante. • Java (e C++) forniscono la nozione di costruttore, che consente di inizializzare automaticamente un oggetto al momento della creazione. Programmazione ad Oggetti Costruttori class Contatore { int c; Contatore(int i) {c = i;} void incr() {++c;} void decr() {--c;} int val() {return c;} } 41 Programmazione ad Oggetti 42 7 Interpretazione Compilazione Interprete Sparc/Solaris binario Compilatore Sparc/Solaris Sparc/Solaris Codice Sorgente Sparc/Solaris Codice Sorgente Interprete MacOS binario Apple Apple Compilatore Intel/GNU-Linux Interprete Intel/GNU-Linux • Interprete (JavaScript, Scheme, Prolog): Interazione. Più facile modificare un programma durante l'esecuzione Intel/GNU-Linux Programmazione ad Oggetti 43 binario • Compilazione (Pascal, C, Ada, C++): Efficienza di esecuzione. Il codice generato dal compilatore può essere ottimizzato, perché la compilazione è fatta una sola volta Intel/GNU-Linux Programmazione ad Oggetti 44 Compilazione di un programma in Java Soluzione Mista: Java • Soluzione mista (Java): Portabilità. Per eseguire un programma su macchine diverse è sufficiente implementare l'interprete del linguaggio intermedio, e non tutto il compilatore bytecode Compilatore MacOS Interprete Java/Solaris Sparc/Solaris Interprete Java/MacOS Apple • Si crea un file <nome_file>.java contenente una o più classi C1, C2, … e lo si compila. > javac <nome_file>.java Codice Java Compilatore Java • Il compilatore crea un file .class in codice intermedio (bytecode) per ogni classe contenuta nel file .java: Interprete Java/GNU-Linux Interprete Java/PalmOS Intel/GNU-Linux C1.class, C2.class, ... Palm VII Programmazione ad Oggetti 45 Esecuzione di un programma in Java 46 Un programma completo • Si chiama l'interprete su una classe che contiene il main (Es. C1) > java C1 class Contatore { int c; Contatore(int n) {c=n;} void incr() {++c;} void decr() {--c;} int val() {return c;} } > javac <nome_file>.java > java UsaCont class UsaCont { public static void main(String arg[]) { Contatore cont = new Contatore(5); cont.incr(); System.out.println("valore =" + cont.val()); } } • L'interprete alloca questa classe e comincia ad eseguire il main. Programmazione ad Oggetti Programmazione ad Oggetti 47 Programmazione ad Oggetti 48 8 Compilazione in Java • Una unità di compilazione è un file .java che contiene delle definizioni di classi. • Al massimo una di queste classi può essere public: in questo caso deve avere lo stesso nome del file (senza .java). • Il compilatore produce un file .class per ogni classe nel file. • L'interprete ha la responsabilità di caricare e interpretare questi file. Programmazione ad Oggetti 49 Ereditarietà Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Programmazione ad Oggetti 50 Ereditarietà • Meccanismo per lo sviluppo incrementale di programmi • Consente di estendere classi preesistenti aggiungendo o modificando componenti (variabili o metodi) class Finestra { Rettangolo r; .... void disegnaCornice() {...} void disegnaContenuto() {...} } • Data la classe di sopra vogliamo estendere la finestra aggiungendo un titolo class FinestraConTitolo extends Finestra { String titolo; void disegnaTitolo() {...} } Programmazione ad Oggetti 51 Sottoclassi Programmazione ad Oggetti 52 Ereditarietà • Gli oggetti della classe Finestra sono costituiti da • FinestraConTitolo è una sottoclasse di Finestra. • Una sottoclasse eredita tutte le variabili ed i metodi della sopraclasse. Programmazione ad Oggetti 53 variabili Rettangolo r; metodi void disegnaCornice() {...} void disegnaContenuto() {...} • Gli oggetti della classe FinestraConTitolo sono costituiti da variabili Rettangolo r; String titolo; metodi void disegnaCornice() {...} void disegnaContenuto() {...} void disegnaTitolo() {...} Programmazione ad Oggetti 54 9 Extends (Java) Extends (Java) • E` la parola chiave per definire una gerarchia di classi • Superclasse, classe base, classe padre • Sottoclasse, classe derivata, classe figlia ClassePadre ClasseFigliaUno Ereditarieta` class ClassePadre { […] } ClasseFigliaDue class ClasseFigliaUno extends ClassePadre { […] } class ClasseFigliaDue extends ClassePadre { […] } Programmazione ad Oggetti A A x∈B⇒x∈A class B extends A B B 55 Controllo statico dei tipi Programmazione ad Oggetti 56 Controllo statico dei tipi Finestra f; FinestraConTitolo ft; ... ft.disegnaCornice(); f.disegnaCornice(); ft.disegnaTitolo(); f.disegnaTitolo(); • Java, come molti altri linguaggi, effettua un controllo dei tipi (type checking) statico. • Statico: fatto dal compilatore prima di iniziare l'esecuzione del programma. • Dinamico: fatto dall'interprete durante l'esecuzione (a runtime) • Il type checking statico garantisce che non ci saranno errori durante l'esecuzione. Programmazione ad Oggetti • Le sottoclasse hanno le funzionalita` delle proprie sopraclassi piu` altre specifiche • Specializzazione • Un elemento di una sottoclasse e` anche un elemento di una sua sopraclasse corretto errore di compilazione f è una finestra e non ha il metodo disegnaTitolo • Type checking statico: il compilatore controlla che per una variabile si chiami un metodo definito per la classe di quella variabile. 57 Tassonomie Programmazione ad Oggetti 58 Sottotipi • Spesso l'ereditarietà è utilizzata per rappresentare tassonomie (classificazioni) • Una sottoclasse può essere vista come l'implementazione di un sottotipo. • L'ereditarietà realizza una relazione is-a (è un). • Un rettangolo è un poligono. • Un rettangolo ha tutte le operazioni di poligono (eventualmente ridefinite) più altre operazioni specifiche. Programmazione ad Oggetti 59 Programmazione ad Oggetti 60 10 Ereditarietà singola Ereditarietà multipla • Ogni sottoclasse ha una sola sopraclasse. • Struttura ad albero. • In Java la classe Object è la radice della gerarchia. ApparecchioElettrico tensione potenza • Qualunque oggetto è un Object. • I tipi primitivi non sono Object. Programmazione ad Oggetti Televisore pollici • In Java non è permessa. • Dà maggiore espressività ma crea problemi di conflitti e duplicazioni. Programmazione ad Oggetti 61 Polimorfismo A d b a a Esempio: • D sottoclasse di B e di A • un oggetto D è un B ed è un A • un oggetto di tipo (classe) D è anche un oggetto di tipo (classe) B e anche un oggetto di tipo (classe) A a; B b; D d; = new D(); = new D(); = new D(); = b; questi assegnamenti sono tutti legali perché un oggetto di tipo D ha anche tipo B eA Programmazione ad Oggetti 63 Polimorfismo 64 Upcasting A a; B b; D d; d = new D(); • L'assegnamento x = espr è legale per il compilatore se: – A uguale a B – B sottoclasse (sottotipo) di A dove A è il tipo di x e B è il tipo di espr b = d; d viene visto come se fosse un oggetto di tipo B a = d; d viene visto come se fosse un oggetto di tipo A • Upcasting: ci si muove da un tipo specifico ad uno più generico (da un tipo ad un suo “sopratipo”). • Analogamente se x è un parametro formale di un metodo e espr è il parametro attuale (della chiamata) • Controllo statico. Programmazione ad Oggetti 62 Polimorfismo • POLIMORFISMO: proprietà di un oggetto di avere più di un tipo, in accordo alla relazione di ereditarietà. Programmazione ad Oggetti Articolo codice prezzo 65 • L’upcasting è sicuro per il type checking: dato che una sottoclasse eredita tutti i metodi delle sue sopraclassi, ogni messaggio che può essere inviato ad una sopraclasse può anche essere inviato alla sottoclasse senza il rischio di errori durante l'esecuzione. Programmazione ad Oggetti 66 11 Upcasting Poligono p; Rettangolo r; ... p.disegna(); r.disegna(); p.perimetro(); r.perimetro(); Upcasting Poligono p; Rettangolo r; ... r.diagonale(); corretto p.diagonale(); corretto per il compilatore Programmazione ad Oggetti errore di compilazione p è di tipo Poligono e non ha il metodo diagonale 67 Upcasting Poligono p; Rettangolo r; ... p = r; r.diagonale(); p.diagonale(); Programmazione ad Oggetti 68 Upcasting p Poligono p; Rettangolo r; p = r; r.diagonale(); corretto r Rettangolo Il compilatore dà errore ma, se si facesse il controllo a runtime, p.diagonale() sarebbe corretto perché p è legata ad un rettangolo (che possiede il metodo diagonale). p.diagonale(); se si facesse il controllo a runtime, sarebbe corretto perché p è legata ad un rettangolo (che possiede il metodo diagonale). Visto da p, il rettangolo è un poligono. Programmazione ad Oggetti 69 Overriding Programmazione ad Oggetti 70 Cella (1) • Una sottoclasse può anche ridefinire (OVERRIDING) un metodo della sopraclasse. class Cella { int contenuto=0; int get() {return contenuto;} void set(int n) {contenuto=n;} } class Finestra { Rettangolo r; .... void disegnaCornice() {...} void disegnaContenuto() {...} } class CellaConMemoria extends Cella { int backup=0; void set(int n) {backup=contenuto; contenuto=n;} void restore() {contenuto=backup;} } class FinestraConTitolo extends Finestra { String titolo; void disegnaCornice() { … disegna la cornice con il titolo …} } Programmazione ad Oggetti errore di compilazione p è di tipo Poligono e non ha il metodo diagonale 71 Programmazione ad Oggetti 72 12 Ereditarietà da Object (Java) Complex c = new Complex(1.5, 2.4); System.out.println(c); class Complex { double re,im; ... } Si può ridefinite toString c viene convertito in stringa con il metodo toString definito in Object. Si ottiene: Complex@......... Con la stampa si ottiene: 1.5 + i 2.4 • Spesso un metodo di una sottoclasse definito per overriding non ridefinisce completamente il metodo con lo stesso nome della sua sopraclasse, ma lo estende. • Ad esempio, il metodo disegnaCornice della FinestraConTitolo estende il metodo disegnaCornice della Finestra, con del codice specifico per disegnare il titolo. class Complex { ... String toString() { return(re + " + i " + im); } } Programmazione ad Oggetti Come estendere un metodo • Per evitare di duplicare il codice, si può far riferimento ad un metodo della sopraclasse con lo stesso nome mediante la notazione super. 73 super Programmazione ad Oggetti 74 Cella (2) Per ridefinire un metodo in modo incrementale: class Cella { int contenuto=0; int get() {return contenuto;} void set(int n) {contenuto=n;} } class FinestraConTitolo extends Finestra { String titolo; void disegnaCornice() { super.disegnaCornice(); ... nuovo codice ... } } class CellaConMemoria extends Cella { int backup=0; void set(int n) {backup=contenuto; super.set(n);} void restore() {contenuto=backup;} } super.disegnaCornice() chiama il metodo disegnaCornice della sopraclasse (che altrimenti non sarebbe visibile). Programmazione ad Oggetti 75 Upcasting 76 Binding dinamico Poligono p; Rettangolo r; ... p = r; p.disegna(); • Un oggetto decide quale metodo applicare a se stesso in base alla propria posizione nella gerarchia dell’ereditarieta` p.perimetro(); • Binding dinamico: decidere a tempo di esecuzione quale metodo applicare corretto per il compilatore, ma quale metodo si esegue? Quello di Poligono o quello di Rettangolo? Programmazione ad Oggetti Programmazione ad Oggetti • Binding statico: decidere a tempo di compilazione quale funzione applicare (Pascal, C, …) Java adotta il binding dinamico 77 Programmazione ad Oggetti 78 13 Binding dinamico Binding dinamico p.perimetro(); • In questo contesto: Si esegue il metodo perimetro dell'oggetto a cui p fa riferimento in quel momento. • Binding: legame fra il nome di un metodo in una invocazione e (codice del) metodo. Poligono p = new Poligono(); Rettangolo r = new Rettangolo(); • obj.m(): quale metodo m viene eseguito? p.perimetro(); • Nei linguaggi tradizionali le chiamate di procedura vengono risolte dal compilatore. si esegue il metodo perimetro di Poligono p = r; p.perimetro(); • Nei linguaggi ad oggetti (tranne il C++) le chiamate di metodi sono risolte dinamicamente. si esegue il metodo perimetro di Rettangolo Programmazione ad Oggetti • BINDING DINAMICO: la forma di un oggetto determina dinamicamente quale versione di un metodo applicare. 79 Binding dinamico void rinfresca() { this.disegnaCornice(); this.disegnaContenuto(); } this (che può anche essere omesso) si riferisce sempre all’oggetto corrente. FinestraConTitolo ft; ... ft.rinfresca(); class FinestraConTitolo extends Finestra { String titolo; void disegnaCornice() { … disegna la cornice con il titolo …} } chiama il metodo disegnaCornice di FinestraConTitolo 81 Programmazione ad Oggetti 82 Private, public, protected, o … (Java) Overrinding Ricerca di un metodo per un oggetto: • la sottoclasse verifica se possiede o meno un metodo con tale nome e con gli stessi parametri (stessa signature), se si`, lo usa • se no, la classe padre cerca per la classe figlia tale metodo tra quelli in essa definiti (e cosi` via nella gerarchia) • Un metodo definito in una sottoclasse e avente la stessa signature di un metodo di una delle classi antenate nasconde il metodo di quest’ultima alla sottoclasse Programmazione ad Oggetti 80 Binding dinamico class Finestra { Rettangolo r; .... void disegnaCornice() {...} void disegnaContenuto() {...} void rinfresca() { this.disegnaCornice(); this.disegnaContenuto(); } } Programmazione ad Oggetti Programmazione ad Oggetti Modificatori d’accesso di Java che controllano la visibilita` di campi di istanze o metodi: • nessuna specifica: visibile al package • private: visibile alla sola classe di appartenenza • public: visibile ovunque • protected: visibile al package e a tutte le sottoclassi (una classe potrebbe estenderne un’altra non appartenente allo spesso pacchetto) Cosa scegliere? 83 Programmazione ad Oggetti 84 14 Private, … (Java) Riuso del software • La programmazione ad oggetti consente di utilizzare classi già esistenti per produrre nuovo software: • Per i metodi: – public per l’interfaccia – private per i metodi di “servizio” • Uso. • Per i campi: – private e` sempre la soluzione consigliata, se e` necessario accederne al valore allora si definisce un metodo di accesso – protected se si vuole renderli accessibili alle sottoclassi – public, nulla ... Programmazione ad Oggetti – Si definiscono nuove classi i cui oggetti sono composti di oggetti di classi già esistenti. • Ereditarietà. – Favorisce lo sviluppo incrementale, estendendo classi già esistenti. Programmazione ad Oggetti 85 Composizione class Automobile { int lunghezza; Motore motore; Ruota[] ruote; ... } – Un oggetto comunica con oggetti di altre classi • Composizione. Ereditarietà vs composizione class Ruota { double pressione; int diametro; ... } AppElettr Articolo Televisore class Motore { int cilindrata; ... } Automobile Motore Automobile miaAuto = new Automobile(); ... miaAuto.motore.cilindrata miaAuto.ruote[1].pressione Programmazione ad Oggetti 86 Ruote Carrozzeria 87 Programmare con l'ereditarietà Televisore è un apparecchio elettrico e è un articolo. La sottoclasse eredita il comportamento di altre classi. L'automobile ha un motore, una carrozzeria, … L'automobile non ha il comportamento del motore, ... Programmazione ad Oggetti 88 Programmare con l'ereditarietà • Si consideri una figura composta di diverse forme void disegna(figura f) { geometriche (linee, for ogni forma S in f rettangoli, cerchi, …). switch(S.genere) • Nella programmazione tradizionale, una procedura per disegnare la figura dovrebbe considerare tutti i casi. … • Se si aggiunge la forma } TRIANGOLO occorre modificare la procedura disegna. case LINEA: disegnaLinea() case RETTANGOLO: disegnaRettangolo() case CERCHIO: disegnaCerchio() Programmazione ad Oggetti 89 class Figura { Forma[] s; //una figura è inplementata //come un array di Forme void disegnaFigura() { for (int i=0; i<s.length; i++) s[i].disegna(); } ... Programmazione ad Oggetti 90 15 Programmare con l'ereditarietà Classi astratte • Se si aggiunge la forma Triangolo, è sufficiente definire una nuova sottoclasse di Forma con il metodo disegna: class Triangolo extends Forma { ... void disegna(){...} } • In un programma non ci si aspetta di chiamare il metodo disegna della classe Forma, né di usare oggetti di questa classe. • La classe Figura non viene modificata. • Il binding dinamico fa sì che, se la figura contiene un triangolo, venga chiamato il metodo per disegnare un triangolo. Programmazione ad Oggetti • La classe Forma serve solo per avere una interfaccia comune per le varie forme specifiche. Programmazione ad Oggetti 91 Classi astratte 92 Es.: Poligoni Alcuni metodi (dichiarati abstract) non sono implementati • perimetro, area sono piu` volte ridefinite nella gerarchia di classe abstract class Forma { abstract void disegna(); Non c'è la implementa} zione del metodo class Linea extends Forma { void disegna() { ......} } .... Forma f = new Forma(); Errore di compilazione. Non si possono creare oggetti di una classe astratta. Forma f = new Linea(); f.disegna(); Programmazione ad Oggetti Programmazione ad Oggetti 93 Es.: Prisma 94 Interfacce • Una classe astratta pura costituisce una interfaccia. • I metodi volume, superficieLaterale e SuperficieTotale sono polimorfi • In Java può essere definita anche come interface. interface Forma { void disegna(); } class Linea implements Forma { void disegna() { ......} } ... Forma f = new Linea(); f.disegna(); Programmazione ad Oggetti 95 Programmazione ad Oggetti 96 16 Interfacce vs. classi astratte Interfacce multiple interface A { interface B { void metodoA(); void metodoB(); } } • Le classi astratte possono essere miste, ossia possono contenere anche metodi non astratti. • Con l'ereditarietà singola di Java, una classe può essere sottoclasse solo di una classe astratta. class C implements A,B { void metodoA() {System.out.println("sono A");} void metodoB() {System.out.println("sono B");} • Le interfacce invece non sono soggette al vincolo della struttura gerarchica ad albero. public static void main(String[] args) { A a = new C();//l’oggetto è visto come un A B b = new C();//l’oggetto è visto come un B a.metodoA(); b.metodoB(); a.metodoB(); //errore: A non ha il metodB } • Una classe può implementare più di una interfaccia (qualche analogia con ereditarietà multipla). Programmazione ad Oggetti 97 } Programmazione ad Oggetti Classi generiche • La proprietà che tutte le classi sono discendenti di Object consente di definire strutture dati che possono contenere oggetti di qualunque tipo. Downcasting class Pila { ... void push(Object x) {...}; Object pop() {...}; } • Non si può specificare il tipo Pila s; Linea l; Rettangolo r; degli elementi della pila: ... possono essere oggetti s.push(l); s.push(r); qualunque. class Pila { ... void push(Object x) {...}; Object pop() {...}; } 99 Downcasting Errore di compilazione. pop restituisce un Object, che è più generale di Rettangolo Programmazione ad Oggetti 100 Downcasting class Pila { ... void push(Object x) {...}; Object pop() {...}; } • Downcasting: ci si muove da un tipo più generale ad uno più specifico (da un tipo ad un sottotipo) • Se A è un sottotipo di B e se espr ha tipo B, (A) espr ha tipo A ... Pila s; Rettangolo r; ... s.push(new Rettangolo()); • L’assegnamento A a = (A) espr è corretto per il compilatore • (A) espr può dare errore a run time, se l’oggetto ottenuto valutando espr non ha tipo A. r = (Rettangolo) s.pop(); Non e` un cast alla “C” ! Programmazione ad Oggetti Supponiamo di sapere che sulla pila vengono messi solo rettangoli. Come possiamo utilizzare gli oggetti estratti dalla pila? Pila s; Rettangolo r; ... s.push(new Rettangolo()); r = s.pop(); Programmazione ad Oggetti 98 101 Accettato dal compilatore. Può dare errore a run time. Controllo a run-time. Quando si esegue questa istruzione si controlla che l'oggetto restituito da pop sia veramente un rettangolo. Programmazione ad Oggetti 102 17 Graphical User Interface Gli oggetti prima di tutto: GUI, Event-driven programming e l’architettu ra MVC • Un programma che fa uso di di strumenti grafici come bottoni, menu`, disegni, finestre, ecc. per facilitare le operazioni di input e visualizzazione dell’output • Un GUI per il contatore: una finestra che permetta di controllare l’invio dei messaggi di incremento, decremento, inizializzazione di un contatore, nonche` la visualizzazione del suo valore corrente Programmazione ad Oggetti 103 – un bottone per abbandonare l’interfaccia chiude la finestra decrementa il contatore di 1 chiude la finestra incrementa il contatore di 1 Programmazione ad Oggetti 105 L’architettura Model View Controller Un programma si compone di • Modello (Model): modella e calcola il problema che desideriamo risolvere • Vista (View): rappresenta una “fotografia” dello stato interno del modello spesso per facilitarne la sua lettura/interpretazione all’utente umano • Controllore (Controller): controlla il flusso di dati nel programma, dalla vista al modello e quindi nuovamenta alla vista • Ha origine negli applicativi sviluppati in Smalltalk • E` stato utilizzato in Java per lo sviluppo delle componenti AWT/Swing Programmazione ad Oggetti 106 Architettura MVC: vantaggi http://www.cis.ksu.edu/~schmidt/CIS200 • L’utente agisce sulla vista di un programma agendo su una delle sue componenti di controllo (es. bottone) • Il controllore e` avvertito di tale evento ed esamina la vista per rilevarne le informazioni aggiuntive • Il controllore invia tali richiede alla vista di visualizzainformazioni al modello che re il risultato della computazione effettua la computazione • La vista interroga il modello sul richiesta e aggiorna il suo nuovo stato interno e proprio stato interno visulizza l’informazione • Il controllo (o il modello) all’utente Programmazione ad Oggetti 104 http://www.cis.ksu.edu/~schmidt/CIS200 visualizza il valore corrente inizializza il contatore a zero Programmazione ad Oggetti L’architettura Model View Controller Contatore GUI 1 • Desideriamo una interfaccia grafica per un contatore (descritto nelle lezioni precedenti) che contenga le seguenti funzionalita`: – un display per il valore corrente – tre bottoni per le operazioni di incr(), decr() e init(0) public class Counter { public Counter() { […] } […] public void init(int val){ c = val; } public void incr(){ c++; } public void decr(){ c--; } public int getVal(){ return c; } […] private int c; private String nomeContatore; } 107 • Le classi che formano l’applicativo possono essere piu` facilmente riutilizzate • L’applicativo e` organizzato in parti piu` semplici e comprensibili (ogni parte ha le sue specifiche finalita`) • La modifica di una parte non coinvolge e non interferisce con le altre parti (maggiore flessibilita` nella manutenzione del software) Programmazione ad Oggetti 108 18 MVC: sequenza dei messaggi ① viene premuto il bottone “Decrementa” ② l’evento e’ ascoltato dal controller ① ③ il controller invia il messaggio di decr() al modello ④ il controller invia il messaggio di updateView() alla vista ⑤ la vista richiede i dati al modello per aggiornarsi (getVal()) view model.getVal() • E` alla base della programmazione delle GUI • E` il nuovo tipo di input che deve essere trattato nella programmazione delle GUI (pressione di bottoni, mouse on/off, ecc.) • L’utente genera tramite la GUI una serie di eventi a cui il controllore deve prontamente reagire in maniera opportuna • Handling events: “processare” gli eventi • Il controllore che processa gli eventi e` chiamato event handler o event listener • le informazioni sull’evento in Java sono memorizzate in opportuni oggetti (EventObject) model ⑤ 0 -1 view.updateView() ②event ④ model.decr() ③ Action Listener actionPerformed(…) controller Programmazione ad Oggetti 110 Event-Driven Programming • La computazione e` guidata completamente dalla serie di eventi generati dall’utente • Il programma processa gli eventi come input e aggiorna il proprio modello interno e lo visualizza tramite la vista • Il controllo ha il compito di gestire il flusso di eventi e dati dalla vista al modello e quindi nuovamente verso la vista • Piu` controllori, viste e modelli possono coesistere a formare un programma • Gli eventi devono essere generabili in maniera coerente da parte dell’utente (disabilita/abilita) 111 Event-Driven Programming ① OS intercetta l’evento “click di un bottone” e lo comunica all’AWT/Swing ② AWT/Swing determina la sorgente dell’evento, crea un ActionEvent e lo invia all’incaricato ActionListener ③ la procedura actionPerformed (event) del controllore e` eseguita ④ il controllo invia gli opportuni messaggi al modello e alla vista ⑤ la vista si aggiorna interrogando il modello view model.getVal() model ⑤ 0 ① -1 view.updateView() ② ④ model.decr() ActionEvent event ④ Action Listener actionPerformed(event) ③ Programmazione ad Oggetti controller (e` registrato come ActionListener di Decrementa) 112 AWT/Swing • Ogni componente grafico (per esempio, un bottone) mantiene al suo interno una lista di listener objects (oggetti in ascolto) • Un listener object ob è aggiunto alla lista di un oggetto b tramite il messaggio b.addActionListener(ob) • In generale, un componente grafico può avere molti listener objects e un listener object può “ascoltare” più componenti • Quando un evento occorre, la lista viene scandita e a ogni listener object viene inviato il messaggio actionPerformed Programmazione ad Oggetti Programmazione ad Oggetti 109 Event-Driven Programming Programmazione ad Oggetti Event-Driven Programming 113 • Componenti (component): oggetti che possono avere una posizione e una dimensione nello schermo e nei quali possono occorrere eventi • Contenitori (container): componenti che possono contenere al loro interno altre componenti come, ad esempio, i pannelli (panel) Programmazione ad Oggetti 114 19 AWT/Swing Contatore GUI 1: view Componente • Finestre (windows): contenitori che possono essere visualizzati direttamente sullo schermo JLabel JPanel FlowLayout JPanel valore contatore: ... BorderLayout CENTER SOUTH • Frame: finestre con titolo e menu visualizzate permanentemente sullo schermo durante l’esecuzione di un programma Decrementa Reset Incrementa JPanel FlowLayout • Dialog: finestre visualizzate temporaneamente sullo schermo durante l’esecuzione di un programma (es. visualizzano messaggi di errore, input file, ecc) Programmazione ad Oggetti public class CounterControl implements ActionListener { private Counter contatore; private CounterInterfaceView contatoreVista; public CounterControl(Counter cont, CounterInterfaceView contVista){ contatore = cont; contatoreVista = contVista; } public void actionPerformed(ActionEvent e){ JButton source = (JButton)e.getSource(); // notare il cast! if (source.getText().equals("Decrementa")) contatore.decr(); else if (source.getText().equals("Incrementa")) contatore.incr(); else contatore.init(0); contatoreVista.updateView(); } } Programmazione ad Oggetti invia messaggi model Struttura del contenitore JPanel Programmazione ad Oggetti 116 public class CounterView extends JPanel implements CounterInterfaceView { public CounterView(Counter model){ […] creazione del controllore contatore = model; […] controlloCounter = new CounterControl(contatore, this); […] JButton bottoneDecr = new JButton("Decrementa"); bottoneDecr.addActionListener(controlloCounter); […] aggancio JButton bottoneReset = new JButton("Reset"); bottoneReset.addActionListener(controlloCounter); […] JButton bottoneIncr = new JButton("Incrementa"); bottoneIncr.addActionListener(controlloCounter); […] updateView(); } Programmazione ad Oggetti 118 Contatore GUI 1: overview ① 0 invia messaggi crea • la vista riceve il modello tra i suoi main eventi controller parametri Action Listener • il controllore riceve actionPerformed(event) tra i suoi parametri la vista e il modello ③ Programmazione ad Oggetti JButton Componenti (in realta` sono a loro volta contenitori, etichette, icon, …) 117 Contatore GUI 1: MVC crea JButton Contatore GUI 1: aggangio del controller • Tratta gli oggetti di tipo ActionEvent creati dall’AWT/Swing contenenti tutte le informazioni sull’evento occorso nell’interfaccia (vista) • implementazione di ActionListener e definizione del metodo actionPerformed(ActionEvent) view Contenitori 115 Contatore GUI 1: controller ① Dal main si crea il ② modello … ② … e la vista ③ la vista crea il controllore (listener bottoni) e lo aggancia ai bottoni crea JButton 119 • Diagramma delle classi per il contatore GUI 1 • Introduzione di una interfaccia per la vista • ContatoreFrame contiene il main e quindi crea la vista e il modello • ExitButton e ExitFrame controllano l’uscita dal programma principale Programmazione ad Oggetti 120 20 Cenni storici • Il paradigma Object-Oriented (OO) non e` nuovo: Simula, Smalltalk, C++ • “Green”, 1991 della Sun Microsystem, linguaggio per dispositivi di consumo non legato ad un particolare microprocessore • HotJava, 1994, un browser per internet • Netscape 2.0, 1995, abilitato all’uso di Java • Java 1.02, 1996 • Java 1.1, 1997 • Java 2, 1998 JAVA: dove e come Programmazione ad Oggetti Il “White paper” di Java • • • • • • • • • 122 Dove trovare Java? Semplice A oggetti Distribuito Robusto Sicuro Indipendente dall’architettura Portabile Interpretato Multithreaded Programmazione ad Oggetti Programmazione ad Oggetti 121 • Java e` disponibile http://java.sun.com/j2se (Java 2 Standard Edition) • Esistono versioni per: – Sun Solaris – Windows 95/98 e NT – Linux (anche in RPM) • Java 2 Runtime Environment • Java 2 S.E. Documentation Programmazione ad Oggetti 123 Dove trovare Java? 124 Cosa serve? • … spesso anche dal vostro giornalaio (soluzione consigliata se non si ha un collegamento a internet veloce) • Java e` distribuito gratuitamente dalla Sun Microsystems istruzioni di installazione j2sdk1_3_0-win.exe (29,4 Mb) j2sdk1_3_0-doc.zip (21,2 Mb) • Attualmente e` disponibile la versione 1.3 tutorial.zip (9,15 Mb) Programmazione ad Oggetti 125 Programmazione ad Oggetti 126 21 Installazione di Java Il Tutorial • Per Windows… bastano due “click” • Ricordarsi pero`: – set PATH=%PATH%;C:¥JDK1.3¥BIN • E` utile installarsi anche la documentazione e il tutorial (in formato HTML) • Nota: la Sun NON distribuisce alcun ambiente di sviluppo, tutto viene eseguito dalla riga di comando • Alcuni semplici editor sono (oltre il Notepad): – TextPad (http://www.textpad.com/) – WinEdt (http://www.winedt.com/) Programmazione ad Oggetti • Una semplice guida alla programmazione in Java • E` un ipertesto in HTML quindi consultabile mediante un qualsiasi browser Programmazione ad Oggetti 127 La Documentazione 128 JDK1.3: il direttorio Il nome del direttorio di installazione • Contiene TUTTE le informazioni sulla versione in uso di Java • In particolare contiene il Java 2 Platform API Specification • E` in formato HTML Gli eseguibili: • javac • java • javadoc •… La documentazione sulle Librerie (in HTML) Il tutorial di Java (in HTML) Esempi di programmi Java (e applet) • Nota: il tutorial e la documentazione NON sono inclusi nell’installazione di Java 2 I sorgenti delle librerie IMPORTANTE!! set PATH=%PATH%;C:¥JDK1.3¥BIN Programmazione ad Oggetti 129 Programmazione ad Oggetti 130 Applet • Applet: speciali programmi Java che un browser può scaricare dalla rete ed eseguire. La chiamata dell'applet viene inserita in un documento HTML. • (Non sono uno strumento per realizzare pagine web) JAVA oltre ... • Attualmente l'interesse è diminuito perché HTML ed i linguaggi di scripting sono molto potenziati rispetto ai primi tempi di Java. • I principali browser non supportano più le ultime versioni di Java. Occorre installare dei plug-in. • Uso vantaggioso soprattutto in applicazioni intranet aziendali. Programmazione ad Oggetti 131 Programmazione ad Oggetti 132 22 Sicurezza delle applet Sicurezza delle applet • Le applet (diversamente dalle applicazioni) sono limitate nelle operazioni che possono svolgere. • I controlli sono effettuati dall'interprete della Java Virtual Machine in base ad un modello predefinito di gestione della sicurezza. • Non possono avviare programmi locali. • Non possono comunicare con host diversi da quello da cui sono state prelevate. • Non possono accedere al file system locale. • Non possono recuperare informazioni riguardanti il computer locale. • Le applet possono essere firmate. • Se chi firma l'applet è una persona di fiducia, è possibile concedere più privilegi all'applet modificando la politica di gestione della sicurezza. Ad esempio si può concedere ad una applet di una intranet aziendale di accedere ai file locali. Spirograph Simulator http://www.di.unito.it/~baldoni Programmazione ad Oggetti Programmazione ad Oggetti 133 Servlet e Web Server 134 Servlet e Web Server Servlet: Java Virtual Machine HttpServletRequest • estensioni del Java API • permettono di scrivere applicazioni indipendenti eseguite all’interno del Web server • possono servire richieste in parallelo • mantengono la sessione di lavoro con il singolo utente • efficienti e semplici da utilizzare rispetto ai programmi CGI Programmazione ad Oggetti HttpServletResponse Servlet Client Browser Web Server 135 Servlet e Web Server Programmazione ad Oggetti 136 Servlet • Ogni volta che il Web Server riceve una richiesta per una servlet S: • Una servlet è una classe Java (estensione di HttpServlet). • Un Web Server può ospitare più servlet (con relativi alias) • Quando il processo Web Server viene lanciato, genera un thread Java che inizializza l’oggetto Servlet (metodo init) • Ogni servlet è un thread all’interno del Web Server – identifica la servlet S – invoca il metodo service dell’oggetto Servlet S, per far eseguire le operazioni richieste • Il metodo service rappresenta l’interfaccia del secondo livello di applicazione. Al termine del metodo, S rimanda una risposta sotto forma di pagina HTML • Il Web server spedisce la pagina al browser chiamante Programmazione ad Oggetti 137 Programmazione ad Oggetti 138 23 Servlet e Web Server Comunicazione distribuita Java VM2 • Apache, Netscape, Microsoft o Oracle Web Server • le servlet erano inizialmente solo integrate nel Java Web Server della Sun Java VM1 Port 2 Port1 Invocazione di metodi sull’oggetto remoto Programmazione ad Oggetti RMI: goal • offrire un modello distribuito che preservi maggiormente la semantica degli oggetti Java • rendere il piu’ semplice possibile la scrittura di applicazioni distribuite Applicazione Client Applicazione Server Livello stub Livello skeleton Livello di riferimento remoto Livello di riferimento remoto Livello di Trasporto 141 Architettura RMI Rete Livello di Trasporto Programmazione ad Oggetti 142 RMI • Il sistema RMI é costituito da tre livelli per supportare flessibilità nella comunicazione • Ogni livello ha le sue interfacce di comunicazione con relativi protocolli – stub/skeleton layer: canale di comunicazione tra clients e server – remote reference layer: supporto di diversi protocolli di invocazione tipo Unicast e Multicast – transport layer: supporta la comunicazione a basso livello, tipo TCP/IP Programmazione ad Oggetti 140 Architettura RMI • Rendere trasparente l’invocazione remota di metodi su oggetti Java che risiedono su diverse Virtual machines (evoluzione di Remote Procedure Call, RPC) Programmazione ad Oggetti Programmazione ad Oggetti 139 143 Simile all’invocazione di metodi locali • i parametri dei metodi possono essere oggetti • il polimorfismo e’ supportato: oggetti diversi possono rispondere a stessi messaggi ma • i client interagiscono con interfacce di oggetti (stub) non con la loro implementazione (che sta nella VM remota) • parametri passati per copia, non per referenza (passaggio per referenza solo dentro a una VM) Programmazione ad Oggetti 144 24 Documentazione automatica • javadoc permette di generare automaticamente file di documentazione analizzando i commenti compresi tra i simboli /** e */ • Produce documentazione in formato HTML • La documentazione di Java sulle API e` generata con tale utility Together/J • della Object International Software Ltd. • Together/J permette di mantenere la sincronizzazione tra i diagrammi della progettazione e il codice Java • Facilita` la realizzazione di un programma orientato agli oggetti integrando la progettazione con la scrittura vera e propria del programma stesso • package, classe pubblica, interfaccia pubblica, metodo pubblico o protetto, variabile pubblica o protetta • Object Domain, Rational Rose, ... Programmazione ad Oggetti 145 Bibliografia 146 Bibliografia • Eckel, B. Thinking in Java. Second Edition. Prentice-Hall Computer Books, 2000. ISBN: 0130273635 • Disponibile anche gratuitamente all’indirizzo http://www.bruceeckel.com dove e` possibile trovare anche “Thinking in C++” dello stesso autore Programmazione ad Oggetti Programmazione ad Oggetti 147 • Horstmann, C. S.Cornell, G. Core Java 2: Fundamentals. Prentice Hall, 1999. ISBN: 0130819336 Core Java 2: Advanced Features. Prentice Hall, 1999. ISBN: 0130819344 • Anche in italiano: Programmazione ad Oggetti Java 2 i fondamenti. McGraw Hill, 1999. e Java 2 Tecniche avanzate. McGraw Hill, 2000. 148 Bibliografia Altri riferimenti: • Schimdt, D. Programming Principles in Java: Architectures and Interfaces. http://www.cis.ksu.edu/~schmidt/CIS200/ • Fowler, M. UML Distilled (2nd ed.), Addison Wesley Longman, Inc., 2000. Programmazione ad Oggetti 149 25