Sprache: C#
Um den Code übersichtlicher zu gestallten und kompakter zu gestallten empfiehlt sich eine wiederverwertbare Klasse. In diesem Fall eine Statische Klasse.
Eine einfache Klasse auf dessen Basis die Funktionen von dem .NET 4.0 Feature Contract in ähnlicher Weise nachgebaut werden kann.
// Implementierung
///<example>
///Contract.Ensure ( () => !string.IsNullOrEmpty ( filename ), "Filename is not allowed to be null or Empty"
);
///</example>
public class Contract
{
public static void Ensure ( Func<bool> predicate, string message )
{
if ( predicate () )
{
throw new ArgumentException ( message );
}
}
}
// Implementierung
///<example>
///Contract.Ensure ( () => !string.IsNullOrEmpty ( filename ), "Filename is not allowed to be null or Empty"
);
///</example>
public class Contract
{
public static void Ensure ( Func<bool> predicate, string message )
{
if ( predicate () )
{
throw new ArgumentException ( message );
}
}
}
Alte URL:
/snippet/ueberpruefung-von-uebergabeparameter-deklarativ/1020
ich verstehe nicht wieso das besser ist als
[code]string filename = „“;
if (filename.Equals(null) || filename.Equals(string.Empty))
throw new ArgumentException(„Filename is not allowed to be null or Empty“);
[/code]
Ausserdem macht dein Snippet genau das Gegenteil von dem was es soll. Mit
[code]if(predicate())
…[/code]
funktioniert es. Ich hab’s gerade getestet.
Sorry, ich meinte
[code]if(string.IsNullOrEmpty(test))
throw new ArgumentException(„Filename is not allowed to be null or Empty“);[/code]
Schon behoben. Das war mir gestern beim Testen schon passiert. Hab den falschen Ausdruck in der Lambda expression gehabt.
Warum es besser ist? Es ist wiederverwehrtbar und es kann später durch Contracts aus dem .NET 4.0 Framework ausgetauscht werden.
Deklarative Programmierung! Sag der Funktion was du reinstecken kannst, und was herauskommt und sie wird sicherer.