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

Langage C++ Discussion :

Quand utiliser Pimpl ?


Sujet :

Langage C++

  1. #1
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut Quand utiliser Pimpl ?
    Bonjour à tous

    A priori, j'ai l'impression que l'idome Pimpl présente que des avantages et aucun défaut (juste une indirection supplémentaire). Cet idome est utilisé dans la majorité des classes de Qt. Les avantages sont :
    - de faciliter la compatibilité binaire. Voir Pensées sur la compatibilité binaire de Thiago Macieira ;
    - d'améliorer la stabilité de l'interface publique (en permettant de pouvoir changer la partie private de la classe sans avoir à recompiler l'ensemble des dépendances). Voir Guru of the Week #100 et Guru of the Week #101 de Sutter ;
    - de diminuer les temps de compilation (en minimisant les dépendances dans les fichiers d'en-tête).

    Donc, quand faut-il utiliser Pimpl ? Ou plus précieusement, quand ne pas l'utiliser et pourquoi ?

  2. #2
    screetch
    Invité(e)
    Par défaut
    pour moi il y a pas mal de travail supplémentaire en utilisant pimpl; le principal etant de "forwarding" de l'interface publique; un autre la complexité de faire des appels virtuels sans causer de bugs.

    Or on m'a toujours dit de coder des petites classes; mes classes font rarement plus de quelques lignes (dans le header) et environ 100 a 200 lignes dans le source; utiliser pimpl pour tous ces cas doublerait mon nombre de ligne pour être franc.

    J'ai parfois l'impression que pimpl est souvent utiliser pour cacher la complexité d'une implémentation, en tous cas dans le monde pro quand je l'ai vu utiliser c'était souvent sur une classe avec une interface publique de 15 ou 20 methodes, donc tout de suite une grosse tuyauterie. Ca me donne surement un a priori negatif bien sur.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Je t'avouerai que j'ai une très mauvaise expérience professionnelle du pimp parce que, dans mon travail actuel on l'utilise pour une classe pour laquelle la justification à son utilisation ne m'a pas vraiment convaincu (mais bon, je suis un "pisseur de code" sur ce projet ) et qu'il est mis en oeuvre pour un property manager qui a le très mauvais gout de reprendre toutes les propriétés (ayant trait à des domaines divers et variés) du projet.

    Ceci dit, l'idiome peut avoir d'énormes avantages, mais à la condition expresse de... veiller à respecter malgré tout les autres règles (dont, essentiellement, la responsabilité unique).

    Pour moi, pimp est à prendre comme toutes les autres techniques de programmation : très intéressantes si elles sont utilisées à bon escient, calamiteuses si elles le sont en dépit du bon sens...

    Mais le gros du débat risque donc de dévier vers "quand pimpl est il utilisé à bon escient"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Personnellement, le seul cas ou je vois un interet c'est quand on fournis une bibliothèque dont on ne peut fournir le code et qui doit avoir une interface compatible entre les versions des binaires. Du coup on doit fournir des headers bien précis qui cachent complètement ce qui se passe derrière ET qui n'utilisent pas de templates (qui posent problème quand on compile avec un compilateur différent de celui du binaire de la bibliothèque).

    Au delà de ce cas bien précis, ça deviens vite beaucoup de travail pour pas grand chose.

    D'ailleurs, beaucoup de bibliothèques "utiles" (qui n'implémentent pas un "système stable" comme DirectX ou autres) ne garantissent pas une compatibilitié de binaire et fournissent complètement leur code entre autre parcequeça évite d'avoir a faire ce genre de chose.


    Au fait c'est pas plutot PIMPL ? Pointer Implementation ...

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Au fait c'est pas plutot PIMPL ? Pointer Implementation ...
    Erreur de frappe dans le titre. Corrigé


    Ok. Donc si je résume :
    - de faciliter la compatibilité binaire
    Peu utile, sauf pour certaine bilbiothèque
    - d'améliorer la stabilité de l'interface publique
    - de diminuer les temps de compilation
    Détails par rapport à la perte de temps de dev que cela implique

    Je l'utilise pas non plus en général. Je me posais la question de savoir si je n'utilisais cette approche, qui n'aurait que des avantages, que par habitude de vieux codeur et non par choix technique.

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Ce sont les articles que j´ai cité dans mon premier post et qui m´ont interpelé sur cette question

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Pour moi, c'est utile quand tu dois fournir une API, et que tu dois assurer une relative stabilité de l'interface.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par oodini Voir le message
    Pour moi, c'est utile quand tu dois fournir une API, et que tu dois assurer une relative stabilité de l'interface.
    Le seul respect de l'OCP devrait déjà te fournir la stabilité requise

    Non, je verrais plutot son utilité dans le cadre d'un DP bridge ou façade

    Mais, encore faut-il que cette façade ou ce pont soient, effectivement nécessaires

    Si l'on s'amuse à faire un pont ou une façade uniquement "parce que l'on risque de vouloir changer" (de SGBDR ou de bibliothèque IHM) alors qu'on sait très bien que ce ne sera jamais le cas, ne se fait on pas du mal juste pour le plaisir
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    - d'améliorer la stabilité de l'interface publique (en permettant de pouvoir changer la partie private de la classe sans avoir à recompiler l'ensemble des dépendances).
    Pour avoir ça, ne peut-on pas se contenter de coder par interface dans les classes pour lesquelles c'est critique (pour moi, surtout les points d'entrée d'API)?
    Si on définit une interface avec seulement les méthodes publiques virtuelles pures et qu'on met leur vraie implémentation (et les membres/méthodes privées) dans une dérivée, est-ce qu'on n'arrive pas plus simplement à ce résultat?

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ça dépend ce qu'on entend par interface. On peut entendre par là le concept (séparation de l'implémentation) où la traduction du mot clef utilisé dans d'autres langages (classe de base avec uniquement des fonctions virtuelles pures).

    L'idiome pimpl est une façon de réaliser une interface (le concept) propre séparée de l'implémentation. Ce n'est pas la seule, l'interface (la traduction) est une autre façon de réaliser une interface (le concept).

    Comme il y a plusieurs solutions, il faut proposer des critères de choix.

    Pour des types à sémantique de valeur, j'ai tendance à largement préférer le pimpl : Le résultat est lui même à sémantique de valeur, on peut aisément le copier, l'assigner à une nouvelle variable, toutes choses difficiles/impossibles avec une classe de base que l'on doit manipuler par pointeur.

    Pour des types à sémantique d'entité, que l'on doit de toute manière manipuler par pointeurs, je partirais peut-être plus vers la classe de base. Ne serait-ce que pour la possibilité d'implémenter plusieurs interfaces par un seul type. A noter que même dans ce cas, ma classe de base serait probablement plus riche qu'une interface au sens Java/C#, elle contiendrait par exemple des fonctions statiques servant de factory pour mon type.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [MySQL 5.0] RAND() inefficace quand utilisation de GROUP BY
    Par Takusen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/11/2006, 15h39
  2. [POO] Quand utiliser une classe ?
    Par Gwipi dans le forum Langage
    Réponses: 8
    Dernier message: 05/05/2006, 14h31
  3. Réponses: 10
    Dernier message: 08/02/2005, 10h52
  4. Écriture dans un DBgrid quand utilise un query comme dataset
    Par dcayou dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 22h22
  5. [Procédure Stocké] Quand utiliser ?
    Par touhami dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h09

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