Page de garde Design by Contract en C++ Maîtrise d’informatique Février 2002.

Slides:



Advertisements
Présentations similaires
Formation universitaire à .NET: Introduction à C#
Advertisements

Cours n° 7 Standard Template Library II.
Spécialisation/généralisation Héritage Polymorphisme
1 Quelques précisions sur l'héritage. 2 Signification de super.f() appel à la méthode f() masquée super : désigne l'objet appelant comme s'il était de.
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Au programme du jour …. Introduction à lhéritage Un concept important de la programmation objet Livraison de code Organisation des répertoires et packages.
26/05/071 Présentation de JUnit Partie 2 NICOLAS BOUSSEKEYT CNAM
Principes de programmation (suite)
2ième Classe (Mercredi, 13 Octobre) C++ Intro CSI2572.
Tests Programmation par contrats
Page de garde Doc++ Maîtrise dinformatique Février 2002.
Structures collectives en Java
Structures de données et algorithmes – C5 Maria-Iuliana Dascalu, PhD
POO-L3 H. Fauconnier1 Chapitre IV 1. classe Object, clonage 2. interfaces 3. classes internes et imbriquées.
Maîtrise d’informatique
POO-L3 H. Fauconnier1 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X(); //non xA[1]=new Z(); //non Object XX[]int[] YZY[]Z[]
Premier cours (23 septembre). Cours programmation- orientée objet en Java Licence dinformatique Hugues Fauconnier
Page de garde C++ Le RTTI et les opérateurs de cast Maîtrise dinformatique Février 2002.
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Complément Le diagramme des classes
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Page de garde C++ Les exceptions Maîtrise dinformatique Février 2002.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Structures de données IFT-2000
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
IFT313 Introduction aux langages formels
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Piles Premier arrivé, dernier servi: LIFO (Last In, First Out) Liste à usage restreint: Enlève et insère un élément seulement à un bout de la liste. Notation:
Cours du 22 novembre généricité. Chapitre VII Généricité.
Cours 4 Héritage (suite).
Héritage Lhéritage permet de spécialiser une classe en définissant une relation de type « est une sorte de ». #include comptebancaire.h class CompteEpargne.
Structures de données IFT-2000
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
FONCTIONS avec paramètres en Entrée/Sortie
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
La librairie assert.h.
Raffinement de modèles JML Julien Groslambert LIFC Besançon Réunion GECCOO - 25 Octobre 2005 FRE 2661.
Paradigmes des Langages de Programmation
Inclusions & dépendances. C compile texte > objet int main () …
LES PILES ET FILES.
La notion de type revisitée en POO
Les Contrôles Page 1. Page 2 If … Elseif... Endif If … Endif if (i=5 and j
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
SIF-1053 Architecture des ordinateurs
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Types Abstraits.
11/04/ L'héritage Cours 7 Cours 7.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Template Method Design Pattern. But Définir le squelette d’un algorithme tout en déléguant certaines étapes aux sous-classes. Les sous-classes peuvent.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
12/04/ Le polymorphisme Cours 8 Cours 8.
Tutorat en bio-informatique
12/04/ Les exceptions Cours 11 Cours 11.
ETNA – 1ème année Guillaume Belmas –
SciTools Understand A Source Code Analysis and Metrics Tool
Les surcharges d'opérateurs
Code Contracts Gilles TOURREAU - MVP C# Architecte .NET / Formateur
Le Préprocesseur. Sujets abordés: Préprocesseur –Qu’est ce? –Qu’est ce qu’une directive? Les macros –Les définir, les redéfinir, les dé-définir –Les macros.
Cours du 5 novembre.
Iterator Design Pattern Alessandro Soro Sylvain Giroux.
6ième Classe (Mercredi, 17 novembre) CSI2572
Conception de Programmes - IUT de Paris - 1ère année Conception de Programmes Objectifs et organisation du cours Introduction à la P.O.O.
Héritage Conception par Objet et programmation Java
1 Complément JAVA les assertions. 2 lan Tests et erreurs Assertions en Java Utilisation Bonne pratique des assertions.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Template Method Design Pattern. But Définir le squelette d’un algorithme tout en déléguant certaines étapes aux sous-classes. Les sous-classes peuvent.
Transcription de la présentation:

Page de garde Design by Contract en C++ Maîtrise d’informatique Février 2002

Design by Contract Nous ne traiterons ici que des grandes lignes du principe du Design by Contract et de la mise en œuvre en C++. Pour plus de détail, reportez vous au cours très complet de Roger Rousseau, disponible sur : Uranie : ~rr/minfo A l’inverse du language Eiffel, C++ n’offre aucun support pour le DbC, sinon le support d’assertions très primitives via la fonction assert( expr ).  Il va falloir tout gérer soi-même :  Mettre en œuvre des macros de support des différents types d’assertions ;  Rédiger les assertions dans les commentaires Doc++ ;  Respecter le polymorphisme lors des redéfinitions de méthodes (pré/postconditions) ;  Vérifier les invariants de classes à la sortie des méthodes non const.  Et que sais-je encore… C’est extrêmement fastidieux (mais qui a dit que le développement de systèmes robustes ne l’était pas ?), mais selon moi, le "retour sur investissement" justifie cette peine…

Rappels Contrats publics : Pour pouvoir invoquer une fonction, l’appelant s’engage à respecter le contrat énoncé par la précondition. En échange, le ou les auteurs de la fonction s’engagent à respecter le contrat énoncé par la postcondition. Toute méthode altérant l’objet ne doit pas le mettre dans un état incohérent qui violerait l’invariant de classe. Contrats privés : + variants et invariants disséminés (assertions régulières, variants et invariants de boucles). L’évaluation des assertions ne doit pas provoquer d’effets de bord.

Classes dérivées et redéfinitions Selon le principe de base du polymorphisme, une instance d’une classe dérivée doit pouvoir être confondue avec une instance d’une classe de base : Les préconditions doivent être au moins aussi tolérantes ; Les postconditions doivent être au moins aussi strictes. Les préconditions des fonctions redéfinies seront donc une disjonction des préconditions de ces fonctions dans les classes ancètres. Les postconditions des fonctions redéfinies seront donc une conjonction des postconditions de ces fonctions dans les classes ancètres. Les invariants de classes des classes ancètres seront aussi vérifiés en conjonction de ceux des classes dérivées.

Exemple Complètement au hasard, code provenant d’une pile ( ArrayStack ): /** * Returns the item at the top of this stack. * !IsEmpty() * & result != NULL */ inline Item& GetTop() const { PRECOND( !IsEmpty() ) Item& result= ArrayList ::GetLast(); POSTCOND( &result != NULL ) return result; }

Exemple /** * Pushes the specified item on the top of this stack. * &item != NULL * GetItemCount() == ()+1 */ inline void Push( Item& item ) { PRECOND( &item != NULL ) #ifdef POSTCONDITIONS_ENABLED const int iOldItemCount= GetItemCount(); #endif ArrayList ::AddLast( item ); POSTCOND( GetItemCount() == iOldItemCount+1 ) ArrayStack::CheckInvariant(); }

Exemple /** * Returns and removes the item at the top of this stack. !IsEmpty() GetItemCount() == ()-1 & result != NULL */ inline Item& Pop() { PRECOND( !IsEmpty() ) #ifdef POSTCONDITIONS_ENABLED const int iOldItemCount= GetItemCount(); #endif Item& result= ArrayList ::Remove( GetItemCount()-1 ); POSTCOND( GetItemCount() == iOldItemCount-1 ) POSTCOND( &result != NULL ) ArrayStack::CheckInvariant(); return result; }

Macros de support #ifdef PRECONDITIONS_ENABLED # define PRECOND( expr ) \ {if (!(expr)) PrecondFailed( #expr, __FILE__, __LINE__ );} #else # define PRECOND( expr ) \ {} #endif #ifdef INVARIANTS_ENABLED # define INVARIANT( expr ) \ {if (!(expr)) InvariantFailed( #expr, __FILE__, __LINE__ );} #else # define INVARIANT( expr ) \ {} #endif De même pour CHECK et POSTCOND.

Fonctions de support #ifdef INVARIANTS_ENABLED void InvariantFailed( const char * const strAssertionExpr, const char * const strFilename, const int iLine ) { cerr << "Invariant failed: " << strAssertionExpr << endl << "\tIn file: " << strFilename << endl << "\tAt line: " << iLine << endl; exit( 69 ); } #endif Cerise sur le gateau : positionner un point d’arrêt du déboggeur sur exit, ou appeler __debugbreak() (MSVC++ 7).

Conclusions Le DbC dans un language qui ne le supporte pas est encore plus fastidieux. Le code des assertions est parfois redondant avec celui des méthodes. L’exécution du système est généralement fortement ralentie lorsque les assertions sont armées. MAIS Le code est [auto]documenté, autovérifiable, autotestable : toute exécution (correcte) du programme ne fait qu’en renforcer la validité ! La détection des bugs est beaucoup plus proche de leur source ; elle intervient avant que le bug ne se propage dans les méandres d’un système au final très complexe. Diagnostic clair en cas de bug. Définition claire des responsabilités en cas de bug décelé. LORSQUE VOUS PROGRAMMEZ SOYEZ PARANO !!!!!