Quando la logica condizionale silenzia i segnali critici
TL;DR: saltare i rapporti di stato nei rami condizionati provoca ritardi silenziosi e condizioni di gara.
TL;DR: saltare i rapporti di stato nei rami condizionati provoca ritardi silenziosi e condizioni di gara.
Problemi
- Utente in ritardo
- Poca esperienza
- Tempi imprevedibili
- Inizializzazione incompleta
- Dipendenze nascoste
- La cattiva gestione della politica
- fallimenti silenziosi
- Compatibilità retroattiva
Soluzioni
- Validare tutti i percorsi di codice
- Utilizzare i meccanismi di segnalazione predefiniti
- Test edge casi rigorosamente
- La politica dei rifactori controlla presto
- Fare test di prestazioni
- Spostare i rapporti al di fuori dei condizionali
Il contesto
Quando si aggiunge la logica condizionale (ad esempio, le politiche di gruppo) al codice di inizializzazione, saltare i passaggi critici come i rapporti di disponibilità provoca ritardi in tutto il sistema.
I casi di margine sono condizioni eccezionali che si verificano al di fuori dei normali parametri operativi.
Quando non si gestiscono correttamente questi casi di margine, il codice può comportarsi in modo imprevedibile.
QuestoIl blog di Microsoftevidenzia un esempio classico in cui manca la gestione del caso di margineWindows 7 ha causato tempi di accesso più lenti quando gli utenti hanno scelto uno sfondo a colori solidi invece di un'immagine di sfondo.
Il codice responsabile del caricamento di carta da parati desktop è quasi "pronto" solo quando ha caricato con successo un'immagine di carta da parati.
Ma quando gli utenti hanno selezionato uno sfondo a colori solidi (un caso di bordo), questo percorso di codice non ha mai attivato la notifica "pronta".
Di conseguenza, il sistema ha aspettato il tempo pieno di 30 secondi prima di procedere con la sequenza di accesso.
Questo problema mostra come la mancanza di un caso di margine apparentemente piccolo può avere un impatto significativo sull'esperienza utente.
Ciò che avrebbe dovuto essere un processo di accesso di 5 secondi è diventato un ritardo frustrante di 30 secondi per gli utenti che hanno scelto un'opzione di configurazione semplice.
Moltiplicate questo innocente ritardo di 30 secondi per ogni utente che aveva la versione.
Un buon design del software richiede di considerare tutti i possibili percorsi attraverso il codice, non solo quelli comuni.
Quando si salta la gestione dei casi di margine, si crea un debito tecnico che si manifesta come misteriosi problemi di prestazioni, tempi e esperienze utente scadenti.
Modulo di codice
sbagliato 🙂
public static class WallpaperInitializer
{
private static bool wallpaperWasDefined = false;
public static void InitializeWallpaper()
{
if (wallpaperWasDefined)
// Assume this was defined previously
// and PLEASE DON'T use NULLs in case you hadn't
{
LoadWallpaperBitmap();
Report(WallpaperReady); // Missed if wallpaper is undefined
}
// No default report, causing delays
}
private static void LoadWallpaperBitmap()
{
}
private static void Report(string status)
{
// The Asynchronous loading keeps on
}
}
giusta 🙂
public static class WallpaperInitializer
{
private static bool wallpaperWasDefined = false;
public static void InitializeWallpaper()
{
if (wallpaperWasDefined)
{
LoadWallpaperBitmap();
}
Report(WallpaperReady);
// Always report, regardless of condition
}
private static void LoadWallpaperBitmap()
{
}
}
Riconoscimento
- [x] Semiautomatico
Utilizzare strumenti di analisi statica per segnalare i condizionali che salvaguardano le chiamate critiche di segnalazione.
Le revisioni del codice dovrebbero verificare che tutti i percorsi di inizializzazione segnalino il completamento.
Giorno ️
- prestazioni
Livello
- [x] Intermediario
Perché la bijection è importante ️
Il comportamento del sistema nel mondo reale (ad esempio, velocità di accesso) dipende dalla modellazione accurata degli stati di prontezza.
Il software dovrebbe mantenere una corrispondenza uno-a-uno tra gli stati del mondo reale e gli stati del programma.
Quando gli utenti selezionano uno sfondo a colori solidi in Windows, questa scelta rappresenta uno stato reale valido.
(La mia scelta personale anche allora)
Il programma deve modellare correttamente questa scelta con uno stato del programma corrispondente che si comporta correttamente.
Quando si rompe questa bijection per non gestire i casi di margine, si introducono disconnessioni tra le aspettative degli utenti e il comportamento del sistema. In questo esempio, gli utenti si aspettavano che la loro scelta di uno sfondo a colori solidi funzionasse normalmente, ma invece hanno sperimentato ritardi misteriosi.
La bijection mancante crea dissonanza cognitiva: "Ho fatto una scelta semplice, perché il mio computer si comporta stranamente?" Questa disconnessione danneggia la fiducia e la soddisfazione degli utenti.
Ogni bijection rotto introduce una crepa nel modello di affidabilità del sistema, rendendolo sempre più imprevedibile nel tempo.
La rottura di questo collegamento provoca discrepanze tra le aspettative dell'utente e l'esecuzione del software, portando a ritardi imprevedibili eMappaviolazioni del mondo reale.
La generazione
I generatori AI possono creare questo odore avvolgendo ingenuamente il codice legato in condizionali senza convalidare tutti i percorsi.
La rilevazione
Chiedi all'IA di "assicurare che i rapporti di stato siano eseguiti in tutti i rami", e segnerà o risolverà questo odore spostando Report() al di fuori dei condizionali.
Prova a farlo!
Ricordate: gli assistenti AI commettono molti errori
Prompt suggerito: trovare altre segnalazioni mancanti
Prompt suggerito: trovare altre segnalazioni mancanti
Without Proper Instructions |
With Specific Instructions |
---|---|
Conclusione
Segnala sempre il completamento incondizionato nel codice di inizializzazione.
La logica condizionale dovrebbe modificare il comportamento, non tacere i passaggi critici di segnalazione.
Relazioni
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxx
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xviii
Maggiori informazioni
Disclaimer
L’odore è mioopinione.
La sperimentazione porta al fallimento e il fallimento porta alla comprensione.
La sperimentazione porta al fallimento e il fallimento porta alla comprensione.
di Burt Rutan
Questo articolo fa parte della serie CodeSmell.