Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei...

34
1 Laboratorio di Programmazione - Luca Tesei Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle variabili di frame nei blocchi

Transcript of Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei...

Page 1: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

1Laboratorio di Programmazione - Luca Tesei

Condizionale, blocchi

Comando Condizionale

Blocchi

Gestione dei blocchi da parte della macchina astratta Java

Visibilità (scope) ed esistenza delle variabili di frame nei blocchi

Page 2: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

2Laboratorio di Programmazione - Luca Tesei

Scelte

● Fino ad ora il corpo dei metodi che abbiamo scritto aveva solo un modo di essere eseguito: in sequenza dalla prima istruzione all’ultima

● In applicazioni non banali il comportamento dei metodi deve variare a seconda dei dati di input

● Il programma deve prendere delle decisioni in base ai dati in suo possesso

● Vediamo quindi come si fa ad effettuare delle scelte nei programmi

Page 3: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

3Laboratorio di Programmazione - Luca Tesei

Il costrutto if

● Riconsideriamo la classe BankAccount● Il metodo withdraw preleva dal conto una cifra

qualsiasi● In una applicazione reale, invece, il metodo

dovrebbe controllare se la cifra richiesta è disponibile e solo in quel caso effettuare il prelievo

● Per far questo si può usare lo statement (enunciato) if

Page 4: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

4Laboratorio di Programmazione - Luca Tesei

Il costrutto if

public class BankAccount {...public void withdraw(double amount) { if (amount <= balance) balance = balance – amount; }...}

Page 5: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

5Laboratorio di Programmazione - Luca Tesei

Il costrutto if

● In questo modo l’assegnamento balance = balance – amount; viene eseguito solo se la condizione tra parentesi tonde è vera.

● Il significato di (amount <= balance) è un valore di tipo boolean, cioè un valore nell’insieme {true, false}

● L’espressione è vera (true) se il valore della variabile amount (parametro esplicito del metodo) è minore o uguale al valore della variabile istanza balance dell’oggetto si cui si sta eseguendo il metodo

Page 6: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

6Laboratorio di Programmazione - Luca Tesei

Rappresentazione con diagramma a blocchi

amount <= balance

balance = balance - amount

Vero

Falso

Page 7: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

7Laboratorio di Programmazione - Luca Tesei

Il costrutto if

● Se la condizione risulta falsa l’if da solo non fa niente e il controllo passa al comando successivo

● Potremmo pensare, comunque, di avvertire in qualche modo l’utente che il prelievo non è possibile

● Per far questo è possibile aggiungere all’if un’alternativa (else) che contiene un comando che viene eseguito solo se la condizione è falsa (false)

Page 8: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

8Laboratorio di Programmazione - Luca Tesei

Il costrutto if-else

public class BankAccount {...public void withdraw(double amount) { if (amount <= balance) balance = balance – amount; else System.out.println( “Importo Richiesto Non Disponibile”); }...}

Attenzione! Questo tipo di output non è adatto quando laclasse è di Back-end. In una versione corretta invece di

stampare un messaggio va lanciata un'eccezione o restituitoun valore di ritorno che segnala l'anomalia

Page 9: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

9Laboratorio di Programmazione - Luca Tesei

Il costrutto if-else

La semantica dell’if-else è la seguente:1)Viene calcolato il valore dell’espressione di tipo boolean fra parentesi tonde

2)Se l’espressione ha valore true allora viene eseguito il comando che si trova tra l’espressione e la parola riservata else.

3)Se l’espressione ha valore false allora viene eseguito il comando che si trova dopo la parola riservata else

4)In ogni caso, dopo l’esecuzione del comando corrispondente (caso 2 o caso 3), l’esecuzione continua con l’enunciato che segue

Page 10: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

10Laboratorio di Programmazione - Luca Tesei

Rappresentazione con diagramma a blocchi

amount <= balance

balance = balance - amount

Vero

Falso

Importo Richiesto Non Disponibile

Page 11: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

11Laboratorio di Programmazione - Luca Tesei

Attenzione: errore!

public class BankAccount {...public void withdraw(double amount) { if (amount <= balance) balance = balance – amount; if (amount > balance) System.out.println( “Importo Richiesto Non Disponibile”); }...}

Errore! Non è la stessa cosa dell'if-else: dopo l'esecuzione delprimo if il valore di balance può essere diverso e l'espressionenegata potrebbe diventare vera, mentre all'inizio era falsa!

Page 12: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

