300 likes | 406 Views
Discover the power of Code Contracts in C# with this in-depth guide. Learn how to specify contracts, including preconditions, postconditions, and invariants to enhance your code reliability. Explore inheritance of contracts, compile-time checks, and how to extend Code Contracts for existing code bases. This resource is ideal for developers aiming to improve their programming practices and ensure robust application behavior. Delve into best practices, practical examples, and detailed explanations to empower your development skills in .NET.
E N D
Code Contracts Amine ZEMZEMI - MSP Etudiant / Stagiaire Sup Galilée amine.zemzemi@msp-france.com http://amine-zemzemi.blogspot.com Gilles TOURREAU - MVP C# Architecte .NET / Formateur Winwise gilles.tourreau@winwise.com http://gilles.tourreau.fr
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-Billancourthttp://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
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 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 • NamespaceSystem.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
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 contratsdans 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()
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
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
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
Assembly de contrats A.Contracts.dllContrats compilés • Projet A • Code C# • + • Contrats • Compilation • + • Code • Contracts • Rewriter Intégrateur A.dll Code C# compilé Production
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 Amine ZEMZEMI - MSP Etudiant / Stagiaire Sup Galilée amine.zemzemi@msp-france.com http://amine-zemzemi.blogspot.com Gilles TOURREAU - MVP C# Architecte .NET / Formateur Winwise gilles.tourreau@winwise.com http://gilles.tourreau.fr
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