« Code Contract » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
 
Ligne 3 : Ligne 3 :
Disponible à partir du Framework 4.0, et donc sur VS 2010. [http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf Manuel de Microsoft].
Disponible à partir du Framework 4.0, et donc sur VS 2010. [http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf Manuel de Microsoft].


=Pré-conditions (Requires)=
= Pré-conditions (Requires) =
Permet de tester les arguments passé à la méthode.<br/>
Permet de tester les arguments passé à la méthode.<br/>
Les tests Requires doivent impérativement se trouver au début de la méthode avant tout autre code.
Les tests Requires doivent impérativement se trouver au début de la méthode avant tout autre code.
{|
<kode lang="csharp">
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
|
<syntaxhighlight lang="csharp">
void Methode(string argument, List<string> arguments)
void Methode(string argument, List<string> arguments)
{
{
Ligne 18 : Ligne 15 :
     // test si les éléments de la liste ne sont pas null
     // test si les éléments de la liste ne sont pas null
     Contract.Requires<ArgumentNullException>(Contract.ForAll(arguments, a => a != null));
     Contract.Requires<ArgumentNullException>(Contract.ForAll(arguments, a => a != null));
</syntaxhighlight>
</kode>
|}


=Post-condition (Ensures)=
=Post-condition (Ensures)=

Version du 12 avril 2020 à 12:43

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.

Csharp.svg
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.

Fichier:Csharp.png
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

Fichier:Csharp.png
// 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.