Enums,
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.