Je viens de commencer à parcourir 'Debugging MS .Net 2.0 Applications' de John Robbins, et j'ai été troublé par son évangélisation de Debug.Assert(...).
Il fait remarquer que les alertes bien implémentées stockent l'état, en quelque sorte, d'une condition d'erreur, par exemple :
Debug.Assert(i > 3, "i > 3", "This means I got a bad parameter");
Personnellement, je trouve fou qu'il aime tant répéter son test sans un commentaire de "logique commerciale" sensé, peut-être "i <= 3 ne doit jamais se produire à cause du processus de widgitification de flobittyjam".
Donc, je pense que je comprends les assertions comme une sorte de bas niveau "protégeons mes hypothèses"... en supposant que l'on pense que c'est un test que l'on doit seulement faire en débogage - c'est-à-dire que vous vous protégez contre vos collègues et futurs programmeurs, et que vous espérez qu'ils testent réellement les choses.
Mais ce que je ne comprends pas, c'est qu'il dit ensuite que vous devriez utiliser des assertions en plus de la gestion normale des erreurs ; ce que j'envisage, c'est quelque chose comme ceci :
Debug.Assert(i > 3, "i must be greater than 3 because of the flibbity widgit status");
if (i <= 3)
{
throw new ArgumentOutOfRangeException("i", "i must be > 3 because... i=" + i.ToString());
}
Qu'est-ce que j'ai gagné en faisant répéter par Debug.Assert le test de la condition d'erreur ? Je pense que je comprendrais si nous parlions de la double vérification en débogage seulement d'un calcul très important...
double interestAmount = loan.GetInterest();
Debug.Assert(debugInterestDoubleCheck(loan) == interestAmount, "Mismatch on interest calc");
...mais je ne l'obtiens pas pour les tests de paramètres qui valent sûrement la peine d'être vérifiés (dans les versions DEBUG et Release)... ou pas. Qu'est-ce qui me manque ?