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 :

question de design : copie ou référence?


Sujet :

C++

  1. #1
    screetch
    Invité(e)
    Par défaut question de design : copie ou référence?
    j'utilise une bibliothèque d'interfacage avec des langages de scripts et je me demande ce qui est le plus naturel.
    Prenons l'exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object a;
    Value v(a);
    Value v2(v);
    Value name = v("name");
    ici, Value est un simple wrapper (une sorte d'union) qui permet d'accéder en runtime aux membres d'une structiure. Je vous passe sur toute la machinerie interne.
    Object est une structure dont un des membres (name) est une chaîne de caractères.
    On a donc une instance de Object (a). On la place dans un container "Value". Le container permet d'accéder a sa propriété "name" par son nom.
    Et c'est ce qu'on fait.


    Tout cela marche très bien mais je me demande ce qui est le plus naturel: est ce que une Value contient une copie de la valeur ou bien une référence?

    Pour moi il est naturel que ce soit une référence mais je me rends compte que ca pourrait ne pas être naturel pour tous.

    Dans l'exemple plus haut, que pensez-vous:
    - v contient une copie de a ou une référence?
    - v2 contient une copie de a ou une référence?
    - name contient une copie de la propriété ou une référence?

    ce qui me parait logique moi, c'est que si je fais
    alors a.name vaut toto. mais je me demande si c'est vraiment ce que l'on pense.
    et si v("name") = ""... est naturel, qu'en est il de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Value name = v("name");
    name = "tata";
    est ce que je viens de changer a?
    Qu'en pensez vous?

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par screetch Voir le message
    Dans l'exemple plus haut, que pensez-vous:
    - v contient une copie de a ou une référence?
    - v2 contient une copie de a ou une référence?
    - name contient une copie de la propriété ou une référence?
    Sa dépend de l'implémentation de "Value" et "Object".
    En supposant que "Value" conserve une référence de "Object" il est impossible de savoir si a un instant T l'objet sauvé existe toujours en mémoire.
    Cela me semble donc être une solution dangereuse (la copie semble donc le plus probable).

    En général avec ce genre de librairies c'est l'utilisateur qui détermine le type d'objet stocké à l'aide d'un template (cf. std::vector / std::list de la STL).

  3. #3
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    v et v2 sont des objets à part entière.
    Tu passe à ces objets un argument pour leur constructeur il est impossible de savoir si v et v2 sont des copies !

    Cela dépend comment tu as implémenté les constructeurs.

    Admettons que ton objet 'a' contient deux membres : x et y.

    Et que tu as implémenter le constructeur de l'objet 'v' comme ceci :

    Value::Value(Objet a)
    {
    x = a.x;
    y = a.y;
    }

    alors l'objet de 'Value' sera une copie.
    Seulement dans ce cas.

    Une référence s'obtient de la façon suivante :

    Objet a;
    Value v0(a);
    Value& v1 = v0;
    Le bonheur est sans raison

  4. #4
    Membre régulier

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Points : 70
    Points
    70
    Par défaut
    Tu as deux options:
    - soit ton conteneur la copie et la conserve par valeur, il assume donc la responsabilité de la survie de l'objet.
    - soit ton conteneur ne prend qu'une référence, et il dépend d'une autre entité pour assurer la survie de l'objet.

    Les deux options sont envisageables, tout dépend de ce que tu veux faire. La question n'est pas "ce qui est naturel" mais bien "quelle responsabilité le conteneur est sensé assumer".

  5. #5
    screetch
    Invité(e)
    Par défaut
    Mince je me suis mal exprimé au début...
    "j'écris" une bibliothèque!
    j'ai le contrôle du code sur Value, et j'ai implémenté successivement de deux manières différentes.
    D'où ma demande: si vous utilisiez la bibliothèque, que pensez vous que le code plus haut frait: des copies ou juste des alias?
    Ou bien, probablement les deux devraient être supportés, du coup quele syntaxe utilisée?

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par screetch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Value name = v("name");
    name = "tata";
    est ce que je viens de changer a?
    Qu'en pensez vous?
    non, ca brise le Least Surprise Principles.

    Je verrais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Object a,b;
    Value va = a;
    name =b; // ne change pas a
     
    SharedValue sa  = a;
    name = b; // change a

  7. #7
    screetch
    Invité(e)
    Par défaut
    le fait d'avoir deux types ne m'arrange pas mais je vois ce que tu veux dire.
    Peut être je pourrais avoir un "ByRef" comme paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object a;
    Value v = a; // copie
    Value name = v("name", ByRef); //référence
    name = "tata"; // a n'a pas changé mais la copie de a a bien changé

  8. #8
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    pourquoi ca ne t'arrange pas?

    le ByRef est bien moche :/
    Je prefererais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Value name = v(ByRef("name"));
    ou ByRef serait un mini-wrapper template

  9. #9
    screetch
    Invité(e)
    Par défaut
    Value est le wrapper que les langages de scripts manipulent
    je pensais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Object a;
    Value v1 = a; // copie
    Value v2 = ByRef(a); // réference
     
    Value name = v2("name"); //() retourne un objet intermédiaire qui peut être "casté" en Value et créer une copie, donc name est une copie
    v2("name") = "toto"; //v2 a été changé ici, donc a a été changé

  10. #10
    screetch
    Invité(e)
    Par défaut
    j'ai fait comme ca et ca me plait merci joel

Discussions similaires

  1. Question de design
    Par Dohmaker dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/09/2007, 19h29
  2. Réponses: 4
    Dernier message: 14/07/2006, 02h30
  3. Question de design?
    Par Jayceblaster dans le forum Delphi
    Réponses: 9
    Dernier message: 06/06/2006, 19h38
  4. Réponses: 11
    Dernier message: 21/05/2006, 14h39
  5. [Struts] question de design
    Par mlequim dans le forum Struts 1
    Réponses: 4
    Dernier message: 26/10/2005, 12h27

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