Fondamenti di informatica Oggetti e Java Luca Cabibbo Definizione di metodi Capitolo 15 febbraio 2004 1 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Introduzione alla definizione di metodi Una classe che è il progetto di un singolo oggetto classe progetto e realizzazione del comportamento e dello stato di questo oggetto le operazioni sono implementate da metodi le proprietà sono implementate da variabile facciamo l’ipotesi semplificativa che l’oggetto non abbia stato Scopo della definizione di un metodo implementare una operazione supportare la definizione di altri metodi 2 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di un semplice metodo /* La classe Salutatore rappresenta un oggetto * che sa salutare. */ class Salutatore { /* Visualizza un saluto sullo schermo. */ public static void saluta() { System.out.println("Salve"); } } 3 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La classe Salutatore e l’oggetto classe Salutatore Salutatore static void saluta() «oggetto classe» Salutatore void saluta() è possibile chiedere a Salutatore di eseguire questa operazione mediante la seguente istruzione Salutatore.saluta(); 4 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso di classi e metodi /* Applicazione di esempio per Salutatore. */ class DemoSalutatore { public static void main(String[] args) { /* visualizza un saluto sullo schermo */ Salutatore.saluta(); } } «applicazione» DemoSalutatore «oggetto classe» Salutatore main(...) 1: main(...) 5 void saluta() 1.1: saluta() Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Uso dell’oggetto classe Salutatore «oggetto classe» Salutatore «applicazione» DemoSalutatore void saluta() main(…) saluta() viene eseguita il corpo del metodo void saluta() 6 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi e variabili locali /* La classe AlcuneTabelline rappresenta un oggetto * che sa calcolare alcune tabelline. */ class AlcuneTabelline { /* Visualizza la tabellina del tre. */ public static void tabellinaTre() { int i; // per iterare tra 1 e 10 /* calcola e stampa la tabellina del tre */ System.out.println("Tabellina del 3:"); for (i=1; i<=10; i++) System.out.print(3*i + " "); System.out.println(); } /* Visualizza la tabellina del cinque. */ public static void tabellinaCinque() { int i; // per iterare tra 1 e 10 /* calcola e stampa la tabellina del cinque */ System.out.println("Tabellina del 5:"); for (i=1; i<=10; i++) System.out.print(5*i + " "); System.out.println(); } } 7 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl AlcuneTabelline AlcuneTabelline static void tabellinaTre() static void tabellinaCinque() 8 Definizione di metodi «oggetto classe» AlcuneTabelline void tabellinaTre() void tabellinaCinque() Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi e variabili locali public static void tabellinaTre() { int i; // per iterare tra 1 e 10 ... } public static void tabellinaCinque() { int i; // per iterare tra 1 e 10 ... } Le variabili dichiarate in un metodo sono locali al metodo ciascun metodo può accedere solo alle proprie variabili locali 9 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi con parametri La classe AlcuneTabelline è insoddisfacente sarebbe preferibile un oggetto che sa calcolare qualsiasi tabellina – in modo parametrico /* calcola la tabellina del 5 */ Tabelline.tabellina(5); /* calcola la tabellina del 9 */ Tabelline.tabellina(9); 10 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La classe Tabelline /* La classe Tabelline rappresenta un oggetto * che sa calcolare tutte le tabelline. */ class Tabelline { /* Visualizza la tabellina del numero naturale n. */ public static void tabellina(int n) { // pre: n>=0 int i; // per iterare tra 1 e 10 /* calcola e stampa la tabellina del numero n */ System.out.println("Tabellina del " + n + ":"); for (i=1; i<=10; i++) System.out.print(n*i + " "); System.out.println(); } } 11 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Parametri formali e parametri attuali I parametri formali di un metodo sono variabili locali del metodo public static void tabellina(int n) { ... } L’invocazione di un metodo riporta i parametri attuali dell’invocazione del metodo Tabelline.tabellina(5); 12 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Esecuzione di un metodo con parametri «oggetto classe» Tabelline void tabellina(int n) viene valutato il valore dell’espressione 5, che è 5 alla variabile n viene assegnato il valore 5 tabellina(5) viene eseguito il corpo del metodo void tabellina(int n) 13 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame di parametri Il legame dei parametri è l’associazione che avviene tra parametri attuali e parametri formali al momento dell’invocazione di un metodo in Java esiste solo il legame dei parametri per valore in altri linguaggi di programmazione sono presenti anche altri meccanismi di legame dei parametri 14 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi che restituiscono un valore Molte operazioni prevedono la restituzione di un valore int risultato; /* calcola il fattoriale di 5 */ risultato = Fattoriale.fattoriale(5); // 120 /* calcola e visualizza il fattoriale di 4 */ System.out.println( Fattoriale.fattoriale(4) ); 15 Definizione di metodi // 24 Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La classe Fattoriale /* Classe per il calcolo del fattoriale. */ class Fattoriale { /* Calcola e restituisce il fattoriale di n. */ public static int fattoriale(int n) { // pre: n>=0 int f; // il fattoriale di n int i; // per iterare tra 1 e n /* calcola il fattoriale di n */ f = 1; for (i=1; i<=n; i++) f = f*i; return f; } } 16 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi che restituiscono un valore public static int fattoriale(int n) { // pre: n>=0 int f; // il fattoriale di n int i; // per iterare tra 1 e n /* calcola il fattoriale di n */ f = 1; for (i=1; i<=n; i++) f = f*i; return f; } 17 l’istruzione return è l’istruzione che permette a un metodo di restituire un valore Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Esecuzione di un metodo che restituisce un valore «oggetto classe» Fattoriale int fattoriale(int n) viene valutato il valore dell’espressione 4, che è 4 r = fattoriale(4) alla variabile n viene assegnato il valore 4 vengono eseguite le istruzioni del corpo del metodo, tra cui l’istruzione return f; l’assegnazione a r può essere completata, memorizzando il valore restituito dal metodo 18 Definizione di metodi viene restituito 24, il valore di f Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Sovraccarico di nomi Una classe può definire più metodi che hanno lo stesso nome class Maggiore { /* Calcola il public static ... } /* Calcola il public static ... } } 19 maggiore tra i due numeri a e b. */ int maggiore(int a, int b) { maggiore tra i tre numeri a, b e c. */ int maggiore(int a, int b, int c) { il nome maggiore è sovraccarico Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La classe Maggiore class Maggiore { /* Calcola il maggiore tra i due numeri a e b. */ public static int maggiore(int a, int b) { int max; // il maggiore tra a e b if (a>b) max = a; else max = b; return max; } /* Calcola il maggiore tra i tre numeri a, b e c. */ public static int maggiore(int a, int b, int c) { int maxAB; // il maggiore tra a e b int maxABC; // il maggiore tra a, b e c maxAB = Maggiore.maggiore(a,b); maxABC = Maggiore.maggiore(maxAB,c); return maxABC; } } 20 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Auto-referenziazione /* Calcola il maggiore tra i tre numeri a, b e c. */ public static int maggiore(int a, int b, int c) { int maxAB; // il maggiore tra a e b int maxABC; // il maggiore tra a, b e c maxAB = maggiore(a,b); maxABC = maggiore(maxAB,c); return maxABC; } 21 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Composizione dell’invocazione di metodi L’auto-referenziazione consente di scrivere espressioni più compatte ma ancora leggibili /* Calcola il maggiore tra tre numeri. */ public static int maggiore(int a, int b, int c) { return maggiore( maggiore(a,b), c ); } 22 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Classi e applicazioni Una classe può avere più di una finalità in particolare, una classe può essere contemporaneamente una applicazione e il progetto di un oggetto classe 23 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La classe applicazione Fattoriale import fiji.io.*; /* Classe per il calcolo del fattoriale. */ class Fattoriale { /* Calcola e restituisce il fattoriale di n. */ public static int fattoriale(int n) { // pre: n>=0 int f; // il fattoriale di n int i; // per iterare tra 1 e n /* calcola il fattoriale di n */ f = 1; for (i=1; i<=n; i++) f = f*i; return f; } /* L'applicazione Fattoriale legge dalla tastiera un numero * e ne calcola e visualizza il fattoriale. */ public static void main(String[] args) { int n; // un numero } 24 } System.out.print("Scrivi un numero naturale: "); n = Lettore.in.leggiInt(); System.out.println("Il fattoriale di " + n + " è " + fattoriale(n)); Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Visibilità delle variabili Una variabile locale a un metodo è visibile solo nell’ambito di una specifica attivazione di quel metodo il seguente frammento di codice non è corretto public static void alfa() { int a; a = 5; beta(); } public static void beta() { System.out.println(a); } 25 Definizione di metodi // invoca un altro metodo // NO, a non è visibile Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Visibilità delle variabili Un altro esempio di codice non corretto public static void gamma() { doppio(5); System.out.println(d); } // invoca un altro metodo // NO, d non è visibile public static void doppio(int n) { int d; // il doppio di n d = n*2; } 26 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Programmazione strutturata (e non) La programmazione strutturata è una disciplina di programmazione che ha lo scopo di semplificare la struttura del codice, regolando le modalità di composizione delle istruzioni, in modo da ottenere codice la cui struttura, dal punto di vista del controllo, sia facilmente individuabile e comprensibile un esempio di codice non strutturato /* Calcola il maggiore tra i due numeri a e b. */ public static int maggiore(int a, int b) { if (a>b) return a; else return b; } 27 facilmente leggibile – in questo caso scarsamente leggibile – in presenza di metodi molto lunghi Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Effetti collaterali Effetto collaterale provocato dall’esecuzione di un metodo (o costruttore) la modifica a una variabile che non è locale al metodo (o costruttore) 28 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl La classe Numero Numero valore : int «costruttore» Numero(int v) «operazioni» int getValore() void setValore(int v) 29 un oggetto Numero rappresenta un numero intero, con il suo valore num = new Numero(3) crea un nuovo oggetto num di tipo Numero che rappresenta il numero 3 num.getValore() restituisce il valore rappresentato dall’oggetto num num.setValore(8) modifica il valore rappresentato dall’oggetto num Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Effetti collaterali Numero a; a = new Numero(3); System.out.println( a.getValore() ); l’esecuzione del costruttore modifica il valore della variabile d’istanza dell’oggetto Numero effetto collaterale a.setValore(4); System.out.println( a.getValore() ); 30 // 3 // 4 l’esecuzione del metodo setValore modifica il valore della variabile d’istanza dell’oggetto Numero effetto collaterale Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Altri effetti collaterali Numero a, b; a = new Numero(4); b = a; // b referenzia lo stesso oggetto // referenziato da a System.out.println( b.getValore() ); // 4 si considerino anche le seguenti istruzioni a.setValore(5); System.out.println( a.getValore() ); System.out.println( b.getValore() ); 31 // 5 // 5 la modifica dell’oggetto referenziato da a ha modificato anche l’oggetto referenziato da b in realtà si tratta dello stesso oggetto gli effetti collaterali più spiacevoli sono quelli che modificano lo stato di oggetti accessibili da più variabili Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi di supporto Nella realizzazione di un metodo M può essere utile definire altri metodi per semplificare la scrittura di M si tratta di metodi di supporto Voglio definire una operazione (metodo) per verificare se un numero intero positivo N è perfetto N è perfetto se la somma dei suoi divisori (N escluso) è uguale a N 6 = 1+2+3, 10 ≠ 1+2+5 è utile un metodo di supporto per calcolare la somma dei divisori di un numero intero positivo N 32 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi di supporto /* Verifica se il numero n è perfetto. */ public static boolean perfetto(int n) { // pre: n>0 return n==sommaDivisori(n); } /* Calcola la somma dei divisori interi di n, * n escluso. */ private static int sommaDivisori(int n) { // pre: n>0 int sd; // somma dei divisori di n int d; // per iterare da 1 a n-1 sd = 0; for (d=1; d<n; d++) if (n%d==0) sd = sd+d; return sd; } 33 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Metodi di supporto Un metodo di supporto utile se implementa una “funzionalità ben precisa e significativa” utile se semplifica l’implementazione di un altro metodo può supportare la definizione di più metodi /* Verifica se il numero n è difettivo. */ public static boolean difettivo(int n) { // pre: n>0 return sommaDivisori(n)<n; } 34 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Il modificatore private private static int sommaDivisori(int n) { ... } 35 per il metodo sommaDivisori è stato usato il modificatore private sommaDivisori è un metodo privato i metodi privati non definiscono operazioni possono essere invocati solo da istruzioni scritte nella stessa classe non possono essere invocati da istruzioni scritte al di fuori della classe la privatezza dei metodi è definita nell’ambito di una classe Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame dei parametri Il legame dei parametri è l’associazione che avviene tra parametri attuali e parametri formali durante l’attivazione di un metodo Due modalità principali di legame dei parametri legame dei parametri per valore legame dei parametri per riferimento 36 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame dei parametri per valore Nel legame dei parametri per valore i parametri attuali sono espressioni ciascuna variabile parametro formale prende come valore iniziale il valore del parametro attuale nella posizione corrispondente 37 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame per valore e parametri di tipo primitivo Quali valori vengono stampati dalla seguente applicazione? class LegamePerValoreUno { public static void alfa(int m) { System.out.println(m); // m = m+1; System.out.println(m); // } public static void main(String[] int k = 5; System.out.println(k); // alfa(k); System.out.println(k); // } } 38 Definizione di metodi sicuramente 5 sicuramente 6 args) { sicuramente 5 5 oppure 6? Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame per valore e parametri di tipo primitivo Quali valori vengono stampati dalla seguente applicazione? class LegamePerValoreDue { public static void alfa(int k) { System.out.println(k); // k = k+1; System.out.println(k); // } public static void main(String[] int k = 5; System.out.println(k); // alfa(k); System.out.println(k); // } } 39 Definizione di metodi sicuramente 5 sicuramente 6 args) { sicuramente 5 5 oppure 6? Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame per valore e parametri di tipo riferimento Quali valori vengono stampati dalla seguente applicazione? class LegamePerValoreTre { public static void alfa(Numero m) { System.out.println(m.getValore()); // sicuramente 5 m = new Numero(6); System.out.println(m.getValore()); // sicuramente 6 } public static void main(String[] args) { Numero k = new Numero(5); System.out.println(k.getValore()); // sicuramente 5 alfa(k); System.out.println(k.getValore()); // 5 oppure 6? } } 40 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame per valore e parametri di tipo riferimento Quali valori vengono stampati dalla seguente applicazione? class LegamePerValoreQuattro { public static void alfa(Numero m) { System.out.println(m.getValore()); // /* modifica lo stato dell'oggetto * passato come parametro */ m.setValore(6); System.out.println(m.getValore()); // } public static void main(String[] args) { Numero k = new Numero(5); System.out.println(k.getValore()); // alfa(k); System.out.println(k.getValore()); // } } 41 Definizione di metodi sicuramente 5 sicuramente 6 sicuramente 5 5 oppure 6? Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame dei parametri per riferimento Nel legame dei parametri per riferimento ciascun parametro attuale deve essere una variabile dello stesso tipo del parametro formale nella posizione corrispondente ciascuna variabile parametro formale viene usata come riferimento alla variabile parametro attuale nella posizione corrispondente 42 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame dei parametri per riferimento Legame dei parametri per riferimento in C# il parametro formale deve essere preceduto dalla parola ref anche i parametri formali devono essere preceduti da ref Quali valori vengono stampati dalla seguente applicazione? class LegamePerRiferimentoUno { public static void alfa(ref int m) { System.out.println(m); // sicuramente 5 m = m+1; System.out.println(m); // sicuramente 6 } public static void main(String[] args) { int k = 5; System.out.println(k); // sicuramente 5 alfa(ref k); System.out.println(k); // 5 oppure 6? } } 43 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Legame dei parametri per riferimento Quali valori vengono stampati dalla seguente applicazione? class LegamePerRiferimentoDue { public static void alfa(ref Numero m) { System.out.println(m.getValore()); // m = new Numero(6); System.out.println(m.getValore()); // } public static void main(String[] args) { Numero k = new Numero(5); System.out.println(k.getValore()); // alfa(ref k); System.out.println(k.getValore()); // } } 44 Definizione di metodi sicuramente 5 sicuramente 6 sicuramente 5 5 oppure 6? Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Linee guida È possibile definire metodi con le seguenti motivazioni metodi (pubblici) che implementano operazioni metodi di supporto (privati) che semplificano l’implementazione di altri metodi È possibile definire metodi per calcolare funzioni provocare effetti collaterali ogni metodo dovrebbe implementare una funzionalità ben precisa e significativa Quando definire un metodo? la scelta di definire metodi che implementano operazioni è una scelta progettuale, di alto livello la scelta di definire metodi di supporto è una scelta realizzativa, di basso livello 45 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Linee guida Se un metodo implementa un algoritmo che risolve un problema il nome del problema suggerisce il nome del metodo l’insieme di ingresso del problema è rappresentato dai parametri formali del metodo l’insieme di uscita del metodo è rappresentato dal tipo di ritorno del metodo la pre-condizione e la post-condizione vanno opportunamente documentate – mediante commenti l’algoritmo è implementato dal corpo del metodo I metodi di supporto normalmente implementano passi di algoritmi identificati nella progettazione di algoritmi per raffinamenti successivi 46 Definizione di metodi Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl