IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Programmation par contrat en C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut Programmation par contrat en C++
    Bonjour,

    Petite question sur la mise en oeuvre de la programmation par contrat en C++. Dans la mesure où l'on n'a pas de syntaxe spécifique pour spécifier les contrats (comme des clauses requires en ensures par exemple), comment peut-on les spécifier autrement que par des commentaires ?

    Les asserts en début de méthodes pour vérifier les préconditions sont pour moi une forme déguisée de test sur les préconditions, chose que l'on n'est pas sensé faire.

    Les ruptures de contrat sont sensées lever des exceptions, comment le faire si on ne vérifie pas les conditions ?

    Merci d'avance.

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'ai entendu parler de techniques de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class Test
    {
    public:
        void DoSomething();
    private:
        virtual void DoSomethingImpl() = 0;
    };
     
    void Test::DoSomething()
    {
        // verification des preconditions
        this->DoSomethingImpl();
        // verification des post conditions
    }
    Les implémentations héritent de Test, et le client utilise uniquement les fonctions publiques non virtuelles de Test.

    On peut imaginer des solution a base de template wrapper...

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Oui mais il y a dans ce code les vérifications des conditions, chose qu'on est sensé éviter de faire.

    Le fait d'utiliser de wrapper les méthodes virtuelles par des non virtuelles permet juste d'isoler proprement l'interface de l'implémentation (on pourrait carrément aller plus loin en appliquand l'idiome Pimpl).

    Rajouter les vérifications des conditions dans les méthodes virtuelles contredit la règle selon laquelle une méthode n'est pas sensé tester sa précondition. A moins que cette règle soit basée sur la possibilité du langage de spécifier et vérifier les pré et post conditions de manière transparente. Dans ce cas on a pas d'autres choix en C++ que de tester ces conditions, mais je ne sais pas si on peut toujours parler de programmation par contrat du coup

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Oui mais il y a dans ce code les vérifications des conditions, chose qu'on est sensé éviter de faire.
    Je ne comprend pas ce que tu veux dire, le C++ ne supportant pas nativement la programmation par contrat, il faut forcement faire les vérifications "à la main" . Que ce soit les pré-conditions, les post-conditions ou les invariants, on les indiques par des commentaires dans le .h et on les vérifie avec des assert() ou équivalent dans l'implémentation.

    À noter que les exceptions ne sont pas une bonne façon de gérer les erreurs de contrat.

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Je ne comprend pas ce que tu veux dire, le C++ ne supportant pas nativement la programmation par contrat, il faut forcement faire les vérifications "à la main" . Que ce soit les pré-conditions, les post-conditions ou les invariants, on les indiques par des commentaires dans le .h et on les vérifie avec des assert() ou équivalent dans l'implémentation.
    Disons que les vérifications à la main me paraissent plutôt orientées programmation défensive, donc à l'opposé de ce que propose la programmation par contrat.

    À noter que les exceptions ne sont pas une bonne façon de gérer les erreurs de contrat.
    A cause de la perte de contexte ? Dans le cas d'une version DEBUG, l'assert passe, dans le cas d'une release comment signaler à l'appelant que le contrat est rompu autrement que par une exception ? Un arrêt complet de l'exécution n'est aps forcément acceptable.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Disons que les vérifications à la main me paraissent plutôt orientées programmation défensive, donc à l'opposé de ce que propose la programmation par contrat.
    La programmation par contrat est un type de programmation défensive. Elles ne sont pas opposées.

    Dans le cas d'une version DEBUG, l'assert passe
    Une version DEBUG, comme le nom l'indique, c'est pour debugger. La programmation par contrat, c'est pour trouver plus facilement les bugs. Il me semble donc normal que les deux soient liés.

    dans le cas d'une release comment signaler à l'appelant que le contrat est rompu autrement que par une exception ?
    L'appelant n'a pas à savoir si le contrat est rompu, il doit respecter le contrat. S'il ne le respecte pas, c'est un bug, et un arrêt complet est une solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. programmation par contrat
    Par Choupinou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/03/2009, 01h46
  2. [Language]Programmation par contrat
    Par manube dans le forum Langage
    Réponses: 3
    Dernier message: 20/12/2005, 10h16
  3. [Eiffel] Programmation par contrats
    Par SkIllz2k dans le forum Autres langages
    Réponses: 1
    Dernier message: 02/05/2005, 20h05
  4. [Tests]La programmation par contrats
    Par fabien.raynaud dans le forum Test
    Réponses: 6
    Dernier message: 26/07/2004, 11h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo