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 :

S�mantique de valeur et h�ritage


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut S�mantique de valeur et h�ritage
    Hello,

    Bon, je remets sur le tapis un sujet r�current, mais qui garde toujours quelques traces de n�bulosit�s.

    Dans la FAQ, il est dit que cela a peu de sens d'avoir de l'h�ritage avec une s�mantique de valeur (je ne vois d'ailleurs pas pourquoi la FAQ s'int�resse particuli�rement aux fonctions virtuelles). Je ne comprend pas vraiment pourquoi.

    En l'occurrence, je travaille sur une classe qui repr�sente un co�t. Ce co�t comprend diff�rentes valeurs scalaires, de type diff�rent, qui se compl�tent. J'ai une autre classe de co�t qui ajoute des composantes scalaires, et qui h�rite donc de la premi�re classe.

    Pourquoi cela pose-t-il un probl�me ?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Bonjour,

    Alors je ne me souviens plus vraiment de la d�monstration.

    Les classes � s�mantique d'entit� doivent interdire la copie et l'affectation. En revanche, on peut impl�menter une m�thode clone() par exemple.

    Les classes � s�mantique de valeurs doivent autoriser la copie et l'affectation.

    Or, si ont a une classe � s�mantique de valeur avec un h�ritage (ex. Fille h�rite de M�re), on peut avoir une fonction qui prenne en param�tre une M�re :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    void foo(Mere & mere)
    {
    }
    On pourra alors lui transmettre une Fille gr�ce au polymorphisme. Or si cette fonction foo se met � faire une copie :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void foo(Mere & mere)
    {
            Mere m = mere;
    }
    On va se retrouver avec un objet qui n'est pas une Fille, ainsi on risque d'avoir :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Mere m = mere;
    m != mere;
    Sans compter que l'objet m peut tr�s bien �tre dans un �tat "invalide" pour une instance de Mere.

    Ainsi il est tr�s d�conseill� d'utiliser l'h�ritage publique pour des classes � s�mantique de valeur.

  3. #3
    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
    Il y a deux soucis :
    - un s�mantique -> Quel est le sens dans ton syst�me � ajouter des couts qui ne sont pas du m�me type (ou m�me de les comparer, car c'est la m�me question) ? Il me semble que tu penses factorisation de code, et non pas LSP. Or un h�ritage (public) sans LSP, c'est un h�ritage bancal. Autant faire de la composition.
    P.ex., si je dois �crire Point + Vector, je ne vais pas d�river publiquement Point3D de Point2D pour �crire le bousin. A la place, je veux un meilleur typage qui ne me laissera pas faire des non-sens comme Point3D + Vector2D.

    - un technique -> le slicing rend tr�s difficile l'�criture ICout operator+(ICout, ICout) (il faut passer par l'idiome enveloppe-lettre ou d'autres feintes dans le genre)

    Bref, de la lecture:
    - http://www.drdobbs.com/cpp/compariso...ance/240149250
    - http://www.drdobbs.com/cpp/if-c-obje...equa/240146950
    - http://www.angelikalanger.com/Articl...ls/Equals.html
    - http://www.developpez.net/forums/d13...n/#post7141642 (je m'�tais emm�l� dans mes ensembles ^^')
    - http://akrzemi1.wordpress.com/2012/0...lue-semantics/
    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...

  4. #4
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Citation Envoy� par Luc Hermitte Voir le message
    Il y a deux soucis :
    - un s�mantique -> Quel est le sens dans ton syst�me � ajouter des couts qui ne sont pas du m�me type (ou m�me de les comparer, car c'est la m�me question) ? Il me semble que tu penses factorisation de code, et non pas LSP. Or un h�ritage (public) sans LSP, c'est un h�ritage bancal. Autant faire de la composition.
    P.ex., si je dois �crire Point + Vector, je ne vais pas d�river publiquement Point3D de Point2D pour �crire le bousin. A la place, je veux un meilleur typage qui ne me laissera pas faire des non-sens comme Point3D + Vector2D.

    [...]

    - http://www.angelikalanger.com/Articl...ls/Equals.html
    Ce qui est amusant, c'est que tu parles de LSP, issu du cerveau de Barbara Liskov, qui se sert justement d'une h�rarchie Point2D/Point3D pour illustrer l'impl�mentation en Java de la m�thode equals() (s�mantique de valeur).
    Pour juste se faire d�gommer par Angelika Langer qui dit que son impl�mentation est pourrie (non respect de la transitivit�).

    Comme quoi, ce n'est pas si �vident !

  5. #5
    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
    Pour moi, un point3D n'est pas un point2D, et que si on utilise l'h�ritage pour rajouter des choses � un type, �a ne marche pas comme �a. Mais alors pas du tout! [Et malheureusement, c'�tait l'argument de vente de l'h�ritage des ann�es 80-90 -> r�utiliser du code... ]
    L�, l'exemple auquel tu fais r�f�rence vient du monde Java, et Java ne permet pas de proposer un h�ritage de r�utilisation qui ne permet pas une substituabilit� syntaxique -- note dans les conclusions le "ne pas h�riter aurait �t� plus propre ici". De plus, le Java souffre, comme le C++, du non support des multi-m�thodes.

    Et l�, nous sommes � la crois�e de tous ces probl�mes � vouloir impl�menter l'�galit� sur des objets tir�s de hi�rarchies juste pour pouvoir factoriser du code source par h�ritage.
    Le probl�me en C++ ne se voit pas sur l'�galit�, mais au moment de vouloir copier. Et les racines (s�mantiques, j'ai envie de dire) du probl�me sont les m�mes, bien que les cons�quences techniques soient diff�rentes.
    Ce n'est pas une th�orie, mais une intuition personnelle (comme quoi, c'est le m�me probl�me)
    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...

  6. #6
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Citation Envoy� par oodini Voir le message
    En l'occurrence, je travaille sur une classe qui repr�sente un co�t. Ce co�t comprend diff�rentes valeurs scalaires, de type diff�rent, qui se compl�tent. J'ai une autre classe de co�t qui ajoute des composantes scalaires, et qui h�rite donc de la premi�re classe.
    Le probl�me survient a mon sens quand on se retrouve � faire des copies qui change le typage :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Cout cout = unCoutDerive;
    �a peut �tre g�nant au sens o� �a d�nature ton co�t, mais il me semble que c'est pas toujours catastrophique :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    // projection renvoyant un PointSurPolyligne, dérivé de point
    Point point = projection( polyligne, point ) ;

  7. #7
    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
    Et justement, qui dit s�mantique de valeur, dit copie. Et avec l'h�ritage, cela dit slicing.
    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...

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Vos r�ponse m'�clairent pas mal, mais admettons que j'ai des classes pour repr�senter le cout d'un salari� pour une entreprise.
    Disons que la classe de base, pour les employ�s standard, appel�e Co�tSalari�, comporte comme donn�es le salaire et les tickets restaurants.
    Il ne me para�t pas d�lirant d'avoir une classe d�riv�e Co�tSalari�Prim�, pour les commerciaux par exemple, qui auraient en plus une donn�es concernant le montant des primes.

    Le cout d'un salari� sujet aux primes est bien une sp�cialisation d'un salari�. S�mantiquement, l'argument qui m'a �t� pr�sent� ne me semble pas toujours valide.

    Seul l'argument technique reste pleinement valide. Mais il faudrait peut-�tre expliciter cela dans la FAQ (ou du moins ne pas pr�senter cela comme une �vidence).

    L'h�ritage priv� me semble �tre un bon compromis.

  9. #9
    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
    Pour moi, il y a une erreur de mod�lisation. Le cout d'un salari� est une table associative (aka dictionnaire dans les langages de scripts � la mode). Cela permet de rajouter facilement de nouveaux champs.
    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...

  10. #10
    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
    Par d�faut
    Citation Envoy� par oodini Voir le message
    Vos r�ponse m'�clairent pas mal, mais admettons que j'ai des classes pour repr�senter le cout d'un salari� pour une entreprise.
    Disons que la classe de base, pour les employ�s standard, appel�e Co�tSalari�, comporte comme donn�es le salaire et les tickets restaurants.
    Il ne me para�t pas d�lirant d'avoir une classe d�riv�e Co�tSalari�Prim�, pour les commerciaux par exemple, qui auraient en plus une donn�es concernant le montant des primes.

    Le cout d'un salari� sujet aux primes est bien une sp�cialisation d'un salari�. S�mantiquement, l'argument qui m'a �t� pr�sent� ne me semble pas toujours valide.

    Seul l'argument technique reste pleinement valide. Mais il faudrait peut-�tre expliciter cela dans la FAQ (ou du moins ne pas pr�senter cela comme une �vidence).

    L'h�ritage priv� me semble �tre un bon compromis.
    Tu confonds la valeur du cout et le system qui calcul cette valeur. Les deux devraient etre dissocies. Le cout devrait avoir semantique de valeur (peut etre differents types pour differents types de couts, composes via heritage prive et "using", ou encore via CRTP) tandis que le systeme qui calcul le dis coup pourrait faire partie d'une hierarchie ou il y aurait specialization.

    Tout mettre dans la meme classe c'est pas du tout une bonne idee.

  11. #11
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Je n'ai nulle part parl� de syst�me de calcul des co�ts.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 8
    Dernier message: 13/10/2008, 20h26
  2. connaitre la valeur s�mantique d'un string
    Par vanhel dans le forum Langage
    R�ponses: 4
    Dernier message: 20/05/2008, 14h32
  3. S�mantique de valeur et bosst::shared_ptr
    Par bolhrak dans le forum Boost
    R�ponses: 1
    Dernier message: 11/09/2007, 00h35
  4. [VB.NET]H�ritage : valeur d'une propri�t� perdue
    Par denilson dans le forum Windows Forms
    R�ponses: 1
    Dernier message: 06/07/2006, 11h50

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