|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Inscription : mai 2007 Messages : 144 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() |
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?
__________________
Expertise OpenERP - programmation PHP/MySQL toujours à l'écoute du marché |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 4 ![]() |
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 |
|
|
00
|
|
|
#4 | ||||
|
Membre régulier
![]() Inscription : mai 2007 Messages : 144 ![]() |
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 :
Je l'ai donc remplacée par : Code :
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 |
||||
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Inscription : octobre 2005 Messages : 427 ![]() |
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.
__________________
Linio |
|
|
00
|
|
|
#6 |
|
Membre chevronné
![]() |
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.
__________________
Expertise OpenERP - programmation PHP/MySQL toujours à l'écoute du marché |
|
|
00
|
|
|
#7 |
|
Membre éclairé
![]() Inscription : octobre 2005 Messages : 427 ![]() |
C'est bizarre quand même.
Vous êtes sûr que c'est effectivement plus rapide, y'a un article là dessus?
__________________
Linio |
|
|
00
|
|
|
#8 |
|
Membre chevronné
![]() |
Un article sur quoi?
__________________
Expertise OpenERP - programmation PHP/MySQL toujours à l'écoute du marché |
|
|
00
|
|
|
#9 |
|
Membre éclairé
![]() Inscription : octobre 2005 Messages : 427 ![]() |
Sur la potentielle rapidité supérieur de la fonction __get pour faire un getter.
Parce que de ce que j'en vois c'est exactement pareil qu'un getter normal, il faut faire l'affectation à la main, donc je vois pas en quoi ça peut être plus rapide (mais bon je dois pas voir la grande image). Ca m'intéresse parce que pour mon projet j'accède à pas mal d'accesseurs, et j'aimerais savoir si je dois changer tout mon projet ou pas?
__________________
Linio |
|
|
00
|
|
|
#10 | |
|
Membre chevronné
![]() |
Citation:
__________________
Expertise OpenERP - programmation PHP/MySQL toujours à l'écoute du marché |
|
|
|
00
|
|
|
#11 | |||
|
Membre régulier
![]() Inscription : mai 2007 Messages : 144 ![]() |
Bon, j'ai fait un test avec une boucle exécutée un grand nombre de fois...
Citation:
Code :
Enfin, quant aux __get(), a priori, ils n'ont pas été conçu dans l'optique de récupérer des attributs, même si beaucoup de gens les utilisent de cette façon. |
|||
|
|
00
|
|
|
#12 |
|
Membre éclairé
![]() Inscription : octobre 2005 Messages : 427 ![]() |
C'était ce qu'il me semblait d'où ma question. Après je me doutais bien que l'accès direct était plus rapide que le passage par un getter, mais le getter n'est pas vraiment là pour l'optim mais pour la structure du code. Ca reste une question de choix après...
__________________
Linio |
|
|
00
|
|
|
#13 | ||
|
Membre chevronné
![]() |
Ouais ben moi je vais brûler mes suppositions car j'ai modifié le script de sorte à voir la différence entre getId() et __get() et le résultat est 16,xxx secondes pour getId() et 19,xxx secondes pour __get().
Voici le code modifié Code :
__________________
Expertise OpenERP - programmation PHP/MySQL toujours à l'écoute du marché |
||
|
|
00
|
|
|
#14 | ||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 4 ![]() |
Bien entendu c'est une question de choix, après même si le __get n'avait pas pour optique de servir de getter à la base il n'en reste pas moins que c'est une possibilité d'application et d'utilisation de cette méthode magique... pourquoi ne pas l'utiliser dans ce cas là ?
De toute façon je dirais qu'il est inévitable d'utiliser des get lorsque l'on ne veux pas que la variable de classe puisse être modifier n'importe comment à l'extérieur (voire carrément pas !). Il faut donc faire une différenciation entre les variables modifiable sans soucis et les autres... exemple : Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com