[Code Contracts] Nouvelle release 1.6.60505.10 (21 Mai 2014)

Cela fait longtemps que l’équipe Code Contracts n’a pas publié de nouvelle Release (je pense que la cause principal est le fait que l’équipe doit synchroniser leurs développements avec l’équipe qui développe actuellement le nouveau compilateur Roslyn).

L’équipe de Code Contracts vient donc de publier une nouvelle Release de Code Contracts version 1.6.60505.10.

Cette Release apporte les améliorations suivantes :

  • Le support de Visual Studio 2013
  • Corrige bien évidemment des bugs au niveau de l’outil de ré-écriture et d’analyse statique du code.
  • De nouveaux contrats ont été ajoutés dans les bibliothèques du .NET Framework.
  • Et des améliorations au niveau de la performance de l’exécution de l’outil de vérification statique du code.

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[Code Contracts] Nouvelle release 1.5.60911.10 (11 Septembre 2013)

L’équipe de Code Contracts vient de publier une nouvelle Release de Code Contracts version 1.5.60911.10.

Cette release corrige énormément de bugs concernant l’outil de vérification statique du code (cccheck.exe).

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[Code Contracts] Nouvelle release 1.5.60813.10 (13 Août 2013)

L’équipe de Code Contracts vient de publier une nouvelle release de Code Contracts version 1.5.60813.10.

Cela fait depuis longtemps (plus de 3 mois) que l’équipe n’avais sortie une nouvelle release… Dans cette release 2 améliorations majeures :

  • La prise en charge de la Preview de Visual Studio 2013
  • La possibilité d’utiliser les post-conditions sur des méthodes async en utilisant « Contract.Result<T>() » et non « Contract.Result<Task<T>>().Result ».

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[Code Contracts] Les post-conditions : ce n’est pas uniquement pour contrôler la valeur de retour d’une méthode !

Aujourd’hui j’ai été en mission chez un client qui à mis en place Code Contracts et son outil de vérification statique du code. Lorsque j’ai relus une partie de son code, je me suis aperçu que certains développeurs posait des Contract.Assume() afin d’obliger l’outil de vérification statique à considérer la condition spécifiée en paramètre comme vraie. Voici le code en question (bien évidemment j’ai très simplifié le code…) :

public static class Programme
{
    public static void Main(string[] args)
    {
        Personne personne;
        personne = new Personne();

        InsérerPersonne(personne);

        Contract.Assume(personne.Id != 0, "Le ID ne la personne n'a pas été récupéré depuis la base de données");

        Afficher(personne);
    }

    public static void Afficher(Personne personne)
    {
        Contract.Requires<ArgumentNullException>(personne != null);
        Contract.Requires<ArgumentException>(personne.Id != 0);

        Console.WriteLine(personne.Id);
    }

    public static void InsérerPersonne(Personne personne)
    {
        Contract.Requires<ArgumentNullException>(personne != null);

        personne.Id = 1664;   // On suppose que l'ID provient d'un INSERT sur une base SQL.
    }
}

public class Personne
{
    public int Id
    {
        get;
        set;
    }
}

Bien évidemment je suis aller voir le développeur qui a écrit ce Contract.Assume() et lui ai demandé pourquoi il en avait besoin. Il m’a répondu que c’est l’outil de vérification statique qui lui a indiqué que la pré-condition « personne.Id != 0 » dans la méthode Afficher() ne peut être prouvée…

Contrat non prouvé

Bien évidemment, même si on a affecté le « Id » de la personne (en provenance d’une base de données) dans la méthode InsérerPersonne() il n’y a rien qui nous prouve que l’identifiant est supérieur à 0. J’ai donc poser la question suivante au développeur : « Pourquoi vous ne spécifiez pas une post-conditions qui indique que l’Id de personne est supérieur à 0 ». J’ai été surpris aussitôt surpris par sa réponse : « Les post-conditions, ce n’est pas pour contrôler le retour des méthodes ? ». Et bien non ! Les post-conditions, ce sont des conditions qui doivent être vérifiées à la fin de la méthode. Ces conditions peuvent vérifier le retour de la méthode, mais aussi si une exception est déclenchée, si un paramètre est correcte, si l’âge du capitaine n’a pas changé….

Bref, toute condition qui doit être vérifié à la fin de la méthode, peut-être marquée à l’aide des post-conditions. Rappelez-vous aussi que les post-conditions sont des bons indicateurs aux intégrateurs de votre méthode (ceux qui vont utilisés votre méthode) afin de leur indiquer le nouvel état des objets qui sont modifiés par la méthode (paramètres, propriétés d’une classe, retour de la méthode,…).

Si on reprend l’exemple précédent voici le code qui faudrait mettre dans la méthode InsérerPersonne() :

public static void InsérerPersonne(Personne personne)
{
Contract.Requires<ArgumentNullException>(personne != null);
Contract.Ensures(personne.Id != 0);

personne.Id = 1664;   // On suppose que l'ID provient d'un INSERT sur une base SQL.
}

au niveau du Main() bien évidemment on supprimera le Contract.Assume() :

public static void Main(string[] args)
{
    Personne personne;
    personne = new Personne();

    InsérerPersonne(personne);

    Afficher(personne);
}

Et voilà le résultat au niveau de l’outil de vérification statique du code de Code Contracts :

Contrats vérifiés

[.NET] Attention à la redéfinition de la méthode GetHashCode()

Aujourd’hui, un développeur d’un client m’a signaler un « bug » dans la classe Dictionary<TKey, TValue> du .NET Framework. Après avoir étudié son problème pendant plus de 2 heures, (et je ne vous parle pas de mes cheveux !), le bug du Dictionary<TKey, TValue> venait du fait qu’il avait redéfini la méthode GetHashCode() sur un objet qui se basait sur des champs non-immuables !

(suite…)

[Code Contracts] Nouvelle release 1.5.60502.11 (02 Mai 2013)

L’équipe de Code Contracts vient de publier une nouvelle Release de Code Contracts version 1.5.60502.11.

Cette release optimise le démarrage et la consommation mémoire utilisé par l’outil de réécriture (ccrewriter).

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[Code Contracts] Nouvelle release 1.5.60409.11 (9 Avril 2013)

L’équipe de Code Contracts vient de publier une nouvelle Release de Code Contracts version 1.5.60409.11.

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[.NET] Code Contracts – Partie 6 – Les contract abbreviators

Dans les posts précédents nous avons vus comment créer différents types de contrats. Maintenant nous allons voir une petite fonctionnalité très pratique de Code Contracts : Les Contract Abbreviators.
(suite…)

[Code Contracts] Nouvelle release 1.4.60317.12 (15 Mars 2013)

L’équipe de Code Contracts vient de publier une nouvelle Release de Code Contracts version 1.4.60317.12.

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[.NET] Code Contracts – Partie 5 – Les contrats sur les interfaces

Dans les 3 derniers posts, nous avons vu comment définir les 3 types de contrats qui sont les pré-conditions, post-conditions et invariants. Nous allons voir maintenant une des grandes fonctionnalités de Code Contracts qui est la possibilité de définir ces contrats dans des interfaces (et les classes abstraites).

(suite…)