Skip to main content

Controllare il flusso di dati

Obiettivi di apprendimento

Al completamento di questa unità, sarai in grado di:

  • Elencare gli utilizzi degli operatori di confronto.
  • Descrivere la differenza tra istruzioni switch e if-else.

Nella vita di ogni giorno dobbiamo continuamente prendere decisioni. Cosa devo indossare oggi? Che cosa mangio a pranzo? Devo andare a destra o a sinistra? Quando si programma accade la stessa cosa. Ritorniamo allo pseudocodice che abbiamo scritto nell'unità 1, in particolare al passaggio 2.

Boil water in a Tea Kettle
Fill Kettle with Water
Switch Kettle On
Wait for Water to Boil

Sembra tutto abbastanza preciso, no? Per far bollire l'acqua, riempiamo il bollitore, lo accendiamo e aspettiamo che l'acqua bolla. E se c'è già dell'acqua nel bollitore? E se il bollitore è pieno? Per quanto tempo deve bollire l'acqua?

Espressioni e operatori di espressione

Spesso, prima di prendere una decisione facciamo dei confronti. Questo oggetto è più grande di quell'altro? Questo oggetto è uguale a quell'altro? Gli sviluppatori confrontano spesso dei valori prima di prendere delle decisioni nelle loro applicazioni. Nel codice, un confronto tra due espressioni viene eseguito collocando un operatore di espressione tra loro.

Un'espressione è un frammento di codice che, quando viene eseguito, restituisce un unico valore come risultato. Per gli scopi di questo modulo, un'espressione può essere un valore letterale (ad esempio, 12), una variabile (ad esempio, numberOfTeaCups) o un'operazione matematica (ad esempio 7 x 4).

Gli operatori di espressione confrontano due valori, o determinano se questi sono uguali. Un'istruzione di confronto consiste di due espressioni separate da un operatore di espressione e restituisce un valore booleano, ossia vero o falso.

Operatori di confronto

Operatore Descrizione Sintassi Risultato
<
Minore di
1 < 2
VERO
<=
Minore o uguale a
1 <= 2
3 <= 3
VERO
==
Uguale a
10 == 10
VERO
!=
<>
Non uguale a
10 != 0
10 <> 11
VERO
>
Maggiore di
11 > 10
VERO
>=
Maggiore o uguale a
40 >=10
40 >= 40
VERO

Perché l'operatore Uguale a è composto da due segni di uguale? Ricorda che abbiamo usato il segno di uguale in questa istruzione:

Integer i = 2;

Un solo segno di uguale ( = ) è un operatore di assegnazione, cioè viene utilizzato per assegnare valori. Due segni di uguale ( == ) costituiscono un operatore di confronto, cioè vengono utilizzati per confrontare due valori e determinare se sono uguali (vero) o non uguali (falso).

Gli operatori sono particolarmente utili quando bisogna confrontare un valore noto con una variabile, oppure i valori di due variabili.

Integer numberOfTeaCups = 2;
numberOfTeaCups == 3;  //false
numberOfTeaCups == 2; //true

Abbiamo visto un esempio di una variabile di tipo Integer e di una variabile di tipo String. Possiamo anche creare una variabile di tipo Boolean che contenga il risultato di un confronto. Guarda qui:

Integer numberOfTeaCups = 2;
Boolean result = numberOfTeaCups > 3; // 2 > 3 = false

Nella riga 1 abbiamo impostato il valore della variabile numberOfTeaCups su 2.

Nella riga 2 abbiamo creato una variabile di tipo Boolean denominata result, confrontato il valore della variabile numberOfTeaCups con il numero 3 e assegnato il risultato del confronto (false) alla variabile result.

Anche se i confronti aiutano a determinare in che modo una cosa è correlata a un'altra, sono veramente utili all'interno di istruzioni condizionali, dove consentono di prendere decisioni.

Istruzioni condizionali

Gli sviluppatori utilizzano le espressioni all'interno di istruzioni condizionali per creare strutture decisionali in cui sono specificate una o più condizioni che devono essere valutate o verificate dal programma. Wow, questo sì che è un discorso complicato. Analizziamolo in dettaglio.

