Waarom ik haast geen enums meer gebruik

imageEnums, kleine lijstjes met waarden die helpen bij het Type-safe en leesbaar houden van je code in de gevallen dat je een keuze wilt afdwingen of controleren. Maar je kan er zo bar weinig mee. De methode waar ik de voorkeur aan geef? Het Descriptor Pattern.

We gebruiken ze allemaal, de enums. Een lijst met hard gecodeerde waarden. Maar buiten de Type-safety en het eventueel 'flaggable' maken (meerdere keuzes tegelijkertijd) is er niet bij. Zo niet bij het Descriptor Pattern. Sander Hoogendoorn heeft in juni 2005 een mooi artikel gepubliceerd in het .Net magazine waarin hij  vijf verschillende wijzen beschrijft hoe met een lijst met waarden om te gaan. Sanders artikel is een echte aanrader.

Het Descriptor Pattern passen wij in het Venum project veel toe. Zeker omdat de lijsten die we gebruiken vaak net wat meer informatie weer moeten geven. Om hier gestructureerd mee om te gaan hebben we een DescriptorBase class gedefinieerd. Die het lastige werk van het creëren van List<T>, ToString()  en instantiëren voor zijn rekening neemt.

Nu eerst een stuk basis. Een eenvoudige Descriptor is als volgt:

public class SampleDescriptor
{
  public static SampleDescriptor None = new SampleDescriptor("None");
  public static SampleDescriptor Yes  = new SampleDescriptor("Yes");
  public static SampleDescriptor No   = new SampleDescriptor("No");

  private string _value;

  private SampleDescriptor(string value){
    _value = value;
  }

  public override string ToString() {
    return _value;
  }
}

De static fields kunnen we direct gebruiken als waarden in onze IDE. De Type-safety is gegarandeerd. De descriptor heeft een private constructor, een andere instantie maken is dus niet mogelijk. De aanroep van deze lijst is eenvoudig, bijvoorbeeld:

var x = SampleDescriptor.None;
if (x == SampleDescriptor.Yes)
  Console.WriteLine("Yes, it is.");;
Console.WriteLine(x);

Om deze lijst bijvoorbeeld weer te geven in een DropDownBox, kunnen we de datasource gewoon richten op de Descriptor, maar we moeten dan wel een method hebben die de Descriptor omzet naar een lijst.

public List<SampleDescriptor> GetList()
{
  var result = new List<SampleDescriptor>();
  foreach (var e in this.GetType().GetFields())
    if (e.FieldType == this.GetType())
      result.Add((SampleDescriptor)e.GetValue(null))
  return result;
}

Een uitgewerkt voorbeeld en een bruikbare DescriptorBase class heb ik in deze zip geplaatst : DescriptorSample.zip . Bekijk deze en maak er gebruik van, je zal zien dat dit een werkelijk geweldige manier is om met lijsten te werken. In het voorbeeld maak  ik ook gebruik van een resource file voor de beschrijvingen, op deze manier is nu eenvoudig mogelijk om de lijst te gebruiken in een meertalige User Interface.

1 comment voor “Waarom ik haast geen enums meer gebruik”

  1. Posted vrijdag 21 januari 2011 at 10:31:36

    Goed idee!

Laat een opmerking achter