300 likes | 402 Views
Code C ontracts. 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 !.
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