Code Contracts Gilles TOURREAU - MVP C# Architecte .NET / Formateur Winwise gilles.tourreau@winwise.com http://gilles.tourreau.fr Amine ZEMZEMI - MSP Etudiant / Stagiaire Sup Galilée amine.zemzemi@msp-france.com http://amine-zemzemi.blogspot.com
L’expert de référence ! Société d’expertise sur les technologies Microsoft Partenaire historique et stratégique de Microsoft Plus de 90 collaborateurs certifiés interviennent sur des missions à forte valeur ajoutée : Missions d’expertise Conseil & Audit Réalisation de projets à engagement de résultats Une offre couvrant l’ensemble du cycle de vie des applications : Travail collaboratif, portail d’entreprise et Workflow Business Intelligence & Data Management Interfaces utilisateurs, Rich Internet Application & desktop application Architecture d’entreprise et Architecture Life cycle Management Infrastructure, Sécurité et Réseaux Centre de formation et de Certification Microsoft WINWISE 130/136 Rue de Silly 92100 Boulogne-Billancourt http://www.winwise.com
Agenda Introduction à Code Contracts Spécifier des contrats Les pré-conditions Les post-conditions Les invariants L’héritage des contrats Vérification des contrats à la compilation Création des contrats sur du code existant Assembly de contrats Extensibilité de Code Contracts
Qu’est ce qu’un contrat ?
Qu’est ce qu’un contrat ?
Avant… Utilisation des exceptions : ArgumentException InvalidOperationException … Les conditions ne sont pas héritées dans les classes dérivées Duplication de code ! Les conditions ne peuvent pas être spécifiées dans les interfaces Vérification à l’exécution uniquement La documentation doit-être faite explicitement Les conditions sont compilées et utilisées sur les exécutables en production
Fonctionnalités de Code Contracts Permet de spécifier très simplement : Des pré-conditions Des post-conditions Des invariants Supporte l’héritage Possibilité de définir des contrats dans des interfaces Vérification à la compilation Extensibilité Génération de la documentation XML
Code Contracts Exécutable avec validation Code C# + Les contrats Code Contracts Rewriter Code C# + Les contrats Code et contrats compilés (méta-données) Doc. XML Compilation Code Contracts Doc Liste des contrats non respectés Code Contracts Check
Spécifier des contrats Les contrats sont spécifiés à l’aide de méthodes Ces méthodes sont compilées Elles représentent des méta-données (comme les attributs .NET) Utilisation de la classe statique Contracts Disponible dans le .NET Framework v4.0 Namespace System.Diagnostics.Contracts Tous les contrats doivent être spécifiés au début des méthodes
Les pré-conditions Vérifie une condition au début d’une méthode Par exemple : Tester la validité d’un paramètre Les appelants de cette méthode doivent obligatoirement respecter les pré-conditions
Les post-conditions Vérifie une condition à la fin d’une méthode Par exemple : L’appel à une méthode Add() avec deux entiers positifs doit retourner une valeur positive Les post-conditions peuvent Vérifier la valeur de retour d’une méthode (Result()) Comparer l’ancienne valeur d’un champ ou d’un paramètre (OldValue()) Vérifier la valeur d’un paramètre en sortie (out) (ValueAtReturn())
Les invariants Vérifie une condition sur l’état d’un objet Par exemple : Vérifier qu’un champ ne doit jamais être null. L’invariant est vérifié A la fin de toutes les méthodes d’une classe Après la vérification des post-conditions
Les pré-conditions Les post-conditions Les invariants Démo Les pré-conditions Les post-conditions Les invariants
L’héritage des contrats Tout contrat spécifié dans une méthode virtual, sera automatiquement hérité dans les méthodes redéfinie de la classe dérivée. Il n’est donc pas nécessaire de spécifier explicitement les contrats dans les méthodes redéfinies
Les interfaces Code Contracts permet de spécifier des contrats sur des interfaces Définir une classe abstraite implémentant l’interface et marqué de l’attribut ContractClassFor Marquer l’interface avec l’attribut ContractClass faisant référence à la classe abstraite précédemment créée
Spécification des contrats dans une interface [ContractClass(typeof(ClasseAbstraite))] Interface C# Interface C# Méthode M() Méthode M() Compilation + Code Contracts Rewriter [ContractClassFor(typeof(Interface))] Classe abstraite implémentant l’interface Classe implémentant l’interface Méthode M() + Contrats Méthode M() + Contrats Classe implémentant l’interface Méthode M()
L’héritage des contrats Les contrats dans une interface Démo L’héritage des contrats Les contrats dans une interface
Vérification des contrats à la compilation Peut-être lancé en ligne de commande ou depuis Visual Studio Nécessite l’édition Premium ou Ultimate Utilitaire (cccheck) lancé après la compilation Chaque appel à une méthode contenant des contrats est vérifiée L’appelant de la méthode doit donc « prouver » qu’il respecte bien tous les contrats
Vérification des contrats à la compilation Démo Vérification des contrats à la compilation
Code Contracts sur du code existant Une pré-condition écrite à l’aide d’un if-then-throw peut-être transformé en contrat. Utilisation de la méthode Contract.EndContractBlock() Une pré-condition écrite à l’aide d’un helper peut-être transformé en contrat. Utilisation de l’attribut ContractArgumentValidator
Utilisation de Code Contracts sur du code existant Démo Utilisation de Code Contracts sur du code existant
Assembly de contrats Permet de créer 2 d’assemblies : Un assembly contenant le code sans les contrats Utilisation en production Suppression des contrats => Gain de performances Un assembly contenant uniquement les contrats Pour être utilisé durant le développement Par un intégrateur
A.Contracts.dll Contrats compilés Assembly de contrats A.Contracts.dll Contrats compilés Projet A Code C# + Contrats Compilation + Code Contracts Rewriter Intégrateur A.dll Code C# compilé Production
Séparation des contrats Démo Séparation des contrats
Extensibilité des contrats Possibilité de redéfinir tout ou partie des contrats => Réécriture des méthodes de la classe Contract Possibilité de créer des agrégations de contrats (Abbreviators) Regroupement de plusieurs contrats
Ressources Site officiel de Code Contrats http://research.microsoft.com/en-us/projects/contracts/ Code Contracts Extensions pour Visual Studio http://visualstudiogallery.msdn.microsoft.com/85f0aa38-a8a8-4811-8b86-e7f0b8d8c71b/ Common Compiler Infrastructure http://ccimetadata.codeplex.com/ http://cciast.codeplex.com/ Pex http://research.microsoft.com/en-us/projects/pex/
Questions Gilles TOURREAU - MVP C# Architecte .NET / Formateur Winwise gilles.tourreau@winwise.com http://gilles.tourreau.fr Amine ZEMZEMI - MSP Etudiant / Stagiaire Sup Galilée amine.zemzemi@msp-france.com http://amine-zemzemi.blogspot.com
MSDN et TechNet : l’essentiel des ressources techniques à portée de clic Portail administration et infrastructure pour informaticiens Portail de ressources technique pour développeurs http://technet.com http://msdn.com