Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Fathi Bellahcene

.Net m'a tuer!

Code Contracts …. ca déchire!

 

ca y est! j’ai un peu de temps de “libre” a moi Sourire

Je vais donc pouvoir consacrer un peu de temps à mon blog et vous parler de CodeContract. Pourquoi? bah parce que comme le dit le titre : ca déchire!

Le but n’est pas de vous bassiner avec les différents types de contrats possible et comment les utiliser mais de vous montrer  (enfin tenter de montrer) que cela a un sens et une utilité non négligeable d’utiliser des CodeContracts dans vos applications.

Plus sérieusement, lors de mon dernier post, j’ai parlé de mon article au sujet des principes SOLID, parmis ces principes il y en a un en particulier que j’aimerai un peu aprofondir ici: le ” Liskov Segregation Principle”

qui dit en gros que lorsqu’une classe B dérive une classe A, on doit pouvoir remplacer B par A…ainsi on diminue le couplage entre B et A.

Sauf qu’en pratique, on a souvent besoin de modifier la classe parente et en particulier les méthodes…du coup on viole “parfois” ce principe:

 public class Operation
    {


       
public virtual int Operation(int a, int b)
        {
           
return a + b;
        }
    }


   
public class SuperOperation : Operation
    {
       
public override int Operation(int a, int b)
        {
           
return a/b;
        }
    }

dans le code ci-dessus par exemple; on viole le principe LSP (si je passe b=0 on aura des comportements différents)

mais si je remplace “a+b” par “a+b+1” la je suis ok.

Pour moi, LSP est un contrôle fonctionnel de l’héritage: lorsque j’écris une classe ouverte à l’héritage, je souhaite que tout ce qui en dérive respecte un certain cadre fonctionnel. Dans le cas ou je souhaite avoir une classe fille qui modifie radicalement mon comportement…et bien j’écris une autre classe.

Vous me direz: “et Code Contracts dans tout ca?”

Une solution pour respecter LSP est l’utilisation de la programmation par contrat (“Design By Contract” ) qui permet de coder un certain nombre de condition pour pouvoir exécuter correctement une méthode par exemples.

Il éxiste trois types de “contrat” :

  1. les pré-conditions : on vérifies que les paramètres ont des valeurs admissibles.
  2. les post-conditions: on vérifies que le résultat est correct.
  3. les invariants: on vérifies que certaines valeurs n’ont pas changé.

Dans notre cas, on pourrais avoir quelque chose comme ca:

 

 public virtual int Augmentation(int a, int b)
        {
           
//précondition:
           
Contract.Requires(b > 0, "Mon augmentation ne peut pas etre null!!");
           
//Post condition:
           
Contract.Ensures(Contract.Result<int>()>a);

           
return a + b;
        }

je dit donc:

En pré-condition: je dois être augmenté d’un montant non null (ie 0) sinon ca sert a rien de calculer mon nouveau salaire…

En post-Condition: quelque soit ton algo, je dois avoir plus d’argent qu’a avant!

Si j’exécute ma méthode comme ca:

 static void Main(string[] args)
        {
           
Operation o = new Operation();
           
int nouveauSalaire =o.Augmentation(50, -1);
           
Console.WriteLine(nouveauSalaire.ToString());
           
Console.ReadKey();
        }

j’obtient l’exception suivante:

 

image


La j’en vois plein qui se disent:”bof, pas terrible ton truc; une méthode static à la con avec un if 
et qui balance une exception…elle est merveilleuse ta découverte! si c’est pour ce genre d’ânerie
 que tu post, retourne changer les couches de junior…En plus tu nous bassines avec ton LSP 
mais je vois rien qui m’empêche décrire des onneries en overridant ta classe.”.

Et c’est la que CodeContract ca déchire; je vous laisse admirer la chose, je change mon code pour exécuter ma classe fille :

 static void Main(string[] args)
        {
           
SuperOperation o = new SuperOperation();
           
int nouveauSalaire =o.Augmentation(50, 2);
           
Console.WriteLine(nouveauSalaire.ToString());
           
Console.ReadKey();
        }

et j’obtient à l’exécution:

image

 

Mortel nan?! lorsque l’on hérite d’une classe qui possède des contrats, toutes les classes filles en héritent AUTOMATIQUEMENT!

Du coup, pour en revenir à LSP: on va définir les conditions fonctionnelles d’un composant (en particulier tout ce qui est ouvert à l’héritage) afin de s’assurer que toutes les surcharges ne vont pas “fondamentalement” modifier la classe.

Dans quel cas le DBC est fortement recommandé? Perso, j’ai travailler sur un projet de composant transverse et notre principale source d’érreur était dû à une mauvaise utilisation de notre framework. Après l’application de DBC, certes ca en a em…dé plusieurs mais au moins lorsque ca compilais ca marchais bien Sourire et quand ca plantais, ils avaient un message d’erreur clair leur permettant d’ajuster le code.

Par contre sur des projets ”fermé” avec une petite équipe ca sert uniquement à avoir un design propre (mais y faut faire gaffe à pas trop en faire).

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mardi 11 janvier 2011 23:08 par fathi
Classé sous : ,

Commentaires

fabrice.michellonet a dit :

Merci pour cet article qui donne un premier aperçu du concept.

# janvier 13, 2011 13:14
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01