Voici mon problème. Je suis un très grand fan de Design by Contract, j'utilise ce concept surtout lors du développement de bibliothèques utilisables par d'autres développeurs. Je viens de découvrir une nouvelle façon de faire qui est: Contract.Requires
Au lieu de Exception
: Donc au lieu d'avoir:
public void SomeMethod(string name){
if(name==null) throw new NullArgumentException("Null values not supported");
}
J'ai maintenant:
public void SomeMethod(string name){
Contract.Requires(name != null);
}
[~ # ~] modifier [~ # ~] : Je travaille sous VS2010 en mode débogage.
Problème: Contract.Requires
Ne fait rien, même lorsque name
est null
!
La documentation MSDN indique:
Spécifie un contrat de condition préalable pour la méthode ou la propriété englobante.
Mais rien n'est précisé au cas où la condition ne serait pas remplie!
J'ai également remarqué qu'il y a autreContract.Requires
Surcharges qui lèvent une exception, affichent un message ... mais à quoi sert Contract.Requires(Boolean)
?
[~ # ~] edit [~ # ~] La réponse ci-dessous a souligné qu'un plug-in doit être installé pour avoir la pleine puissance de Contract
API mais qu'en est-il des utilisateurs Mono qui souhaitent que leur code se comporte de la même manière sur différentes plates-formes?
Vous devez procéder comme suit:
Contract.Requires
avec Contract.Requires<SomeException>
(le premier jette System.Diagnostics.ContractException
tandis que le second lève l'exception que vous avez spécifiée, ce qui est important pour les méthodes publiques)C'est la configuration de base. Pour une configuration plus précise, reportez-vous au manuel
Si vous utilisez Mono, la classe Contract est probablement vide. Je ne l'ai pas fait, mais le chapitre sept du manuel des contrats semble expliquer comment fournir votre propre implémentation.
De la Documents de classe de contrat :
Important
Vous devez installer un complément Visual Studio pour appliquer les contrats. Le complément Code Contracts Premium Edition vous permet de spécifier la vérification statique et à l'exécution des contrats de code sur la page Propriétés du projet. Si vous n'activez pas la vérification au moment de l'exécution, les contrats tels que la méthode Contract.Ensures ne lèveront pas d'exceptions pendant l'exécution si un contrat est violé. Le complément Visual Studio n'est pas fourni avec Visual Studio 2010 ou le SDK Windows.
Avec un message comme celui-ci, il est généralement utile de spécifier exactement ce que vous avez fait.
Par exemple, vous ne mentionnez pas dans le message d'origine si vous avez installé le module complémentaire VS, ni que vous l'avez activé sous les propriétés de votre projet, ou que vous exécutez réellement en mode debug vs release, etc.
Re Contract.Requires
contre Contract.Requires<Exception>
Contract.Requires
est recommandé. Selon le manuel
Si votre code doit lever une exception particulière en cas d'échec d'une condition préalable particulière, vous pouvez utiliser le formulaire générique surchargé ci-dessous. (Veuillez lire la section 5.1 avant de vous engager dans ce formulaire dans votre code. Vous ne pouvez pas utiliser
Requires < Exn <Exn>>
sans exécuter les outils de contrat sur toutes les versions. Si vous le faites, vous obtiendrez un échec d'exécution à chaque fois.)