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 PHP Discussion :

[POO] Visibilité des propriétés


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 174
    Points : 80
    Points
    80
    Par défaut [POO] Visibilité des propriétés
    Bonjour,

    je comprend bien les notions de private, public, protected etc... mais cependant j'ai juste une difficulté à saisir quand faut il utiliser l'une ou l'autre, dans quel contexte concret doit on rendre une donnée privé ou protected... par défaut je les met en protected et j'ajuste en fonction... mais y'a t'il des règles élémentaires pour identifier les cas concrets d'utilisation de l'une ou l'autre des ces propriétés?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    normalement, une classe possède tous ces attributs en private ==> principe d'encapsulation. Et n'expose que quelques informations au travers des accesseurs.

    Donc normalement ta question devrait être, quand est ce que j'arrête de faire des accesseurs pour laisser la propriété en accès public.

    Réponses : Qd tu as un coup de fainéantise, ou quand cela n'a pas d'impact sur le fonctionnement de ton instance.
    tout le reste devrait être contrôler en entrée / sortie, et donc en private / protected.

  3. #3
    Membre actif

    Homme Profil pro
    Software Engineer
    Inscrit en
    Août 2004
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2004
    Messages : 173
    Points : 220
    Points
    220
    Par défaut
    A noter pour ajouter par rapport à ce qui a été dit au dessus, que "protected" est à éviter le plus possible. Cela revient à dire qu'il suffit d'hériter la classe pour briser le principe d'encapsulation.

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Salut,

    normalement, une classe possède tous ces attributs en private ==> principe d'encapsulation. Et n'expose que quelques informations au travers des accesseurs.

    Donc normalement ta question devrait être, quand est ce que j'arrête de faire des accesseurs pour laisser la propriété en accès public.

    Réponses : Qd tu as un coup de fainéantise, ou quand cela n'a pas d'impact sur le fonctionnement de ton instance.
    tout le reste devrait être contrôler en entrée / sortie, et donc en private / protected.
    'faut voir...

    Les notions de portées des attributs ne sont importantes que dans le cadre d'un travail en équipe ou dans la réalisation de modules réutilisables. C'est le principe de la "boîte noire" qu'on utilise sans en connaitre le fonctionnement.

    Mais il s'agit juste d'un côté pratique et conventionnel, rien n'interdit de mettre tous ses attributs en accès publique. Voir les conventions de Perl ou par défaut il n'y a pas de variable privée (sauf utilisation de closures) et dont le modèle objet fonctionne très bien.

    Parce que franchement, les getters et les setters qui ne font que renvoyer la variable, c'est inutile.
    Sans compter les mauvaise utilisations ou on croit blinder un attribut objet en lecture en ne renvoyant qu'un getter public. Le passage par référence fait que l'objet est de toutes façons modifiable.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    @jml94 : Voilà, je pense qu'il à le pour et le contre pour juger de ces actes

    Pour le reste je suis d'accord avec certains de tes arguments.
    Sauf que voilà, un accesseur qui se contente de renvoyer la variable, fait son job, on ne lui en demande pas plus.

    Il devient intéressant, selon moi, qd :
    - il confirme / valide / force le type
    - vérifie les types en entrée
    - propose des valeurs par défaut plus cohérente que null

    Après je trouve mon code plus consistant et sécurisant avec des getters/setters strict.
    Plutôt que de laisser le permissif de php prendre le pas et m'introduire des bugs à se taper le crane.

    Mais bon là, c'est un sujet qui pourrait être débattus 10 ans. non?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 174
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Salut,

    normalement, une classe possède tous ces attributs en private ==> principe d'encapsulation. Et n'expose que quelques informations au travers des accesseurs.

    Donc normalement ta question devrait être, quand est ce que j'arrête de faire des accesseurs pour laisser la propriété en accès public.

    Réponses : Qd tu as un coup de fainéantise, ou quand cela n'a pas d'impact sur le fonctionnement de ton instance.
    tout le reste devrait être contrôler en entrée / sortie, et donc en private / protected.
    Effectivement je crois que j'avais pris le problem à l'envers merci de cette vive précision, mais justement en général je suis plutot en mode protected et je passe en mode privé au coup par coup etc... j'aurai juste aimé en fait avoir une ou des petites reglesà suivre ou deux ou trois questions à poser avant de décider entre privé et protected?

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par lekunfry Voir le message
    Effectivement je crois que j'avais pris le problem à l'envers merci de cette vive précision, mais justement en général je suis plutot en mode protected et je passe en mode privé au coup par coup etc... j'aurai juste aimé en fait avoir une ou des petites reglesà suivre ou deux ou trois questions à poser avant de décider entre privé et protected?
    Il y a déjà la question basique : cette classe pourra-t-elle être dérivée et si oui, cet attribut devra-t-il être accessible ?

    En pratique, protected par défaut me convient très bien.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 174
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par jml94 Voir le message
    'faut voir...

    Les notions de portées des attributs ne sont importantes que dans le cadre d'un travail en équipe ou dans la réalisation de modules réutilisables. C'est le principe de la "boîte noire" qu'on utilise sans en connaitre le fonctionnement.

    Mais il s'agit juste d'un côté pratique et conventionnel, rien n'interdit de mettre tous ses attributs en accès publique. Voir les conventions de Perl ou par défaut il n'y a pas de variable privée (sauf utilisation de closures) et dont le modèle objet fonctionne très bien.

    Parce que franchement, les getters et les setters qui ne font que renvoyer la variable, c'est inutile.
    Sans compter les mauvaise utilisations ou on croit blinder un attribut objet en lecture en ne renvoyant qu'un getter public. Le passage par référence fait que l'objet est de toutes façons modifiable.
    C'est bien parce que je travaille en équipe en général que je me pose la question, parce que toutes les semaines j'ai des débats sur la porté des attributs d'un object avec mes collegues... je cherchais avoir ques regles utiles à suivre des questions à se poser pour déterminer dans un cas plus ou moins concret la portée d'un attribut voir d'une methode... parce qu'en voila uen autre paire de manche

  9. #9
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Sauf que voilà, un accesseur qui se contente de renvoyer la variable, fait son job, on ne lui en demande pas plus.

    Il devient intéressant, selon moi, qd :
    - il confirme / valide / force le type
    - vérifie les types en entrée
    - propose des valeurs par défaut plus cohérente que null
    Exactement !

    Mais bon là, c'est un sujet qui pourrait être débattus 10 ans. non?
    Exactement !

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 174
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Il y a déjà la question basique : cette classe pourra-t-elle être dérivée et si oui, cet attribut devra-t-il être accessible ?

    En pratique, protected par défaut me convient très bien.
    En fait la question que tu me pose me fait réaliser qu'on en peut pas déterminer de règles générales sur l'utilisation de ces access controls, en effet est ce que par exemple dans une classe Users (membre enregistrés) qui peut être étendue en une classe UsersPayant (membre payant), les attributs password et userLogin doit etre privée ou protected et de meme est ce que la méthode changePassword par exemple est private ou protected?

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Cela dépend si le fait de modifier la dite propriété influe sur le comportement de l'instance.

    Si j'ai une class A avec un libelle, à priori je peut laisser en public cela ne risque pas de flinguer l'objet.

    Par contre si j'ai un iterateur, la propriété qui indique la position courante, doit rester privée, puisque si elle est modifié depuis l'extérieur, cela risque de casser complètement le fonctionnement de mon itérateur.

    Fin bon après il y à surement des gens plus compétent qui pourront t'expliquer mieux que moi, mais pour cela il faudrait déplacer ton thread dans conception (? ou quelque part par là).
    Enfin, un forum plus généraliste sur la POO.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 174
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Cela dépend si le fait de modifier la dite propriété influe sur le comportement de l'instance.

    Si j'ai une class A avec un libelle, à priori je peut laisser en public cela ne risque pas de flinguer l'objet.

    Par contre si j'ai un iterateur, la propriété qui indique la position courante, doit rester privée, puisque si elle est modifié depuis l'extérieur, cela risque de casser complètement le fonctionnement de mon itérateur.

    Fin bon après il y à surement des gens plus compétent qui pourront t'expliquer mieux que moi, mais pour cela il faudrait déplacer ton thread dans conception (? ou quelque part par là).
    Enfin, un forum plus généraliste sur la POO.

    merci d'ailleurs c'est là que j'aurai du posté cette question, mais les réponses obtenues m'ont éclairé

Discussions similaires

  1. [POO] portée des propriétés
    Par loustalet dans le forum Langage
    Réponses: 19
    Dernier message: 16/10/2011, 23h06
  2. [POO] Héritage et visibilité des attributs : pas de "protected" en JS ?
    Par Hervé Saladin dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2007, 15h44
  3. recopie des propriétés d'un composant
    Par pitounette dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/02/2004, 10h40
  4. Comment cacher des propriétés dans un nouvel objet ?
    Par Pedro dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/10/2003, 18h53
  5. ouverture de la fenêtre des propriétés afffichage
    Par Mercilius dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 26/03/2003, 17h07

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