12Laboratorio di Programmazione - Luca Tesei

Rappresentazione con diagramma a blocchi

amount <= balance

balance = balance - amount

Vero

Falso

amount > balance

Vero

Falso

Importo Richiesto Non Disponibile

Percorso chenon esiste nell’if-else

Page 13: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

13Laboratorio di Programmazione - Luca Tesei

Blocchi

● Il costrutto if o if-else prevede che sia inserito un solo comando dopo l’espressione tra parentesi e dopo la parola riservata else

● Invece potremmo aver bisogno di eseguire più di un comando nel “ramo true” e/o nel “ramo false”

● Per far questo usiamo la possibilità, offerta dal linguaggio Java, di creare blocchi di comandi

Page 14: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

14Laboratorio di Programmazione - Luca Tesei

Blocchi

● Un blocco inizia con { e finisce con }● All’interno delle parentesi graffe possono essere

inseriti zero o più enunciati● Un blocco può essere inserito in qualunque

punto all’interno del corpo di un metodo● I blocchi possono essere annidati: un blocco

può contenere altri blocchi che a loro volta possono contenere altri blocchi

● Un blocco viene visto dalla macchina astratta java come un unico enunciato

Page 15: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

15Laboratorio di Programmazione - Luca Tesei

Blocchi

● Supponiamo ad esempio che se un utente tenta di prelevare del denaro che non ha, oltre alla stampa del messaggio, venga anche decrementato il saldo di una penale costante

● Possiamo scrivere così:

Page 16: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

16Laboratorio di Programmazione - Luca Tesei

Blocchi

public class BankAccount {...public static final double PENALE = 5.0;public void withdraw(double amount) { if (amount <= balance) { double newBalance = balance – amount; balance = newBalance; } else { System.out.println(“Importo Richiesto Non

Disponibile”); balance = balance – PENALE; System.out.println(“Penale di “ + PENALE + “ euro applicata”); } }...}

Blocco del ramotrue

Blocco del ramofalse

Page 17: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

17Laboratorio di Programmazione - Luca Tesei

Blocchi e variabili di frame

● Nel blocco del ramo “true” dichiariamo una nuova variabile di tipo double che chiamiamo newBalance

● In Java, quando si apre un nuovo blocco, viene sempre aggiunto un frame nuovo nella pila di frame contenuta nell’attivazione corrente

● Le variabili dichiarate all’interno del nuovo blocco hanno scope (contesto) limitato ad esso

● Esse cesseranno di esistere quando l’esecuzione di tutti i comandi del blocco sarà finita e, quindi, il frame verrà buttato via

Page 18: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

18Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

• Ricordiamoci che quando viene riferita una variabile con un certo nome all’interno di un metodo la macchina astratta Java segue un algoritmo ben preciso per rintracciarla:

1. Cerca il nome all’interno del frame in testa alla pila di frame dell’attivazione corrente

3. Se lo trova allora quella è la variabile riferita4. Se non lo trova lo cerca all’interno dei frame

sottostanti dal più recente a quello più in basso. 5. Se non lo trova in nessun frame la variabile non è

stata dichiarata (è un errore che viene segnalato dal compilatore)

Page 19: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

19Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi: conflitto

● Il compilatore non permette, all’interno della stessa attivazione, di ridefinire un nome di variabile, anche se in un blocco interno

● Facciamo un esempio. Supponiamo di trovarci nella seguente situazione alla chiamata del metodo withdraw su un certo oggetto creato in un main

Page 20: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

20Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

