Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi1 Capitolo 15 febbraio 2004
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi2 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi3 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"); }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi4 La classe Salutatore e l’oggetto classe Salutatore è possibile chiedere a Salutatore di eseguire questa operazione mediante la seguente istruzione Salutatore.saluta(); static void saluta() Salutatore void saluta() «oggetto classe» Salutatore
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi5 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 main(...) 1: main(...)1.1: saluta() «oggetto classe» Salutatore void saluta()
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi6 Uso dell’oggetto classe Salutatore viene eseguita il corpo del metodo void saluta() «oggetto classe» Salutatore void saluta() saluta() «applicazione» DemoSalutatore main(…)
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi7 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(); }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi8 AlcuneTabelline static void tabellinaTre() static void tabellinaCinque() AlcuneTabelline void tabellinaTre() void tabellinaCinque() «oggetto classe» AlcuneTabelline
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi9 Metodi e variabili locali public static void tabellinaTre() { int i; // per iterare tra 1 e } public static void tabellinaCinque() { int i; // per iterare tra 1 e } Le variabili dichiarate in un metodo sono locali al metodo ciascun metodo può accedere solo alle proprie variabili locali
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi10 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);
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi11 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(); }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi12 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);
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi13 Esecuzione di un metodo con parametri viene eseguito il corpo del metodo void tabellina(int n) alla variabile n viene assegnato il valore 5 «oggetto classe» Tabelline void tabellina(int n) tabellina(5) viene valutato il valore dell’espressione 5, che è 5
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi14 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi15 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) ); // 24
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi16 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; }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi17 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; } l’istruzione return è l’istruzione che permette a un metodo di restituire un valore
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi18 Esecuzione di un metodo che restituisce un valore vengono eseguite le istruzioni del corpo del metodo, tra cui l’istruzione return f; alla variabile n viene assegnato il valore 4 «oggetto classe» Fattoriale int fattoriale(int n) r = fattoriale(4) viene restituito 24, il valore di f l’assegnazione a r può essere completata, memorizzando il valore restituito dal metodo viene valutato il valore dell’espressione 4, che è 4
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi19 Sovraccarico di nomi Una classe può definire più metodi che hanno lo stesso nome class Maggiore { /* Calcola il maggiore tra i due numeri a e b. */ public static int maggiore(int a, int b) {... } /* Calcola il maggiore tra i tre numeri a, b e c. */ public static int maggiore(int a, int b, int c) {... } il nome maggiore è sovraccarico
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi20 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; }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi21 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; }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi22 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 ); }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi23 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi24 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 System.out.print("Scrivi un numero naturale: "); n = Lettore.in.leggiInt(); System.out.println("Il fattoriale di " + n + " è " + fattoriale(n)); }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi25 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(); // invoca un altro metodo } public static void beta() { System.out.println(a); // NO, a non è visibile }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi26 Visibilità delle variabili Un altro esempio di codice non corretto public static void gamma() { doppio(5); // invoca un altro metodo System.out.println(d); // NO, d non è visibile } public static void doppio(int n) { int d; // il doppio di n d = n*2; }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi27 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; } facilmente leggibile – in questo caso scarsamente leggibile – in presenza di metodi molto lunghi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi28 Effetti collaterali Effetto collaterale provocato dall’esecuzione di un metodo (o costruttore) la modifica a una variabile che non è locale al metodo (o costruttore)
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi29 La classe Numero 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 valore : int «costruttore» Numero(int v) «operazioni» int getValore() void setValore(int v) Numero
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi30 Effetti collaterali Numero a; a = new Numero(3); System.out.println( a.getValore() ); // 3 l’esecuzione del costruttore modifica il valore della variabile d’istanza dell’oggetto Numero effetto collaterale a.setValore(4); System.out.println( a.getValore() ); // 4 l’esecuzione del metodo setValore modifica il valore della variabile d’istanza dell’oggetto Numero effetto collaterale
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi31 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() ); // 5 System.out.println( b.getValore() ); // 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi32 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 ≠ è utile un metodo di supporto per calcolare la somma dei divisori di un numero intero positivo N
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi33 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; }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi34 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; }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi35 Il modificatore private private static int sommaDivisori(int n) {... } 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi36 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi37 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi38 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); // 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(k); System.out.println(k); // 5 oppure 6? }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi39 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); // sicuramente 5 k = k+1; System.out.println(k); // sicuramente 6 } public static void main(String[] args) { int k = 5; System.out.println(k); // sicuramente 5 alfa(k); System.out.println(k); // 5 oppure 6? }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi40 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? }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi41 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()); // sicuramente 5 /* modifica lo stato dell'oggetto * passato come parametro */ m.setValore(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? }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi42 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi43 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? }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi44 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()); // 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(ref k); System.out.println(k.getValore()); // 5 oppure 6? }
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi45 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
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies srl Definizione di metodi46 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