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 :

Héritage VS Composition


Sujet :

C++

  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 Héritage VS Composition
    Bonjour,

    Je souhaiterais recueillir des avis/exemple (généraux ou très orientés sur un domaine) sur l'utilisation de ces deux concepts dans des cas non intuitifs, par exemple des exemples ou l'on préfèrera la composition à l'héritage, alors qu'on aurait tendance à faire l'inverse au premier abord (par exemple parce qu'on se base sur le monde réel pour la modélisation).

    Je ne sais pas si ces choix sont complètements indépendants du langage c'est pourquoi je poste sur ce forum plutôt que le forum UML.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par défaut
    Le conseil qui ressort de la plupart de mes lectures est de privilégier la composition à l'héritage. Je ne conserve l'héritage que lorsque la relation "est un' est flagrante ou pour introduire un niveau d'abstraction dans mon architecture.
    Il y a quelques temps, une bonne référence à un chapitre de B. Meyer a été posté sur ce forum. Je possède encore une copie du PDF, mais plus le lien.

  3. #3
    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 : 50
    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
    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.

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    C'est bien la recherche avancée.
    -> http://www.developpez.net/forums/sho...90&postcount=6 (il me sembait bien que j'avais pondu un truc très succinct à ce sujet il y a très très peu)

    -> http://www.developpez.net/forums/sho...&postcount=109 (A peine plus argumenté, qui insiste sur la non utilisation de l'héritage public pour de la réutilisation de code -- que l'on retrouve dans les premières pages du pdf sur l'héritage, tiré du bouquin du bouquin de B.Meyer ; ne pas oublier que le C++ dispose d'un héritage de réutilisation -> l'héritage privé).

    [...lien vers le bouquin de Meyer...]
    Arg. Je n'avais déjà pas fini les 200 pages du document de Stepanov, qu'en voici 62 de plus de Meyer.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Aprés d'éminents spéciallistes, je me permet de donner mon avis.

    L'héritage corresponds au verbe "être" et la composition au verbe "avoir".

    Par exemple: une Ferrari Testarossa "est" une voiture de course.

    "est" une voiture de course
    -> elle hérite des voitures (4 roues, un chassis). "De course" lors de l'héritage le levier de vitesse passe de 5 à 6 vitesses.

    Une voiture a 4 roues, un volant, etc... C'est une composition (appelé aussi agrégation).

  6. #6
    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
    Merci beaucoup pour vos réponses

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Bayard
    Aprés d'éminents spéciallistes, je me permet de donner mon avis.

    L'héritage corresponds au verbe "être" et la composition au verbe "avoir".

    Par exemple: une Ferrari Testarossa "est" une voiture de course.

    "est" une voiture de course
    -> elle hérite des voitures (4 roues, un chassis). "De course" lors de l'héritage le levier de vitesse passe de 5 à 6 vitesses.

    Une voiture a 4 roues, un volant, etc... C'est une composition (appelé aussi agrégation).
    Pour notre malheur, il faut encore etre prudent avec la règle du "est un(e)"...

    Car, en effet, on peut, en changeant juste un peu son point de vue, transformer une relation estun(e) en une relation "a"...
    une ferrari testarossa est une voiture de course
    ==>
    une ferrari testarossa a les composants propres aux voitures de courses
    Ce qui est donc sûr, c'est que si tu ne peux pas décemment estimer une relation "est un" (le propriétaire d'une voiture n'est clairement pas une voiture) -ou qu'au contraire, tu ne peut qu'estimer une relation "a un"- c'est que tu seras d'office dans une logique de composition

    Face à une relation "est un", il est parfois intéressant de s'inquiéter du contexte dans lequel tu travailles:

    Si la classe B a toutes les caractéristiques de la classe A, mais qu'elle est susceptible, durant son cycle de vie, de modifier la classe A, tu te tourneras vers une composition...

    Si, par contre, les caractéristique de A sont définies une fois pour toutes dans B, sans modification, il est déjà plus probable que tu te tournes vers un héritage...

    Evidemment, la ferrari testarossa est peut etre, justement, le contre exemple du changement de point de vue réussi . Car, dans quelle mesure peut on, une fois qu'on a une ferrari, en changer ses caractéristiques de voiture de course
    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

  8. #8
    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 : 50
    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
    Par défaut
    Citation Envoyé par Bayard
    L'héritage corresponds au verbe "être" et la composition au verbe "avoir".

    Par exemple: une Ferrari Testarossa "est" une voiture de course.
    Donc si je dis qu'une voiture, c'est un habitacle, une plateforme, et un bloc moteur, je dois faire hériter ma voiture des classes caisse, plateforme et blocMoteur ?

    Le français, comme tout langage naturel, est ambigü. Basé un choix pour un langage formel sur une analogie avec un langage naturel me semble dangereux, même si ça peut aider à mieux comprendre au début.
    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.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Le gros problème, c'est en fait de trouver l'élément qui sera utilisé par l'utlisateur comme "l'élément de base"...

    Prenons l'exemple d'une maison...

    Du point de vue d'un entrepreneur, ce sera une composition faite d'un tas de briques, d'un tas de tuiles, d'un tas de mortier, d'un tas de travaux d'électricité et d'un tas d'oeuvre de menuiserie

    Du point de vue d'un assureur, ce sera un immeuble (héritage) composé d'un certain nombre de "pieces d'habitation", elles-memes disposant d'un certain nombre d'objet. Nous aurons donc la composition de tout ce qui se trouve dans les pieces et des pieces en elles-meme.

    Du point de vu du proriétaire, la maison est vue comme un ensemble (la cuisine équipée ou la salle de bain avec jaccuzzi étant indissociable du concept de maison) et composée du divan en cuir ou du salon Louis XVI qui s'y trouve.

    Du point de vue de rentier qui met la maison en location, elle se limitera à la balance entre les frais qu'elle occasionne et les revenus du loyer

    Enfin, l'état ne verra qu'un revenu cadastral, basé -il me semble- sur la surface habitable, destiné à rapporter un impot foncier...

    Aucun de ces points de vue n'est mauvais de prime abord... "Simplement" ca ne fait que refléter la manière dont le concept "maison" est envisagé par chacune de ces personnes...

    Citation Envoyé par JolyLoic
    Donc si je dis qu'une voiture, c'est un habitacle, une plateforme, et un bloc moteur, je dois faire hériter ma voiture des classes caisse, plateforme et blocMoteur ?

    Le français, comme tout langage naturel, est ambigü. Basé un choix pour un langage formel sur une analogie avec un langage naturel me semble dangereux, même si ça peut aider à mieux comprendre au début.
    Si je suis d'accord avec la remarque sur les langages naturels, je le suis beaucoup moins concernant le raisonnement qui t'y a mené...

    Simplement, parce qu'il passe par une mauvaise utilisation de la langue francaise.

    Comme tout problème en ce bas monde, le fait de l'énoncer clairement et correctement est déjà résoudre à moitier le problème...

    Or, dans l'exemple que tu donnes, justement, tu n'énonce pas correctement le problème...

    En effet, tu ne peux pas plus prétendre que chaque élément pris séparément pourrait suffire à faire une voiture:

    • un habitacle se trouve tout aussi bien sur une voiture que sur certaines machine-outils
    • une platteforme peut tres bien se trouver au sommet d'un mirrador
    • un bloc moteur se retrouve dans tout ce qui est motorisé, en ce, y compris ce qui n'est pas un véhicule (une forreuse, par exemple)
    • et une caisse n'est pas forcément propre à créer une voiture... Je sais que certaines voitures sont "en caront pâte" , mais tu ne pourrais pas utiliser une caisse à banane pour créer ta voiture


    Pire, tu ne peux pas prétendre que l'ensemble de tout, interprété dans le sens de ton raisonnement suffirait à faire une voiture...

    Pour la simple raison que
    "une voiture, c'est (sous-entendu composé) d'un habitacle, d'une plateforme,..."

    Evidemment, on en arrive au problème du "bon parler"...

    C'est la raison pour laquelle je faisais remarqué (merci d'avoir enfoncé le clou ) que seul le fait de ne décemment pas pouvoir faire la relation est un(e) est synonime de composition, et qu'il s'agit de réfléchir plus loin dans le cas ou une telle relation peut etre faite
    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

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 26/11/2011, 23h15
  2. Héritage (pattern Composite)
    Par Ploupi dans le forum Langage
    Réponses: 4
    Dernier message: 21/09/2011, 10h36
  3. MCD correspondant à UML avec héritage et composition
    Par thomine dans le forum Modélisation
    Réponses: 4
    Dernier message: 08/07/2011, 11h21
  4. Héritage et composition
    Par arkerone dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2010, 14h00
  5. Héritage de composition.
    Par 3DArchi dans le forum BOUML
    Réponses: 1
    Dernier message: 30/07/2008, 14h59

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