Validierung von Objekten mittels Lambdaausdrücken

In jeder Anwendung wird man früher oder später mit Geschäftsobjekten arbeiten und diese eventuell auch persistieren. Nun gibt es ja das schöne Sprichwort „All input is evil“. Man sollte also nicht alles so speichern, wie es angeleifert wird. Es gibt ja immer mehrere Wege, die Daten zu manipulieren. Um einen Weg davon abzusichern, validiert man die Benutzereingaben vor der Weiterverarbeitung. Diese Validierung kann sehr einfach gestrickt sein, wie z.B. Text vorhanden, oder Zahl kleiner ein festgesetzter Wert. Aber es kann auch sein, dass die Validierung komplexer werden.
Hier möchte ich eine Möglichkeit aufzeigen, wie man diese Validierungen mittels Lambdaausdrücken (in C#) in ein Regelset zu packen und diese Regeln auszuwerten. Dazu muss man mit den Lambdaausdrücken in C# und den Klassen wie Func oder Predicate etwas vertraut sein.
Um ein solches Regelset aufzustellen, muss man ein Array von Predicate– oder Func-Objekten erzeugen, und mit den gewünschten Validierungsregeln initialisieren. Das sieht in einem einfachen Fall so aus.
[csharp]
public bool IsValid(Film film)
{
Predicate[] rules =
{
mov => !string.IsNullOrWhiteSpace(mov.Titel),
mov => mov.ASIN.Length == 10,
mov => mov.Bewertung > 0 && mov.Bewertung mov.Genres.Count > 0
};

return rules.All( rule => rule(film) == true );
}
[/csharp]

Nun kann man mittels LINQ (to Objects) die Regels auswerten lassen. In Falle des oben gezeigten Beispiels müssen alle Validierungsregeln TRUE zurückgeben, um ein Objekt als valide zu erkennen. Dies kann man mit der Extensionmethode All realisieren, die einen Ausdruck für alle Elemente eine Collection, hier das Regelset, auswertet. Nur wenn alle Ausdrücke TRUE liefern, wird die Funktion All auch TRUE zurückgeben. Somit lassen sich alle Regeln schnell und einfach aufrufen und ausführen.

Hier noch ein Hinweis zu den Validierungsregeln.
Sollte es notwendig sein, komplexere Regeln als die oben gezeigten zu programmieren, kann man mit den Lambdaausdrücken auch ganze Funktionsblöcke erstellen. Diese Ausdrücke sind ja nichts anderes als Delegates zu Methoden. Dazu habe ich hier noch ein Beispiel.
[csharp]
public bool IsValid(Leihe value)
{
Predicate[] rules =
{
lend => !lend.Bis.HasValue || lend.Von
{
if (lend.WurdeGemahnt.HasValue && lend.WurdeGemahnt.Value)
{
return lend.WurdeGemahnt.Value && lend.AnzahlMahnungen > 0 && lend.GemahntAm.HasValue;
}
else
return true;
},
lend => !lend.Aktiv || (!lend.Bis.HasValue || lend.Bis >= DateTime.Now),
lend => lend.Bis >= DateTime.Now ? lend.Merken && !lend.Aktiv : true
};

return rules.All(rule => rule(value) == true);
}
[/csharp]

Ein Gedanke zu “Validierung von Objekten mittels Lambdaausdrücken

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s