public void withdraw(double amount) { double newBalance = balance – amount; if (newBalance >= 0) balance = newBalance; else { System.out.println(“Importo Richiesto Non

Disponibile”); { // Nuovo Blocco // non posso ridichiarare newBalance double penaltyBalance = balance – PENALE; balance = penaltyBalance; } // penaltyBalance non esiste più! System.out.println(“Penale di “ + PENALE + “ euro applicata”); } }

Posizione attuale

Page 21: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

21Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (congelata/non raggiungibile)

this

amount 100.0

BankAccount

balance 90.0

HeapAttivazione dellachiamata di withdraw

Primo frame (corrisponde al blocco principale del metodo)

Page 22: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

22Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

public void withdraw(double amount) { double newBalance = balance – amount; if (newBalance >= 0) balance = newBalance; else { System.out.println(“Importo Richiesto Non Disponibile”); { // Nuovo Blocco // Non posso ridichiarare newBalance double penaltyBalance = balance – PENALE; balance = penaltyBalance; } // penaltyBalance non esiste più! System.out.println(“Penale di “ + PENALE + “ euro applicata”); } }

Posizione attuale

Page 23: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

23Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (congelata/non raggiungibile)

this

amount 100.0

BankAccount

balance 90.0newBalance -10.0

Page 24: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

24Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

public void withdraw(double amount) { double newBalance = balance – amount; if (newBalance >= 0) balance = newBalance; else { System.out.println(“Importo Richiesto Non

Disponibile”); { // Nuovo Blocco // non posso ridichiarare newBalance double penaltyBalance = balance – PENALE; balance = penaltyBalance; } // penaltyBalance non esiste più! System.out.println(“Penale di “ + PENALE + “ euro applicata”); } }

Posizione attuale

Page 25: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

25Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (congelata/non raggiungibile)

this

amount 100.0

BankAccount

balance 90.0newBalance -10.0

L’apertura di un nuovo bloccocorrisponde alla crazione di un nuovo frame in testa allapila

Page 26: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

26Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

public void withdraw(double amount) { double newBalance = balance – amount; if (newBalance >= 0) balance = newBalance; else { System.out.println(“Importo Richiesto Non

Disponibile”); { // Nuovo Blocco // non posso ridichiarare newBalance double penaltyBalance = balance – PENALE; balance = penaltyBalance; } // penaltyBalance non esiste più! System.out.println(“Penale di “ + PENALE + “ euro applicata”); } }

Posizione attuale

Page 27: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

27Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (congelata/non raggiungibile)

BankAccount

balance 90.0

Heap

this

amount 100.0

newBalance -10.0

penaltyBalance 85.0

Nuovo frame per il nuovoblocco. La variabile penaltyBalance nasce e muorecon il nuovo blocco

Page 28: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

28Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

public void withdraw(double amount) { double newBalance = balance – amount; if (newBalance >= 0) balance = newBalance; else { System.out.println(“Importo Richiesto Non

Disponibile”); { // Nuovo Blocco // non posso ridichiarare newBalance double penaltyBalance = balance – PENALE; balance = penaltyBalance; } // penaltyBalance non esiste più! System.out.println(“Penale di “ + PENALE + “ euro applicata”); } }

Posizione attuale

Page 29: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

29Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (congelata/non raggiungibile)

BankAccount

balance 85.0

thisamount 100.0

newBalance -10.0

Il frame per il nuovoblocco e la relativa variabile penaltyBalance vengonobuttati via

Page 30: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

30Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

public void withdraw(double amount) { double newBalance = balance – amount; if (newBalance >= 0) balance = newBalance; else { System.out.println(“Importo Richiesto Non Disponibile”); { // Nuovo Blocco // non posso ridichiarare newBalance double penaltyBalance = balance – PENALE; balance = penaltyBalance; } // penaltyBalance non esiste più! System.out.println(“Penale di “ + PENALE + “ euro applicata”); } } Posizione attuale Blocco del ramo false chiuso

Page 31: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

31Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (congelata/non raggiungibile)

BankAccount

balance 85.0

Heap

thisamount 100.0

newBalance -10.0

Il frame per il bloccodel ramo “false” dell’ifviene buttato via (non contienevariabili) alla fine del blocco

Page 32: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

32Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

● Alla fine dell’esecuzione del blocco principale di withdraw:

public void withdraw(double amount) { double newBalance = balance – amount; ... }

● viene cancellato il frame principale, ma anche tutta l’attivazione creata per eseguirlo

Page 33: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

33Laboratorio di Programmazione - Luca Tesei

Visibilità delle variabili e blocchi

Attivazione delmain (di nuovo in

esecuzione)

BankAccount

balance 85.0

Heap

Page 34: Condizionale, blocchi - Unicam · Condizionale, blocchi Comando Condizionale Blocchi Gestione dei blocchi da parte della macchina astratta Java Visibilità (scope) ed esistenza delle

34Laboratorio di Programmazione - Luca Tesei

Esercizio

● Riprogettare e reimplementare la classe BankAccount secondo i seguenti requisiti:

● è possibile chiedere ad un BankAccount se un prelievo è possibile e, se c'è, a quanto ammonta la penale

● il metodo withdraw non stampa sullo standard output, ma segnala ciò che ha fatto tramite un numero intero scelto fra le due seguenti costanti intere (da definire): WITHDRAW_OK, WITHDRAW_FAILED_PENALTY