Eliminare gli if con i dictionary

Talvolta si trova questo codice usato (ad esempio) nei ValueConverter di WPF:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  MyEnum myValue = (MyEnum)value;
  String imageUri;
  switch(myValue)
  {
    case MyEnum.Value1: 
      imageUri = "...";
      break;
    case MyEnum.Value2: 
      imageUri = "...";
      break;
    case MyEnum.Value3: 
      imageUri = "...";
      break;
  }
  return new Uri(imageUri , UriKind.Relative);
}

La presenza di questo tipo di switch, sebbene non sia in parti core dell’applicazione (è un semplice converter) mi infastidisce sempre, sarà per quell’indice di complessità che cresce per ogni nuovo caso.

Spesso la rimozione degli if si risolve con l’uso del polimorfismo, ma in questo caso potrebbe essere più comodo utilizzare un dictionary per memorizzare le associazioni enumerator – immagine:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
  IDictionary<MyEnum, string> dictionary = new Dictionary<MyEnum, string>();
  dictionary.Add(MyEnum.Value1, "...");
  dictionary.Add(MyEnum.Value2, "...");
  dictionary.Add(MyEnum.Value3, "...");

  MyEnum myValue= (MyEnum) value;
  return new Uri(dictionary[myValue] , UriKind.Relative);
}

Come potete vedere (a parte alcuni dettagli implementativi che ho omesso) abbiamo rimosso completamente gli if riducendo notevolmente la complessità e aumentando la manutenibilità generale del metodo.

PS Con questa tecnica inoltre, il dictionary può essere caricato da una risorsa esterna con tutti i vantaggi che ne conseguono.

Print | posted on mercoledì 21 aprile 2010 21:25