Dictionary invece di switch o if statements
Le condizioni sono un concetto base della programmazione ma le best practices suggeriscono di evitare un uso eccessivo degli if statements. Si dice che l’uso eccessivo di condizioni if renda le applicazioni più complesse e soggette a bug, perché molti if-else aumentano il numero di rami condizionali da gestire. Non possiamo rimuovere completamente gli if statements, ma possiamo ridurne l’uso.
Hai bisogno di mappare dati da A a B senza ulteriore logica? È una semplice mappatura chiave/valore? Configura una struttura dati dictionary invece di switch o if-else ladder.
Supponiamo di dover gestire l’enum dei tipi di Pokemon e mappare per qualche motivo ogni tipo a un valore base di punti vita. Scriviamolo usando switch, if-else e struttura dictionary, con alcune semplificazioni:
If statement
public int GetHitPoint(PokemonType value)
{
var point = 0;
if(value == PokemonType.NORMAL)
{
point = 1;
}
else if(value == PokemonType.GRASS)
{
point = 2;
}
else if(value == PokemonType.ELECTRIC)
{
point = 3;
}
else if(value == PokemonType.WATER)
{
point = 4;
}
else if(value == PokemonType.FIRE)
{
point = 5;
}
else if(value == PokemonType.BUG)
{
point = 6;
}
[...]
return point;
}
Switch statement
public int GetHitPoint(PokemonType value)
{
var point = 0;
switch(value)
{
case PokemonType.NORMAL:
point = 1;
break;
case PokemonType.GRASS:
point = 2;
break;
case PokemonType.ELECTRIC:
point = 3;
break;
case PokemonType.WATER:
point = 4;
break;
case PokemonType.FIRE:
point = 5;
break;
case PokemonType.BUG:
point = 6;
break;
[...]
}
return point;
}
Struttura Dictionary
public int GetHitPoint(PokemonType value)
{
var basePointMapping = new Dictionary<PokemonType, int>
{
{PokemonType.NORMAL, 1},
{PokemonType.GRASS, 2},
{PokemonType.ELECTRIC, 3},
{PokemonType.WATER, 4},
{PokemonType.FIRE, 5},
{PokemonType.BUG, 6}
[...]
};
return basePointMapping[value];
}
Conclusione
Come puoi vedere, senza alcun tipo di spiegazione, in termini di leggibilità e compattezza, i dictionary sono la prima scelta, ho scritto meno righe, il codice è pulito, facile da refactorizzare. Potrebbe essere la struttura dati da considerare in questi tipi di mappature semplici, ricorda il principio KISS, devi evitare un gran numero di casi negli switch/if statements perché sono meno manutenibili.
[EDIT] Ho creato un repository su questo argomento, Github repo: https://github.com/apulito/dictionary-instead-statements-v1
Spero che questo possa darti un po’ di ispirazione!
Ciao, Alberto
Related Posts

Exception Filters in .NET Framework: Addio all'inferno dei Try-Catch
Gestione delle eccezioni in .NET Framework 4.8 usando Exception Filters personalizzati

Utilizzare le Value Tuple
Tutti noi scriviamo metodi che restituiscono un valore, un metodo string restituisce una stringa, un metodo int restituisce un int, ma cosa fai quando hai bisogno di restituire più di un valore?

Dictionary invece di switch o if statements v2
Nell'articolo precedente ho parlato di come, a mio parere, sia possibile migliorare la qualità del codice memorizzando chiavi/valori in un dictionary invece di usare switch o istruzioni condizionali.