if then else in javascript

if then else in javascript

Ho visto decine di progetti saltare per aria, non a causa di attacchi hacker sofisticati o mancanza di fondi, ma per colpa di una gestione amatoriale della logica condizionale. Ricordo un caso specifico: una piattaforma di e-commerce italiana che perdeva circa 4.000 euro ogni ora durante i saldi. Il problema? Un groviglio di If Then Else In Javascript annidati che gestiva gli sconti stagionali, i coupon fedeltà e le spese di spedizione. Il programmatore originale aveva pensato di coprire ogni caso aggiungendo un altro blocco condizionale sopra quello esistente. Quando è stato aggiunto il terzo livello di nidificazione, il sistema ha iniziato a calcolare prezzi negativi o a bloccare il checkout per gli utenti loggati. Nessuno riusciva a replicare l'errore in locale perché la catena di condizioni era diventata una scatola nera imprevedibile. Questo è il costo reale di una cattiva architettura: ore di debug notturno pagate a peso d'oro e clienti che abbandonano il carrello per sempre.

L'ossessione per il nesting infinito in If Then Else In Javascript

Il primo errore che commette chi non ha mai dovuto gestire un'applicazione in produzione per più di sei mesi è credere che un blocco condizionale sia solo un modo per deviare il flusso del programma. Non lo è. Ogni volta che scrivi una condizione, stai creando un nuovo ramo di realtà che devi testare, documentare e mantenere. La maggior parte degli sviluppatori junior scrive codice che somiglia a una freccia: inizia a sinistra del monitor e finisce a metà schermo verso destra a causa dei continui rientri.

Ho analizzato script dove la logica principale era sepolta sotto sette livelli di parentesi graffe. Questo non è solo brutto da vedere, è pericoloso. Se hai un blocco che controlla se l'utente è loggato, poi se ha un abbonamento attivo, poi se l'abbonamento non è scaduto, poi se il prodotto è disponibile, hai creato un labirinto mentale. Per risolvere questo disastro, devi usare le "guard clauses" (clausole di guardia). Invece di avvolgere tutto il codice buono dentro una condizione, scarta immediatamente i casi negativi e interrompi l'esecuzione della funzione. Se l'utente non è loggato, esci subito. Se non ha l'abbonamento, esci subito. Il codice che rimane sarà pulito, lineare e facile da leggere.

La trappola del ramo else superfluo

C'è questa strana idea che ogni blocco debba avere necessariamente un compagno per gestire l'alternativa. Non è così. Se stai restituendo un valore o lanciando un errore dentro la prima parte della condizione, l'uso di un blocco successivo è uno spreco di spazio e di energia cognitiva. Meno rami crei, meno test unitari dovrai scrivere. Ho visto team di sviluppo perdere giorni interi cercando di coprire con i test rami di codice che, logicamente, non sarebbero mai stati raggiunti, solo perché la struttura sintattica li costringeva a considerarli.

Confondere la verità con la "verità secondo Javascript"

Un errore che drena budget e pazienza riguarda la gestione dei valori cosiddetti "falsy". Javascript non è Java o C++; ha un modo tutto suo di decidere cosa è vero e cosa è falso. Ho assistito al crash di un sistema di gestione magazzino perché qualcuno aveva scritto una condizione per verificare se la quantità di un prodotto fosse presente. Se il prodotto aveva quantità zero, la condizione falliva perché lo zero è considerato falso. Il risultato? Il sistema diceva che il prodotto non esisteva invece di dire che era esaurito.

In questo linguaggio, stringhe vuote, null, undefined, zero e NaN sono tutti interpretati come falsi in un contesto booleano. Se non sei esplicito nei tuoi controlli, stai giocando alla roulette russa con i tuoi dati. Non scrivere mai un controllo generico se stai cercando un valore specifico. Se vuoi sapere se una variabile è null, controlla se è null. Se vuoi sapere se è un numero, usa funzioni che verifichino il tipo. L'imprecisione qui si traduce in bug silenziosi che emergono solo quando il database si riempie di dati reali, diversi dai mock perfetti che hai usato durante lo sviluppo.

Quando il pattern If Then Else In Javascript diventa un debito tecnico insostenibile

Esiste un punto di non ritorno in cui aggiungere un'altra condizione significa condannare il software alla morte per obsolescenza precoce. Questo accade tipicamente quando la logica condizionale viene usata per gestire diversi tipi di oggetti o comportamenti che dovrebbero essere separati. Se il tuo blocco condizionale controlla se l'utente è un "Admin", un "Editor" o un "Guest" per decidere cosa mostrare, hai appena creato un collo di bottiglia. Ogni volta che l'azienda vorrà aggiungere un ruolo "Super-Editor", dovrai dare la caccia a ogni singola istanza di quel blocco condizionale nel progetto e modificarla.

L'alternativa degli oggetti letterali e delle mappe

Invece di accumulare istruzioni una dopo l'altra, i professionisti esperti usano mappe o oggetti per gestire la selezione della logica. Se hai dieci casi diversi, non scriverai dieci rami condizionali. Creerai un oggetto dove le chiavi sono i tuoi casi e i valori sono le funzioni da eseguire. In questo modo, aggiungere una funzionalità diventa un'operazione di inserimento di una nuova chiave, non una chirurgia a cuore aperto su un blocco logico lungo trecento righe. Ho visto questa trasformazione ridurre il tempo di implementazione di nuove feature dal 40% al 5% in sistemi di fatturazione complessi.

