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

[TechDays 2014] Ask To Expert aux TechDays 2014 au Palais des Congrès de Paris

Je vous donne rendez-vous du 11 au 13 février 2014 au TechDays 2014 au Palais des Congrès de Paris où je serai ATE (Ask To Expert).

logo_mstechdays

Je me ferai un plaisir de répondre à vos questions concernant les technologies Microsoft durant les pauses. Pour me reconnaître, j’aurai un polos d’une couleur « flashy » où sera inscrit “Ask To Expert” (il est donc impossible de me rater !). Il y aura certains un stands dédiés aux communautés Microsoft que je viendrai squatter…

Depuis 2 ans, beaucoup de personnes viennent me contacter personnellement aux Tech Days ou MS Days afin de discuter sur ma technologie favorite : Code Contracts. Afin d’éviter de parler programmation « oralement », je vous invite à apporter votre ordinateur portable équipé d’un Visual Studio et de Code Contracts si vous souhaitez que je réponde plus précisément à vos questions sur vos projets !

Je vous invite à vous y rendre et à assister aux différentes sessions et en particulier celle dédiées aux dernières technologies Microsoft comme Visual Studio 2013 et Monaca, Windows Phone, Windows Azure et un paquet de session sur l’ALM…

Pour vous rendre aux TechDays 2014, il est nécessaire de s’inscrire sur le site de Microsoft à la rubrique dédié aux TechDays 2014.

[.NET] Les collections immuables sont maintenant disponibles en version finale !

Microsoft vient d’annoncer que les collections immuables (Immutable Collections) sont maintenant disponible en version finale via la galerie NuGet.

Pour rappel, les collections immuables permettent de créer des listes qui ne change jamais cela permet de :

  • Partager une collection en privé et publique en s’assurant qu’elle ne sera jamais modifié.
  • Permet de faire de la programmation fonctionnelle (c’est un univers où tout est immuable…)
  • Et cerise sur le gâteau, elles permettent d’être utilisées facilement dans les scénario multi-thread. Leur design fait qu’elles sont automatiquement thread-safe…

Au passage, cette bibliothèque n’est pas intégré dans le .NET Framework, afin que l’équipe de développement de Microsoft puisse nous produire des releases régulières… Et ainsi d’éviter de baver ou d’attendre comme un gamin à noël, les prochaines versions du .NET Framework.

Dans les semaines qui vont venir j’écrirai quelques articles consacrés à ces collections afin de vous expliquer leur utilité. En attendant, ne restez pas immuable, et téléchargez cette bibliothèque depuis la galerie NuGet.

[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] Comment réaliser des tests unitaires sur une couche d’accès aux données qui utilise une base de données ?

Lorsque l’on développe sa couche d’accès aux données (à la main, via Entity Framework ou tout autre ORM) il est nécessaire comme tout code de le tester ! Beaucoup de développeurs ne testent pas leur couche d’accès aux données car ils considèrent que « cela ne se fait pas ». Or, pour moi, tout code qui est pondu par un développeur doit être testé sans exception ! Un code non testé est un code dont le développeur ne peut garantir son fonctionnement…

Cet article a pour vocation de vous montrer différentes stratégies qui existent et qui sont utilisés (que j’ai déjà rencontré à travers différentes missions) avec leurs inconvénients. A la fin de cet article, j’expliquerai une stratégie simple que j’applique systématiquement depuis 8 ans pour tester les couches d’accès aux données via des tests unitaires.

Continuer la lecture

[.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 !

Continuer la lecture

[.NET] Le point sur les collections du .NET Framework 4.0 et 4.5

Après plusieurs interventions pour auditer la qualité du code chez différents clients, je me suis rendu compte (et vraiment surpris) que beaucoup de développeurs ne connaissaient pas toutes les collections disponibles du .NET Framework. Certains se limitent aux listes et aux tableaux, et d’autres ne savent réellement pas où et quand utiliser une Collection<T>, une List<T> ou un simple tableau…

Cet article à pour but de présenter très rapidement les différentes collections qui existent dans le .NET Framework et dans quelles cas les utiliser. Cet article explique aussi les nouvelles interfaces qui sont apparues dans le .NET Framework 4.5 afin de palier un problème de conception initial du .NET Framework. Cette article ne parlera pas des collections qui ne sont pas typées et que je considère moi-même obsolète dans le .NET Framework ainsi que les collections spécifiques à WPF/Silverlight.

Continuer la lecture

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