PHP EVENTS MANAGER

jdalton42 Messages postés 200 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 19 août 2009 - 25 août 2007 à 03:19
ornythorink Messages postés 8 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 28 août 2007 - 28 août 2007 à 16:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/43881-php-events-manager

ornythorink Messages postés 8 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 28 août 2007
28 août 2007 à 16:24
le commentaire va être trivail mais enfin des commentaires et réactions constructives. Dans un sens je comprend l'erreur de compréhension du pattern Observer j'ai fais la même ;)
Bon courage
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 août 2007 à 17:22
Un état n'est pas forcément un entier. Un état c'est ce qu'est devenu le contexte après un évènement donné. C'est bien à ça que tu veux réagir ? A un évènement. Quand tu dis "n'importe où, n'importe quand, et sans raison" ce n'est pas de la programmation évènementielle : cela revient à...appeler une fonction. Et pour ça, pas besoin d'une classe du tout. Ce n'est pas n'improet où, ni n'importe quand, et certainement pas sans raison, sinon tu ne lierais pas tes évènements et tes crochets.
Si tu observes attentivement le...observer..Pattern, tu verras que c'est très exactement ce qu'il fait aussi.
Pourquoi les objets? Parce que cela remplace avantageusement tes fonctions : tu peux alors effectuer des actions bien plus complexes.

Tu n'as pas modifié tes comparaisons : tu devrais les typer. Outre que c'est plus rapide (mais bon, vu l'ordre de grandeur...) c'est surtout plus strict et correct. true et 1 sont identiques. Alors que === true est très différent de === 1. Cela peut avoir son importance, et dans ce sens, il est mieux de prendre l'habitude de coder ainsi.
Coté code encore, vu comment tu as codé ta classe et comment tu dois l'utiliser, tu aurais dû la rendre entièrement statique : toutes les propriétés, et toutes les méthodes. Il est totalement inutile d'instancier ta classe pour l'utiliser. A dire vrai, puisque tu veux ne pas l'utiliser dans un contexte très orienté POO, c'est même bien mieux de ne pas l'instancier.
psykocrash Messages postés 240 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 17 mars 2009
25 août 2007 à 16:40
Ce que t'en dis m'intéresse, sinon j'aurais pas posté mon code ici ;)

Reprenons :

Les évènements ici ne dépendent pas d'un changement d'état comme le voudrait l'Observer design pattern, un évènement peux intervenir n'importe quand, n'importe où, et sans raison. Dans ces conditions, difficile d'associer un sujet, ainsi que ses états, à un observateur précis. Moi je veux bien utiliser ce design pattern, mais faudra m'expliquer comment faire dans cette configuration...

Sinon tu as parlé à plusieurs reprises de passer en paramètre des objets plutôt que des fonctions. Vu que le but est d'appeler des fonctions, je comprend pas pourquoi utiliser des objets ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 août 2007 à 16:21
L'observer pattern fait très exactement ce que ta classe fait. En implémentant une norme histoire de s'y retrouver facilement. Tu lies un déclencheur à un évènement. Sauf que l'avantage est de pouvoir :
- utiliser un objet complexe comme "hook"
- de déclencher plusieurs actions en cascade : ce n'est pas tout à fait ce que tu as compris. Un évènement entraîne X actions. C'est possible avec ta classe mais pas simplement, et tu n'as aucune interaction possible avec ton environnement. Réagir à un changement est intéressant sans que tu aies à appeler MANUELLEMENT ta fonction. Ta classe ne fonctionne pas comme un trigger. Ou du moins, encore une fois, pas facilement.

Pour la SPL, à jouer avec les itérateurs. Ton objet gagnerait à étendre ArrayIterator, si tu veux que je sois précis. Ou alors, une autre solution est celle que j'ai utilisée : ton event_list doit être un SPLObjectStorage, ce qui t'évite de définir tes méthodes create_event() et compagnie.

Mais bon..ce que j'en dis, moi :-)
psykocrash Messages postés 240 Date d'inscription vendredi 14 juin 2002 Statut Membre Dernière intervention 17 mars 2009
25 août 2007 à 13:36
Merci pour tes remarques.

Je me suis renseigné à propos du design pattern Observer, et ce n'est pas du tout ce que je cherche à faire. De ce que j'ai compris, il y a les sujets, et les observateurs, mais tout ça se passe à l'intérieur d'un objet. Mon objectif avec mon application/méthode c'est de pouvoir placer des évènements partout dans mon code (dans la partie "globale"), pas de gérer des évènements au sein d'un objet.

Pour la SPL, j'ai jeté un oeil sur php.net, mais je t'avoue ne pas voir en quoi elle m'aiderait.

Pour le fait d'être limité à une seule fonction, si j'ai bien compris ce que tu voulais dire, et bien non. Pour chaque évènement, tu peux placer autant de hooks que tu le souhaites (hook ici = fonction à appeler). D'ailleurs j'ai une petite idée d'amélioration à ce sujet que je vais implémenter dans la prochaine version.

Pour les exceptions, tu as raison, je vais faire une mise à jour tout de suite.

D'autres remarques/suggestions ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
25 août 2007 à 09:23
Hello,

ce n'est pas franchement une application, c'est une méthode de programmation. Tu devrais mater le code que j'ai écrit il y a peu :
http://www.phpcs.com/codes/PHP5-OBSERVER-DESIGN-PATTERN_43478.aspx

Et t'en rapprocher, parce que ce design pattern est plus efficace que ton code actuel : tu ne gère qu'une fonction quand on peut gérer des objets entiers. Tu ne profites pas de la pleine puissance de PHP5 (et de la SPL notamment qui propose DEJA tout ce qu'il faut pour gérer les évènements, comme le montre mon code). Tu ne peux pas déclencher d'évènements en cascade facilement, avec ce code : tu es limité à UN évènement sauf à tous les appeler explicitement.
Côté programmmation, vu que tu codes en PHP5, tu devrais faire des comparaisons strictes.
Si la fonction à délencher n'existe pas, tu devrais lever une exception, et pas simplement faire un return false.
jdalton42 Messages postés 200 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 19 août 2009
25 août 2007 à 03:19
salut

t'a pas un lien qui donne les différences entre php4 et php5 stp ?
Rejoignez-nous