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 :

Protection des données privées


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut Protection des données privées
    Bonjour, ce sujet a déjà peut-être été abordé mais je n'ai pas trouvé.

    Je développe sous C++ Builder. A plusieurs reprises, j'ai eu besoin d'accéder à des données déclarées private d'une classe. Ne trouvant pas de fonctions membres qui y accédaient, j'ai simplement modifié la déclaration de la classe dans l'en-tête .h ( ) pour redéfinir la donnée en public.

    Ma question est donc la suivante: la protection des données private est-elle donc si peu efficace ?

  2. #2
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    Le but des spécificateurs d'accès est plus de fournir une restriction sémantique qu'effective, une manière de dire "ne vous préoccupez pas de comment je fais mon travail, contentez vous de me demander le résultat".

    Après, tu ne sera pas toujours confronté à une situation où tu as accès au code source de l'application, imagines le cas d'une librairie dynamique ..

  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 611
    Points
    30 611
    Par défaut
    Salut,

    L'avantage de déclarer des membres privés (ou protégés, si un héritage est prévu), c'est que tu vas pouvoir présenter des fonctions (publiques, elles) utiles à l'utilisateur de la classe, sans qu'il ait besoin de s'inquiéter de comment les membres sont réellement maintenus en mémoire...

    Un exemple pourrait etre celui d'une classe "Couleur":

    Les couleurs "vraies" (pe: rgb(red, green, blue)) sont, par exemple, souvent utilisées sous la forme d'un char[3], mais tu pourrais décider de maintenir les valeurs sous la forme d'un std::vector<char>...

    Si tu laisse le std::vector<char> publique, tu courres le risque que l'utilisateur de la classe crée un code en l'utilisant directement... et, le jour où, par lubie ou suite à un benchmark, tu te rend compte qu'il est plus intéressant de le maintenir en mémoire sous la forme d'un char[3], tout le code créé par l'utilisateur qui utilise ta classe sera... bon à foutre à la poubelle...ou peu s'en faut...

    Par contre, si ton membre est privé, il te "suffira" d'adapter les méthodes que tu auras fournies pour gérer le membre en fonction du type utilisé et de fournir une mise à jour de ta classe, sans que cela provoque la perte de tout le code qui en dépend...

    Le résultat, y compris pour toi, c'est que d'un coté (membre publique), si tu modifie ne serait-ce qu'un tout petit peu une classe utilisée dans de nombreux fichiers, tu devra vraissemblablement parcourrir tous ces fichiers pour modifier le code, alors que, si le membre est privé, tu n'auras que le fichier dans lequel les fonctions membres permettent un acces au membre à modifier... Avec un gain de temps considérable

    La moralité, quand tu crées une classe perso, c'est que tu as plus intérêt à rajouter une méthode d'acces/modification du membre privé qui convienne à tes besoins, plutot que de faire passer un membre d'une visibilité privée à une visibilité publique
    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 averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Citation Envoyé par josse95
    Bonjour, ce sujet a déjà peut-être été abordé mais je n'ai pas trouvé.

    Je développe sous C++ Builder. A plusieurs reprises, j'ai eu besoin d'accéder à des données déclarées private d'une classe. Ne trouvant pas de fonctions membres qui y accédaient, j'ai simplement modifié la déclaration de la classe dans l'en-tête .h ( ) pour redéfinir la donnée en public.

    Ma question est donc la suivante: la protection des données private est-elle donc si peu efficace ?
    A mon humble avis, au lieu de rendre ta variable public tu peux :

    - Soit définir des accesseurs (comme ça était conseillé plus haut)
    - Soit- si tu sais à l'avance quelle classe aura besoin d'accéder à ce membre privé et que t'as pas envi de donner l'accès à d'autres- utiliser le notion de classe "amie" avec la classe en question.
    "Don't think you are, know you are..." (Morpheus)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Merci pour vos réponses.

    Neo41 a écrit:
    si tu sais à l'avance quelle classe aura besoin d'accéder à ce membre privé et que t'as pas envi de donner l'accès à d'autres- utiliser le notion de classe "amie" avec la classe en question
    Cela est valable pour le concepteur de la classe. Ma manip (douteuse, je le reconnais) concernait des classes que je n'avais pas écrites (VCL de C++ Builder). Je m'étonnais juste que la "protection des données privées" soit si facile à contourner.

    Cela dit, puisque comme le dit NewbiZ, "Le but des spécificateurs d'accès est plus de fournir une restriction sémantique qu'effective", je comprends mieux que cela soit possible.

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Note que ta manip ne fonctionne que par hasard, elle introduit un comportement indefini parce que ton programme ne respecte pas la regle de la definition unique (ODR pour les intimes).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Et le fait que cette manip fonctionne est-il spécifique à C++ Builder ou cela est-il général ?

    J'aurais tendance à penser que c'est le cas avec tous les compilateurs car je ne vois pas comment ceux ci pourraient se prémunir contre ce type d'opérations, que ce soit lors de la compilation (impossible), de l'édition de liens ou de l'exécution.

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par josse95
    Et le fait que cette manip fonctionne est-il spécifique à C++ Builder ou cela est-il général ?

    J'aurais tendance à penser que c'est le cas avec tous les compilateurs car je ne vois pas comment ceux ci pourraient détecter le changement de spécificateur d'accès, que ce soit lors de la compilation (impossible), de l'édition de liens ou de l'exécution.
    Il est vraisemblable que cela ait l'air de marcher avec la plupart des compilateurs, dans la plupart des circonstances. Mais quand on se mets a entrer dans les comportements indéfinis, les effets sont parfois tres bizarres. En particulier quand les optimiseurs entrent en jeu. Apres tout, c'est un comportement indefini et alors il peut se passer n'importe quoi, meme avant l'execution du code ayant le comportement indefini pour autant qu'on soit assure d'y passe (exemple classique, ce qui se passe avec de l'analyse de valeurs possibles qui peut decider qu'un test est toujours faux parce que s'il n'est pas faux on a un comportement indefini par la suite).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il me semble que la norme ne garantit pas la position/l'ordre des variables de niveaux d'accès différents : Seulement celui des variables ayant le même niveau d'accès...
    (d'après la doc de Visual, qui lui garantit l'ordre pour la classe entière).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc
    Il me semble que la norme ne garantit pas la position/l'ordre des variables de niveaux d'accès différents : Seulement celui des variables ayant le même niveau d'accès...
    (d'après la doc de Visual, qui lui garantit l'ordre pour la classe entière).
    C'est une des choses qui peuvent varier. Plus subtil, un optimiseur pourrait -- je n'en connais pas qui le fond, mais je suis loin d'etre un specialiste -- constater qu'un invariant entre membres donnees privees est maintenu par les membres fontions et en profiter. Si le petit jeu ci-dessus casse l'invariant, le code va faire n'importe quoi.

    (Pour info, il existe deja des optimiseurs qui changent un tableau de structures en une structure de tableau apres avoir remarque que le programme ne faisait rien de conforme qui profitait de la difference -- l'objectif etant de gagner en localite et donc de mieux profiter des caches).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/07/2009, 11h59
  2. Protection des données dans un module
    Par dsalvio dans le forum C
    Réponses: 2
    Dernier message: 10/08/2007, 07h30
  3. Réponses: 4
    Dernier message: 15/05/2007, 10h05
  4. Réponses: 10
    Dernier message: 21/06/2006, 15h50
  5. Protection des données de excel
    Par napegadie dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 16/11/2005, 13h25

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