Code Contract

De Banane Atomic
Aller à la navigationAller à la recherche

Généralités

Code Contract donne une alternative plus lisible et performante aux tests If-Then-Throw.
Disponible à partir du Framework 4.0, et donc sur VS 2010. Manuel de Microsoft.

Pré-conditions (Requires)

Permet de tester les arguments passé à la méthode.
Les tests Requires doivent impérativement se trouver au début de la méthode avant tout autre code.

40px
void Methode(string argument, List<string> arguments)
{
    // si le test n'est pas validé, l'exception ArgumentNullException est lancée 
    // avec le message "Échec de la condition préalable : argument != null"
    Contract.Requires<ArgumentNullException>(argument != null);

    // test si les éléments de la liste ne sont pas null
    Contract.Requires<ArgumentNullException>(Contract.ForAll(arguments, a => a != null));

Post-condition (Ensures)

Permet de tester la valeur retournée par la méthode.
Les tests Ensures doivent impérativement se trouver au début de la méthode avant tout autre code.

40px
int Methode()
{
    // si le test n'est pas validé, une exception ContractException est lancée
    // avec le message Échec de la post-condition : Contract.Result<int>() > 0
    Contract.Ensures(Contract.Result<int>() > 0);

Assert

40px
// permet de réaliser un test
// si le test n'est pas validé et que l'Assembly Mode est à Full 
// lance une exception du type ContractException avec le message "Échec d'assertion : objet != null"
Contract.Assert(objet != null);

Scénarios d'utilisation

Cas 1

Vous souhaitez effectuer une validation en Debug mais pas en Release.

  • Utilisez Contract.Require(...)
  • Activez « Runtime Checking » en Debug et désactivez-le en Release

Cas 2

Vous souhaitez effectuer une validation en Debug et en Release.
Et vous souhaitez utiliser CCrewriter en Release.

  • Utilisez Contract.Require<Exception>(...) sur les méthodes accessibles en dehors de l'assemblage
  • Utilisez Contract.Require(...) pour les autres méthodes
  • Activez « Runtime Checking » en Debug et Release
  • Choisir l'option pour ne vérifier que les « Preconditions »
  • Choisir l'option « Only Public Surface Contracts »

Cas 3

Vous souhaitez effectuer une validation en Debug et en Release.
Mais vous ne souhaitez pas utiliser CCrewriter en Release (personnalisation de l'exception).

  • Utilisez if(...) throw Exception(); Contract.EndContractBlock(); sur les méthodes accessibles en dehors de l'assemblage
  • Utilisez Contract.Require(...) sur les autres méthodes
  • Activez « Runtime Checking » en Debug et désactivez-le en Release

Visual Studio

Assembly Mode

Standard Contract Requires

Cas 1 ou Cas 2
Utilisation de if(...) throw Exception(); Contract.EndContractBlock(); n'est pas autorisée.

Custom Parameter Validation

Cas 3
Utilisation de Contract.Require<Exception>(...) n'est pas autorisée.

Runtime Checking

Runtime Checking Level

Checking Level Legacy Require<Exception> Require Ensures Invariants Asserts Assumes
Full X X X X X X X
Pre and Post X X X X
Preconditions X X X
ReleaseRequires X X
None

Public Surface Contract Checks

Supprime tous les contrats des méthodes qui ne sont pas accessibles depuis l'extérieur de l'assemblage.

Assert on Contract Failure

Affiche ou non la fenêtre « Assert Failure : Abandonner, Recommencer, Ignorer ».

Contract Reference Assembly

Permet de générer un assemblage « MonProjet.Contracts.dll » et le XML de documentation associé.
Il sera utilisé par les projets référençant cette assemblage et voulant savoir s'il contient des contrats, ou si vous voulez inclure les contrats dans la documentation.