web-dev-qa-db-fra.com

Contrat: nécessite une utilisation

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?

43
GETah

Vous devez procéder comme suit:

  1. Installez le complément Code Contracts comme l'a noté nfechner
  2. Accédez aux propriétés du projet, dossier 'Contrats de code'
  3. Cochez "Effectuer la vérification du contrat d'exécution"
  4. Basculez le "Mode d'assemblage" sur "Contrat standard requis"
  5. Remplacez votre 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.

26
Pavel Gatilov

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.

11
nfechner

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.)

2
sgmoore