Top Banner
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
34

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

Jul 20, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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