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] et accesseurs


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 144
    Par défaut [POO] et accesseurs
    Bonjour à tous,

    Je développe actuellement une application web, en utilisant la POO de PHP.

    Seulement voilà, certaines de mes pages étaient relativement longues à générer, et je me suis posé la question de savoir pourquoi.

    En fait, j'ai écrit mes classes avec des accesseurs (getters/setters) pour accéder aux attributs (déclarés comme privés) de mes objets... Très pratique et assure une certaine cohérence de l'ensemble... Seulement voilà, j'ai remarqué qu'en terme de performance, ce n’était pas terrible...

    En effet, en accédant directement à mes attributs (déclarés donc comme public et sans passer par des accesseurs), les performances de mon application étaient grandement améliorées !

    Bref... Sans doute que je m'y prends mal dans ma façon de programmer... Quand est-ce qu'il est selon vous nécessaire de déclarer un attribut comme publique, privé, d'ajouter des accesseurs, etc. ?

    Merci beaucoup pour vos conseils !
    Evocatii

  2. #2
    Membre émérite
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 910
    Par défaut à suivre avec attention
    Voilà un post qui j'espère va générer beaucoup de messages et que je vais suivre avec attention.

    J'ai une façon très "cartésienne" d'utiliser les types d'accès. Si un paramètre (ou une méthode) ne doit être accessible ni par une classe qui en hérite ni par un script qui appelle la classe, j'utilise private. Etc. Par contre j'utilise protected vraiment si le paramètre (ou la méthode) doit absolument être hérité par une autre classe et public si la fonction est destinée à être utilisée dans un script. Sinon c'est protected le cas échéant et private si possible.

    De mon côté même dans des classes conséquentes (plusieurs dizaines de méthodes) ou des projet d'une certaines envergure (plusieurs dizaines de milliers de lignes de code) programmés en POO, je n'ai remarqué aucun ralentissement entre des variables (méthodes) private et ces mêmes variables passées en proctected ou en public.

    Pourrais-tu poster ton code (ou une partie) afin qu'on analyse ce que tu as fait?

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 4
    Par défaut
    Ayant l'habitude de prog en POO je n'ai jamais eu de problème de ralentissement dûe aux accesseur mais il est vrai que ceux si posent problème lorsqu'ils sont trop nombreux...

    Je programme à peu prêt comme david, même s'il est vrai que j'ai une tendance aigu vers le private...

    As-tu essayer d'utiliser les méthode magique __set et __get pour voir si cela accélérer ou non ? Cela serait déjà une première chose à tester il me semble

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 144
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses.

    Pour vous montrer le code qui pose problème, je vous fais un exemple.

    Cette boucle était appelée un certains nombres de fois et j'ai constaté un ralentissement (j'entends par rapport aux autres pages de mon site qui se chargeaient nettement plus rapidement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ($object->getX()->getId() == 'A' || $object->getY()->getId() == 'B') {
      $this->attribut = 'VALUEXXX';
    } else if ($object->getX()->getId() == 'C' || $object->getY()->getId() == 'D') {
      $this->attribut = 'VALUEYYY';
    } else if () {
      // Etc.
    }
    (Ma page se chargeait sur environ 0.3 secondes.)

    Je l'ai donc remplacée par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ($object->x->id == 'A' || $object->y->id == 'B') {
      $this->attribut = 'VALUEXXX';
    } else if ($object->x->id == 'C' || $object->y->id == 'D') {
      $this->attribut = 'VALUEYYY';
    } else if () {
      // Etc.
    }
    (Ma page se chargeait sur environ 0.08 secondes.)

    Mon script gagnait donc en rapidité si je n'utilisais pas les accesseurs ! Plus j'augmente le nombre de fois que cette boucle est appelée, plus la différence est significative entre les deux codes.

    Sinon, mentiss, non je n'ai pas essayé avec les __set et __get.

    Enfin, j'ai appris à programmer en Java (façon Java Beans), et donc j'ai toujours utilisé des accesseurs. Mais je me demande finalement si j'ai vraiment compris le concept des accesseurs, car en y réfléchissant, je ne vois pas non plus l'intérêt de déclarer du "private" partout.

    Alors si quelqu'un qui a compris la théorie pourrait ré-expliquer le concept, ça serait vraiment sympa.

    P.S : Deux articles intéressants sur le sujet (en anglais) :

    http://www.darronschall.com/weblog/archives/000149.cfm
    http://www.javaworld.com/javaworld/j...5-toolbox.html

  5. #5
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Difficile de juger sur des temps aussi petits.

    Faudrait faire boucler beaucoup tes instructions et voir les différences effectives.

    Moi personnellement sur mon appli PHP je me pose beaucoup la question de l'optimisation, mais je dois avouer que j'ai jamais eu dans l'idée de faire des variables publiques partout et d'y accéder à droite à gauche, vu qu'on est plusieurs sur le projet.

    De plus si vraiment y'avait des lacunes de perf, je pense que ça se saurait non?

    A l'intérieur de l'objet en revanche effectivement je fais un $this->blabla plutôt que le getter (mais bon ça c'est logique).

    Pour en revenir aux accesseurs, en théorie ils sont tous publics. Des méthodes privées/publiques/protégées sont très utiles dans le cadre d'un projet collaboratif et permet de limiter le champ d'actions des autres développeurs, typiquement, bon ça c'est privé, je peux pas y toucher, donc je fais avec une autre jolie méthode déjà implémentée.

  6. #6
    Membre émérite
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 910
    Par défaut voici la raison
    Citation Envoyé par Evocatii Voir le message
    Sinon, mentiss, non je n'ai pas essayé avec les __set et __get.
    La lenteur doit sûrement venir du fait que tu utilises des getters/setters programmés en PHP alors que les méthode magiques PHP __get() et __set() sont programmés en C car intégrés au moteur PHP, donc aucun problème de ralentissement.

Discussions similaires

  1. [Débutant] Langage POO - destructeur - Accesseur - surcharge d'opérateur
    Par garnier-s dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/03/2015, 20h57
  2. [POO] C'est quoi une classe en claire...???
    Par Spack dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 26/01/2009, 15h53
  3. [POO] Syntaxe pour des accesseurs
    Par delire8 dans le forum C++
    Réponses: 8
    Dernier message: 23/11/2008, 15h09
  4. [langage] Pb POO perl
    Par loothoof dans le forum Langage
    Réponses: 4
    Dernier message: 26/05/2004, 12h08
  5. lier un cube à un objet (POO)
    Par Hypnos dans le forum OpenGL
    Réponses: 12
    Dernier message: 26/08/2003, 21h46

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