Je suis un grand fan de rédiger des assertions, des contrats ou tout autre type de chèques disponibles dans la langue que j'utilise. Une chose qui me dérange un peu est que je ne sais pas quelle est la pratique courante pour traiter les chèques en double.
Exemple de situation: j'écris d'abord la fonction suivante
void DoSomething( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
//code using obj
}
puis quelques heures plus tard j'écris une autre fonction qui appelle la première. Comme tout est encore frais en mémoire, je décide de ne pas dupliquer le contrat, car je sais que je DoSomething
vérifierai déjà un objet nul:
void DoSomethingElse( object obj )
{
//no Requires here: DoSomething will do that already
DoSomething( obj );
//code using obj
}
Le problème évident: DoSomethingElse
dépend maintenant DoSomething
de la vérification que obj n'est pas nul. Donc DoSomething
, je devrais jamais décider de ne plus vérifier, ou si je décide d'utiliser une autre fonction, obj pourrait ne plus être vérifié. Ce qui m'amène à écrire cette implémentation après tout:
void DoSomethingElse( object obj )
{
Contract.Requires<ArgumentNullException>( obj != null );
DoSomething( obj );
//code using obj
}
Toujours en sécurité, pas de soucis, sauf que si la situation se développe, le même objet peut être vérifié plusieurs fois et c'est une forme de duplication et nous savons tous que ce n'est pas si bon.
Quelle est la pratique la plus courante pour de telles situations?
ArgumentBullException
? C'est un nouveau :)