Dictionary invece di switch o if statements

.NET C# dictionary

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