Un'istruzione condizionale presenta due o più opzioni. Se in precedenza ti è capitato di creare criteri in Flow Builder, hai già usato questo tipo di istruzioni. Ad esempio: "Se Stato è uguale a California, mostra i record nella visualizzazione elenco" è un'istruzione condizionale. "Stato è uguale a California" è la condizione e "mostra i record nella visualizzazione elenco" è l'azione che il programma eseguirà solo quando la condizione è vera. In questo esempio, le due opzioni sono "mostra i record" (esplicita) e "non mostrare i record" (implicita).

Istruzioni If-Else

Un tipo di istruzione condizionale comunemente usata in Apex sono le istruzioni if-else. Ecco il loro aspetto:

if(condition is true) {
    //do this
} else {
    //do this
}

La riga 1 contiene la condizione (scritta all'interno delle parentesi).
La riga 2 contiene il codice da eseguire quando la condizione della riga 1 è vera.
La riga 3 introduce la seconda opzione: l'opzione else.
La riga 4 contiene il codice da eseguire quando la condizione della riga 1 è falsa.

In Apex, le istruzioni condizionali vanno inserite tra parentesi graffe: { }. A ciascuna parentesi graffa aperta ({) deve corrispondere una parentesi graffa chiusa (}). Quando in un blocco di codice a una parentesi graffa non ne corrisponde una chiusa, si verifica un errore.

Usiamo un'istruzione condizionale nello pseudocodice della nostra classe Teatime per verificare il livello dell'acqua nel bollitore e decidere cosa fare in base a questa condizione.

  1. Nella Developer Console, fai clic su Debug | Open Execute Anonymous Window (Apri finestra di esecuzione anonima).
  2. Copia il codice seguente e incollalo nella finestra Enter Apex Code (Inserisci codice Apex).
    String waterLevel = 'full'; /*This variable keeps track of the water level status: full or empty*/
      
    if(waterLevel == 'empty') {
        System.debug('Fill the tea kettle');
        waterLevel = 'full'; /*Once the tea kettle is filled the variable is changed to full*/
    } else {
        System.debug('The tea kettle is full');
    }
  3. Seleziona la casella di controllo Open log (Apri registro) e fai clic su Execute (Esegui). Si apre la finestra Execution Log (Registro di esecuzione), in cui è visualizzato il risultato dell'esecuzione del codice.
  4. Seleziona la casella di controllo Debug Only (Solo debug) nella parte bassa della finestra.

Nella riga 1 abbiamo inizializzato la variabile waterLevel su full (pieno). Nel codice, i valori delle variabili vengono normalmente inseriti dagli utenti o derivano da altri dati e non vengono specificati all'interno del codice stesso. Nel nostro esempio della classe Teatime, i dati dovrebbero provenire da un sensore che determina il livello dell'acqua all'interno del bollitore. Quando questi dati non sono disponibili, gli sviluppatori impostano temporaneamente i valori direttamente nel codice, in modo da poterlo eseguire e testare. L'impostazione di valori nel codice è nota come "codifica fissa". Per poter effettuare i test, abbiamo specificato il valore della variabile waterLevel su full (pieno) utilizzando la codifica fissa. Dal momento che questo valore è già impostato, la prima istruzione if (nella riga 3) non verrà mai eseguita, perché il valore iniziale di waterLevel non sarà mai empty (vuoto).

Il codice controlla se il valore della variabile waterLevel è uguale a empty (vuoto). Poiché abbiamo specificato il valore full (pieno) per waterLevel utilizzando la codifica fissa, l'istruzione if restituisce false. Quando la condizione dell'istruzione if è falsa, viene eseguito il blocco di codice else.

Il nostro codice al momento gestisce due opzioni: il livello dell'acqua nel bollitore può essere uguale a full (pieno) o a empty (vuoto). Ma ci sono anche altre possibilità, non ti pare? Il bollitore potrebbe essere solo parzialmente pieno. Come facciamo a gestire più di due possibilità?

Istruzioni If-Else If

Per gestire più di due possibilità possiamo utilizzare un'istruzione if-else if. Questo tipo di istruzione aggiunge un'altra condizione if prima della condizione else finale. Esaminiamo un esempio pratico.

  1. Nella Developer Console, fai clic su Debug | Open Execute Anonymous Window (Apri finestra di esecuzione anonima).
  2. Copia il codice seguente e incollalo nella finestra Enter Apex Code (Inserisci codice Apex).
    String waterLevel = 'half';
      
    if(waterLevel == 'empty') {
        System.debug('Fill the tea kettle');
        waterLevel = 'full';
    } else if(waterLevel == 'half') {
        System.debug('Fill the tea kettle');
        waterLevel = 'full';
    } else { /*This statement only runs if line 3 and line 6 result in false.*/
        System.debug('The tea kettle is full');
    }
  3. Seleziona la casella di controllo Open log (Apri registro) e fai clic su Execute (Esegui). Si apre la finestra Execution Log (Registro di esecuzione), in cui è visualizzato il risultato dell'esecuzione del codice.
  4. Seleziona la casella di controllo Debug Only (Solo debug) nella parte bassa della finestra.

Durante il testing del codice, cambia il valore della variabile waterLevel nella riga 1. L'output nel registro di debug rifletterà le tue modifiche. Prova tutti e tre i valori: half (metà), full (pieno) ed empty (vuoto).

Disponi le istruzioni condizionali in modo che la prima condizione sia quella più frequente. Questa disposizione riduce le righe di codice che devono essere eseguite per questo blocco di codice. Nell'esempio della nostra classe Teatime, il bollitore è spesso vuoto, quindi mettiamo questa condizione al primo posto. Poiché è improbabile che il bollitore sia pieno, controlliamo questa condizione per ultima.

Istruzioni Switch

Un'alternativa più efficiente rispetto alle istruzioni if-else sono le istruzioni switch. In un'istruzione switch, viene specificato un insieme di valori e viene verificata un'espressione per determinare se questa corrisponde a uno dei valori. Ecco l'aspetto di un'istruzione di questo tipo:

switch on expression {
    when value1 {
        //code block 1
    }
    when value2 {
        //code block 2
    }
    when else { //if none of the previous values apply
        //code block 3
    }
}

In un'istruzione switch, puoi specificare uno o più valori dopo la parola riservata when.

switch on expression {
    when value1 { //single value
        //code block 1
    }
    when value2, value3 { //multiple values
        //code block 2
    }
}

Applichiamo un'espressione switch allo pseudocodice della nostra classe Teatime.

  1. Nella Developer Console, fai clic su Debug | Open Execute Anonymous Window (Apri finestra di esecuzione anonima).
  2. Copia il codice seguente e incollalo nella finestra Enter Apex Code (Inserisci codice Apex).
    String waterLevel = 'empty';
      
    //option 1 using a single value
    switch on waterLevel {
        when 'empty' {
            System.debug('Fill the tea kettle');
        }
        when 'half' {
            System.debug('Fill the tea kettle');
        }
        when 'full' {
            System.debug('The tea kettle is full');
        }
        when else {
            System.debug('Error!');
        }
    }
      
    //option 2 using multiple values
    switch on waterLevel {
        when 'empty', 'half' { //when waterLevel is either empty or half
            System.debug('Fill the tea kettle');
        }
        when 'full' {
            System.debug('The tea kettle is full');
        }
        when else {
            System.debug('Error!');
        }
    }
  3. Seleziona la casella di controllo Open log (Apri registro) e fai clic su Execute (Esegui). Si apre la finestra Execution Log (Registro di esecuzione), in cui è visualizzato il risultato dell'esecuzione del codice.
  4. Seleziona la casella di controllo Debug Only (Solo debug) nella parte bassa della finestra.

Operatori logici

Abbiamo visto come gestire due o più condizioni. Ora possiamo chiederci: cosa facciamo quando una singola condizione può essere soddisfatta da più di un valore?

Operatori logici

Operatore OR AND
Simbolo dell'operatore || &&
Pseudocodice Se X o Y, esegui questa operazione.
altrimenti, esegui un'altra operazione.
Se X e Y, esegui questa operazione.
altrimenti, esegui un'altra operazione.
Codice Apex if(X || Y) {
//esegui questa operazione
} else {
//esegui questa operazione
}

if(X && Y) {
//esegui questa operazione
} else {
//esegui questa operazione
}

Gli operatori logici and e or consentono di scrivere codice in cui vengono controllati più valori per determinare se una condizione è vera o falsa. L'operatore and richiede che tutti i valori siano veri per soddisfare la condizione. L'operatore or richiede che almeno uno dei valori sia vero per soddisfare la condizione.

Computazione degli operatori logici

Operatore logico Sintassi Descrizione
&& (AND)
X && Y

System.debug(true && true); // true

System.debug(false && true); //false

System.debug(true && false); // false

System.debug(false && false); //false
X e Y sono valori booleani. Se sia X che Y sono veri, allora l'espressione restituisce true. In tutti gli altri casi, l'espressione restituisce false.
|| (OR)
X || Y

System.debug(true || true); //true

System.debug(false || true); //true

System.debug(true || false); //true

System.debug(false || false); //false
X e Y sono valori booleani. Se sia X che Y sono falsi, allora l'espressione restituisce false. In tutti gli altri casi, l'espressione restituisce true.

Proviamo gli operatori logici. Ecco il codice che abbiamo scritto utilizzando un'espressione if-else if.

String waterLevel = 'half';
  
if(waterLevel == 'empty') {
    System.debug('Fill the tea kettle');
    waterLevel = 'full';
} else if(waterLevel == 'half') {
    System.debug('Fill the tea kettle');
    waterLevel = 'full';
} else { //This statement only runs if line 3 and line 6 result in false.
    System.debug('The tea kettle is full');
}

Come puoi vedere, le righe 4-5 e 7-8 sono identiche. Questa situazione è definita "codice ridondante". L'eliminazione della ridondanza è una best practice perché rende il codice più leggibile semplificando la sua comprensione e manutenzione e l'esecuzione del debug. Il codice esegue le stesse azioni sia quando waterLevel è uguale a empty (vuoto), sia quando è uguale a half (metà). Possiamo semplificare il codice combinando empty (vuoto) e half (metà) in una singola condizione. Utilizzeremo l'operatore or in modo che la condizione sia soddisfatta quando uno qualsiasi dei due valori (empty (vuoto) o half (metà)) è vero.

  1. Nella Developer Console, fai clic su Debug | Open Execute Anonymous Window (Apri finestra di esecuzione anonima).
  2. Copia il codice seguente e incollalo nella finestra Enter Apex Code (Inserisci codice Apex).
    String waterLevel = 'half';
      
    if(waterLevel == 'empty' || waterLevel == 'half') {
        System.debug('Fill the tea kettle');
        waterLevel = 'full';
    } else { //This statement only runs if line 3 false.
        System.debug('The tea kettle is full');
    }
  3. Seleziona la casella di controllo Open log (Apri registro) e fai clic su Execute (Esegui). Si apre la finestra Execution Log (Registro di esecuzione), in cui è visualizzato il risultato dell'esecuzione del codice.
  4. Seleziona la casella di controllo Debug Only (Solo debug) nella parte bassa della finestra.

Ecco fatto. Abbiamo rimosso la ridondanza dal codice. L'uso di operatori logici (&& e ||) è un metodo efficace per rimuovere o ridurre la ridondanza nel codice e migliorarne la leggibilità.

Scrivere codice ordinato

Nella programmazione esistono spesso più modi di fare la stessa cosa. Ad esempio, puoi arrivare agli stessi risultati sia usando istruzioni switch, sia usando istruzioni if-else. Quando selezioni il tipo di istruzioni da utilizzare, l'importante è valutare in che modo ciascun tipo influenza la leggibilità del codice. Man mano che continui a scrivere codice, imparerai diversi modi per scrivere codice ordinato. Per ora, concentrati sulla scrittura di codice facile da leggere e comprendere.

Risorse

Continua a imparare gratuitamente!
Registra un account per continuare.
Cosa troverai?
  • Ottieni consigli personalizzati per i tuoi obiettivi di carriera
  • Metti in pratica le tue competenze con sfide pratiche e quiz
  • Monitora e condividi i tuoi progressi con i datori di lavoro
  • Accedi a risorse di tutoraggio e opportunità di carriera