Ich bin ein großer Fan von Zusicherungen, Verträgen oder anderen Arten von Schecks, die in der von mir verwendeten Sprache verfügbar sind. Eine Sache, die mich ein bisschen stört, ist, dass ich nicht sicher bin, wie es üblich ist, mit doppelten Prüfungen umzugehen.
Beispielsituation: Ich schreibe zuerst die folgende Funktion
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
dann schreibe ich ein paar Stunden später eine andere Funktion, die die erste aufruft. Da alles noch frisch im Speicher ist, entscheide ich mich, den Vertrag nicht zu duplizieren, da ich weiß, dass DoSomething
bereits nach einem Nullobjekt gesucht wird:
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
Das offensichtliche Problem: DoSomethingElse
hängt jetzt davon ab DoSomething
, ob obj nicht null ist. DoSomething
Sollte sich also jemals entscheiden, nicht mehr zu prüfen, oder wenn ich mich entscheide, eine andere Funktion zu verwenden, wird obj möglicherweise nicht mehr geprüft. Was mich schließlich dazu bringt, diese Implementierung zu schreiben:
void DoSomethingElse( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
DoSomething( obj );
//code using obj
}
Immer sicher, keine Sorge, außer dass, wenn die Situation wächst, dasselbe Objekt möglicherweise mehrmals überprüft wird und es sich um eine Form der Vervielfältigung handelt, und wir alle wissen, dass dies nicht so gut ist.
Was ist die gängigste Praxis für solche Situationen?
ArgumentBullException
? Das ist neu :)