💡 Potrebbe interessarti: honor 400 lite quando è uscito

Lo scenario del prima e dopo nella validazione di un modulo

Vediamo come si passa dal disastro alla professionalità attraverso un esempio che ho incontrato in un portale di prenotazioni mediche.

L'approccio sbagliato appariva come una serie di controlli incatenati. Il codice iniziava verificando se il nome fosse presente, poi apriva una parentesi per controllare se l'email fosse valida, poi un'altra per la data di nascita, e infine una per il codice fiscale. Se tutto era corretto, inviava i dati. Il problema era che i messaggi di errore venivano gestiti in una serie di rami alternativi posizionati alla fine di ogni blocco, rendendo impossibile capire quale errore appartenesse a quale controllo senza scorrere continuamente su e giù. Se un medico doveva aggiungere un nuovo campo, come il numero di iscrizione all'albo, doveva inserire un ulteriore livello di annidamento, rischiando di rompere la chiusura di tutte le parentesi precedenti.

L'approccio corretto ha rimpiazzato tutto questo con una lista di validatori indipendenti. Ogni validatore è una funzione autonoma che controlla una sola cosa. Il processo ora scorre in verticale: il sistema esegue il primo controllo, se fallisce lancia un'eccezione con un messaggio specifico e si ferma. Se passa, procede al secondo. Non ci sono parentesi graffe dentro altre parentesi graffe. Il codice è diventato una lista piatta di requisiti. Per aggiungere il numero di iscrizione all'albo, lo sviluppatore ha semplicemente aggiunto una riga alla lista. Il tempo di lettura del codice è passato da minuti a secondi, e i bug legati alla validazione sono spariti completamente nel giro di un rilascio.

L'illusione dell'operatore ternario come salvatore della patria

Molti pensano che sostituire un blocco esteso con un operatore ternario renda il codice "più professionale" o più veloce. Non è vero. L'operatore ternario è utile solo per assegnazioni semplici e dirette. Ho visto sviluppatori scrivere ternari annidati che richiedono una laurea in logica formale per essere decifrati. Se devi leggere una riga di codice tre volte per capire cosa succede, quel codice fa schifo, non importa quanto sia compatto.

🔗 Leggi di più: i can't stand it traduzione

La leggibilità vince sempre sulla brevità. Se un'operazione condizionale è troppo complessa per un semplice controllo, non cercare di comprimerla. Estraila in una funzione con un nome chiaro che spieghi cosa sta verificando. "isUserEligibleForDiscount(user)" è infinitamente meglio di una riga criptica piena di punti interrogativi e due punti che controlla l'età, i punti fedeltà e il paese di residenza. La chiarezza riduce il costo della manutenzione, che è la voce di spesa più grande in qualsiasi ciclo di vita del software.

L'abuso dei comparatori logici e il cortocircuito

Un altro aspetto dove ho visto bruciare budget è l'uso errato degli operatori logici AND e OR. Javascript usa il "cortocircuito": se la prima parte di un OR è vera, la seconda non viene nemmeno guardata. Se la prima parte di un AND è falsa, il resto viene ignorato. Molti programmatori usano questa caratteristica per eseguire funzioni, tipo isValid && saveToDatabase().

Sebbene sembri intelligente, è una pratica che rende il debug un incubo. Se saveToDatabase non viene eseguita, è perché isValid era falso o perché c'è stato un errore interno? Non puoi saperlo facilmente con un debugger standard senza entrare nei dettagli della riga. Usa le strutture condizionali esplicite per le azioni che hanno effetti collaterali (come scrivere su un database o inviare un'email). Riserva il cortocircuito solo per l'assegnazione di valori di default, dove il rischio è minimo e l'intento è chiaro.

Un controllo della realtà per chi scrive codice

Smettila di cercare la "soluzione elegante" o il trucco sintattico dell'ultimo momento trovato su qualche blog di tendenza. Al tuo cliente o al tuo datore di lavoro non interessa se hai usato l'ultima feature di ES2024 per comprimere un controllo condizionale in tre caratteri. Gli interessa che il sistema non crashi alle tre del mattino di un venerdì.

La verità è che gestire bene la logica condizionale non riguarda la conoscenza della sintassi, ma la capacità di prevedere il fallimento. Il successo in questo ambito si misura in quante volte NON devi tornare su un pezzo di codice che hai scritto sei mesi fa. Se il tuo approccio ti costringe a rileggere l'intero file per aggiungere una condizione, hai fallito. Se ogni volta che tocchi un "if" senti il sudore freddo perché non sai cosa potrebbe rompersi altrove, la tua architettura è spazzatura.

Scrivere codice robusto significa essere onesti con se stessi: non sei abbastanza intelligente da gestire la complessità infinita nella tua testa. Nessuno lo è. L'unico modo per vincere è mantenere le cose così stupide e piatte che anche tra due anni, dopo una notte insonne e tre caffè, sarai in grado di capire esattamente perché quel ramo viene eseguito e come modificarlo senza distruggere l'intera azienda. Se non accetti questa umiltà tecnica, continuerai a produrre software costoso, fragile e destinato al cestino.

VM

Valentina Moretti

Tra analisi e reportage, Valentina Moretti racconta i fatti con precisione, contesto e un linguaggio vicino alle persone.