FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 2015
-
28 janv. 2007 à 21:14
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008
-
28 mai 2007 à 17:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 28 mai 2007 à 17:26
Source mise à jour ^^ (Si cela interesse encore quelqu'un XD)
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 1 févr. 2007 à 19:04
Exelente ton idée ! Je vais essayé d'adapter tout çà ;-)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 31 janv. 2007 à 19:06
Ce qui m'embète encore un peu, c'est le fait de faire passer les tags en paramètres.
Ce que j'aurais fait :
--> Une liste de tag (tag ouvert/tag fermé) pré-défini en statique qui consititurons la base du bbcode ( genre b,i,url etc...)
--> Une méthode permettant d'ajouter des tags. (ex :
public function AddTag($openTag, $closeTag) {
self::$TagsArray[] = array('open' => $openTag, 'close' => $closeTag);
}
Ce qui signifie que ta structure serait alors comme ca :
self::$TagsArray[]= array(
array('open' => ' ', 'close' => ' '),
array('open' => '', 'close' => ''),
array(....),
);
Par exemple, après c'est toi qui fait comme tu veux :)
Mais il te faut une méthode pour ajouter, supprimer et (optionnel) modifier un tag (quoi que.... :o)
Déja, en passant tes tags dans un tableau dans une propriété statique (ou non) dans ta classe, tu va voir que tu vas libérer beaucoup de code !
Et ca, je peux te le garantir :)
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 31 janv. 2007 à 13:38
Je n'ai jamais eu la prétention de dire que ma source était parfaite (loin de là :-) ) La source est en "initié" parce que j'ai cherché longuement pour faire ce script.
Je sais qu'il peut y avoir pleins d'amélioration et c'est pour celà que je poste ma source içi pour qu'on m'aide à comprendre mes erreurs.
Sinon pour l'histoire "While" VS "For" sur le site d'Anthomicro c'est le "While" qui l'emporte alors je l'utilise :-P
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 31 janv. 2007 à 13:11
for Vs while... long débat... lol... .. . ;o)
le for est préférable dans certain cas... cependant il me semble que le while/isset/préincrementation est plus rapide... c'est un maitre de conférence qui avait fait un sujet sur l'optimisation des scipt php... après d'une part ça date au moins de php 4.2 et d'autre part il faut voir le temps d'éxécution mais aussi la charge serveur notament au niveau de l'utilisation de la mémoire... quand au bench fait en php pur (time() & Co) il ne sont pas fiable pour moi... mieux vaut utiliser un module externe tel que xdebug... .. .
enfin bref là n'est pas le sujet... il y a d'autres optimisation possible avec cette source... enfin je dis ça... je n'ai pas regardé le code en détail cela reste donc un avis mais j'en reste persuadé... .. .
@ tchaOo°
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 30 janv. 2007 à 17:25
@Kankrelune : pour les benchs, j'en ai deja vu et l'auteur precise bien qu'il vallait mieux utiliser for() que while(). Reste a savoir qu'un benchmark, c'est pousse une entite a bout (l'auteur realise 1000 tours de boucles). Un element important quand meme, c'est d'eviter une erreur que je faisais souvent (en pensant que c'etait mieux) :
for ( $i=0; $i<count($Table); $i++ )
Sur que si on re-evalue a chaque tour de boucle, sa rame sec... Je crois meme que c'etait toi qui m'avait la reflexion sur un de mes codes ;-) Comme quoi j'ecoute bien ^^
Faut que je retrouve le lien et je le post apres.
@++
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 30 janv. 2007 à 17:08
"Pour moi une classe c'est une sorte de grande fonction (je suppose que je suis totalement dans le faux mais je ne demande qu'à progresser :-))"
un namespace regroupe les fonctions d'un même thème, une classe, c'est un nom commun, rarement un verbe... une classe parser, c'est pas bon... une classe html, ou chat, c'est correct :) chat::miauler(); fera miauler tout les chats, $minou->miauler(); fera miauler le chat nommé miauler... Bref, une classe, ça a plusieurs entrées et sorties, enfin, c'est mon point de vue... mais on a eu de nombreux débats sur ce sujet...
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 30 janv. 2007 à 11:31
@ audayls... isset() est un element de structure du langage, et non pas une fonction... tout comme echo, print, empty... il est très rapide à s'executer... .. .
@ jean84... il me semble que while/isset/preincrementation est plus rapide à s'executer que count/for... à bencher... .. .
@ tchaOo°
cs_chteuchteu
Messages postés4Date d'inscriptionjeudi 14 décembre 2006StatutMembreDernière intervention30 janvier 2007 30 janv. 2007 à 08:03
Ah, ok...
Pourrais-tu me donner, si tu connais, une adresse de script qui sait faire ça ??
Merci encore !
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 29 janv. 2007 à 23:36
Voilà une nouvelle mise à jour :-)
@malalam : C'est vrai qu'avec le nombre de boucle qu'utilise mon code le temps d'execution doit être horriblement long mais à la base, ce code ne devrait s'executer qu'une fois avant d'enregistrer le texte. Ceci dit ce n'est pas une raison pour ne pas l'amélioré :-P.
@Chteuchteu : Ce code n'affiche pas en temps réel le code BBCode mais elle le corrige : dans l'exemple qui est donner "["http://www.google.fr" /i/b/u/b[b]bonjour]/b" donnera après une vérification "["http://www.google.fr" [b]bonjour]".
@Jean84 : "Du high level, hein Malalam ;-)" J'ose même pas la modifier celle là lol.
"et faire en sorte que la classe fasse le tri d'elle meme" J'aurais bien voulu mais comment savoir quels sont les couples ? Puisque toutes les balises ne sont pas de la forme "" "" (dû l'utilisation des expressions régulières)
Sinon pour la gestion d'erreur je verrais celà demain ;-)
cs_jean84
Messages postés449Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 5 mars 2009 29 janv. 2007 à 21:32
"J'ai voulu corrigé le problème mais j'ai vite arrêté car je me suis cassé les dents sur ce script auquel je ne comprennais pas grand chose XD"
lol ... est encore, celle la est plutot simple ^^ Mon plus grand moment de solitude, je crois que c'est avec http://www.phpcs.com/codes/PHP5-COLLECTION-UTILISATEURS-ITERATEURS-PHP_40403.aspx. Du high level, hein Malalam ;-)
Pour les boucles, meme commentaires que Kankrelune avec un petit plus pour les boucles for(), plus rapide que les while(). Pour connaitre le nombre de case de ton tableau, utilise count().
Et pour l'incrementation, essaye de faire soit de la preincrementation, soit utilise $Var += _valeur_ . Sa permet de garder la meme forme tout le long du code en utilsiant differentes valeurs (question de gout evidement)
Pour la classe, si j'ai bien compris, il s'agit en fait d'un parser de bbcode ? Ne faudrait il pas a ce moment la eviter ce genre de commentaire :"La variable contenant les balises fermantes (qui doivent avoir les mêmes positions que les balises ouvrantes qui leurs correspondent)" et faire en sorte que la classe fasse le tri d'elle meme ?
Pour la gestion d'erreur, fait un tableau membre de ta classe et renvoi les valeurs de ce tableau (que tu auras rempli prealablement), cela te premettra de mettre fin a l'execution de la classe proprement et comme l'a souligne kankrelune, l'erreur sera gere par le code implementant ta classe.
@++
cs_chteuchteu
Messages postés4Date d'inscriptionjeudi 14 décembre 2006StatutMembreDernière intervention30 janvier 2007 29 janv. 2007 à 19:03
Salut !
Je n'ai pas bien compris ce script...
J'ai un forums PHPBB (http://universsims2.free.fr/forum/) Est-ce qu'il affiche en temps réel le code BB ???
Et si oui, comment l'intégrer dans mon forum ????
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 29 janv. 2007 à 19:02
@FhX : merci pour ton exemple je vais adapter ma classe sur ce fonctionnement :-).
@Kankrelune : Tu es sûr que "while(isset($monTableau[++$i]))" est plus rapide ? Car on utilise la fonction "isset" à chaque boucle alors que dans mon code on n'utilise qu'une seule fois la fonction "count" (Enfin si tu es certain, je vais changer çà il y a pas de problème c'étais juste pour ma culture personnelle ^^)
@Malalam : je vais revoir le code en prenant en compte vos remarques (d'ailleurs si vous avez d'autres remarques çà serait merveilleux ! lol)
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 29 janv. 2007 à 15:02
Ouep... c'est lourd tout ça... déja...
plutot que de faire...
$i = 0;
$j = count($monTableau);
while ($i < $j)
{
// triatement sur $monTableau[$i]
$i++;
}
Sur un tableau indexé numériquement fais...
$i = -1;
while(isset($monTableau[++$i]))
{
// triatement sur $monTableau[$i]
}
D'ailleur d'une manière générale utilise la preincrementation... fais des comparaisons typées aussi quand tu peux... tu gagnera un peu en perf...
Tu ne devrais pas utiliser les die dans ta classe... son rôle n'est pas de gérer les erreurs... elle doit les stocker et tu doit gérer en dehor de ta classe l'action à faire en cas d'erreur... .. .
Après je pense qu'il y a moyen de simplifier le tout mais je n'ais que survolé le code... .. .
@ tchaOo°
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 29 janv. 2007 à 08:13
Hello,
et puis mon code a 2 ans d'âge, c'était pas forcément une bonne idée de le suivre à la lettre ;-)
Je l'avais oublié ce code d'ailleurs. L'idée était bonne, mais la réalisation, moins.
Je testerai ton code (sans prendre en compte les remarques justifiées de FhX, je veux juste voir le comportement).
Juste, mon code était nettement moins lourd, mais son traitement était pourtant très long...tu as fait des bench sur le tien ? C'est un des gros problèmes potentiels : le temps pour traiter ne serait-ce qu'un paragraphe. Faut faire gaffe à ça.
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 28 janv. 2007 à 23:18
L'instanciation se fait via "new"
Quand tu fais : "$instance = new object();" , tu instancies la classe "object" dans $instance.
Une classe n'est pas une grande fonction. C'est un objet qui possède des propriétés et des méthodes.
Ex : Une classe "chaise".
Cette classe peut posséder plusieurs pieds, donc elle a une propriété "pieds".
On peut aussi déplacer la chaise, donc on va lui donner des coordonnées X et Y ainsi que le moyen de la déplacer.
Voici ce que donne mon exemple en code :
(je le fais en PHP5)
class chaise {
public $pieds = 0;
public $x = 0;
public $y = 0;
public function __construct($pieds) {
$this->pieds = $pieds;
}
public function BougeVers($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function OuJeSuis() {
return 'Je suis à la position '.$this->x.','.$this->y.'.';
}
}
$ma_chaise_a_trois_pieds = new chaise(3);
$ma_chaise_a_quatre_pieds = new chaise(4);
// affichera :
/*
* Je suis à la position 0,0.
*
* Je suis à la position 10,5.
*/
Voila comment fonctionne un objet. Utilise cet exemple pour ta propre classe :)
audayls
Messages postés373Date d'inscriptionsamedi 9 juillet 2005StatutMembreDernière intervention11 août 2008 28 janv. 2007 à 21:33
Salut FhX,
Je suivis le code de Malalam mais si tu trouves que je devrais l'orienté objet, je suis pas contre mais je ne sais pas comment faire :-P Pour moi une classe c'est une sorte de grande fonction (je suppose que je suis totalement dans le faux mais je ne demande qu'à progresser :-))
"Instancier un objet pour pas s'en servir, c'est la première fois que je vois ca :)" Oui je sais c'est bien moi je fais tout de travers (que veux-tu c'est un don naturel XD)
Pour "Instancier" ma classe il suffirait que je la modifie pour qu'elle fonctionne de la façon que tu as décrite ?
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 28 janv. 2007 à 21:14
"Aucune idée d'amélioration pour le moment ^^" "
Si, l'orientée objet.
Instancier un objet pour pas s'en servir, c'est la première fois que je vois ca :)
Tu aurais du faire :
$string = new ta_classe('la chaine en bbcode a faire passer');
$string->correct_tags();
echo $string->tohtml();
Bref, ce que tu a fais ne ressemble à rien d'une classe.
C'est ce point la que tu dois revoir.
28 mai 2007 à 17:26
1 févr. 2007 à 19:04
31 janv. 2007 à 19:06
Ce que j'aurais fait :
--> Une liste de tag (tag ouvert/tag fermé) pré-défini en statique qui consititurons la base du bbcode ( genre b,i,url etc...)
--> Une méthode permettant d'ajouter des tags. (ex :
public function AddTag($openTag, $closeTag) {
self::$TagsArray[] = array('open' => $openTag, 'close' => $closeTag);
}
Ce qui signifie que ta structure serait alors comme ca :
self::$TagsArray[]= array(
array('open' => ' ', 'close' => ' '),
array('open' => '', 'close' => ''),
array(....),
);
Par exemple, après c'est toi qui fait comme tu veux :)
Mais il te faut une méthode pour ajouter, supprimer et (optionnel) modifier un tag (quoi que.... :o)
Déja, en passant tes tags dans un tableau dans une propriété statique (ou non) dans ta classe, tu va voir que tu vas libérer beaucoup de code !
Et ca, je peux te le garantir :)
31 janv. 2007 à 13:38
Je sais qu'il peut y avoir pleins d'amélioration et c'est pour celà que je poste ma source içi pour qu'on m'aide à comprendre mes erreurs.
Sinon pour l'histoire "While" VS "For" sur le site d'Anthomicro c'est le "While" qui l'emporte alors je l'utilise :-P
31 janv. 2007 à 13:11
le for est préférable dans certain cas... cependant il me semble que le while/isset/préincrementation est plus rapide... c'est un maitre de conférence qui avait fait un sujet sur l'optimisation des scipt php... après d'une part ça date au moins de php 4.2 et d'autre part il faut voir le temps d'éxécution mais aussi la charge serveur notament au niveau de l'utilisation de la mémoire... quand au bench fait en php pur (time() & Co) il ne sont pas fiable pour moi... mieux vaut utiliser un module externe tel que xdebug... .. .
enfin bref là n'est pas le sujet... il y a d'autres optimisation possible avec cette source... enfin je dis ça... je n'ai pas regardé le code en détail cela reste donc un avis mais j'en reste persuadé... .. .
@ tchaOo°
30 janv. 2007 à 17:25
for ( $i=0; $i<count($Table); $i++ )
Sur que si on re-evalue a chaque tour de boucle, sa rame sec... Je crois meme que c'etait toi qui m'avait la reflexion sur un de mes codes ;-) Comme quoi j'ecoute bien ^^
Faut que je retrouve le lien et je le post apres.
@++
30 janv. 2007 à 17:08
un namespace regroupe les fonctions d'un même thème, une classe, c'est un nom commun, rarement un verbe... une classe parser, c'est pas bon... une classe html, ou chat, c'est correct :) chat::miauler(); fera miauler tout les chats, $minou->miauler(); fera miauler le chat nommé miauler... Bref, une classe, ça a plusieurs entrées et sorties, enfin, c'est mon point de vue... mais on a eu de nombreux débats sur ce sujet...
30 janv. 2007 à 11:31
@ jean84... il me semble que while/isset/preincrementation est plus rapide à s'executer que count/for... à bencher... .. .
@ tchaOo°
30 janv. 2007 à 08:03
Pourrais-tu me donner, si tu connais, une adresse de script qui sait faire ça ??
Merci encore !
29 janv. 2007 à 23:36
@malalam : C'est vrai qu'avec le nombre de boucle qu'utilise mon code le temps d'execution doit être horriblement long mais à la base, ce code ne devrait s'executer qu'une fois avant d'enregistrer le texte. Ceci dit ce n'est pas une raison pour ne pas l'amélioré :-P.
@Chteuchteu : Ce code n'affiche pas en temps réel le code BBCode mais elle le corrige : dans l'exemple qui est donner "["http://www.google.fr" /i/b/u/b[b]bonjour]/b" donnera après une vérification "["http://www.google.fr" [b]bonjour]".
@Jean84 : "Du high level, hein Malalam ;-)" J'ose même pas la modifier celle là lol.
"et faire en sorte que la classe fasse le tri d'elle meme" J'aurais bien voulu mais comment savoir quels sont les couples ? Puisque toutes les balises ne sont pas de la forme "" "" (dû l'utilisation des expressions régulières)
Sinon pour la gestion d'erreur je verrais celà demain ;-)
29 janv. 2007 à 21:32
lol ... est encore, celle la est plutot simple ^^ Mon plus grand moment de solitude, je crois que c'est avec http://www.phpcs.com/codes/PHP5-COLLECTION-UTILISATEURS-ITERATEURS-PHP_40403.aspx.
Du high level, hein Malalam ;-)
Pour les boucles, meme commentaires que Kankrelune avec un petit plus pour les boucles for(), plus rapide que les while(). Pour connaitre le nombre de case de ton tableau, utilise count().
Et pour l'incrementation, essaye de faire soit de la preincrementation, soit utilise $Var += _valeur_ . Sa permet de garder la meme forme tout le long du code en utilsiant differentes valeurs (question de gout evidement)
Pour la classe, si j'ai bien compris, il s'agit en fait d'un parser de bbcode ? Ne faudrait il pas a ce moment la eviter ce genre de commentaire :"La variable contenant les balises fermantes (qui doivent avoir les mêmes positions que les balises ouvrantes qui leurs correspondent)" et faire en sorte que la classe fasse le tri d'elle meme ?
Pour la gestion d'erreur, fait un tableau membre de ta classe et renvoi les valeurs de ce tableau (que tu auras rempli prealablement), cela te premettra de mettre fin a l'execution de la classe proprement et comme l'a souligne kankrelune, l'erreur sera gere par le code implementant ta classe.
@++
29 janv. 2007 à 19:03
Je n'ai pas bien compris ce script...
J'ai un forums PHPBB (http://universsims2.free.fr/forum/)
Est-ce qu'il affiche en temps réel le code BB ???
Et si oui, comment l'intégrer dans mon forum ????
29 janv. 2007 à 19:02
@Kankrelune : Tu es sûr que "while(isset($monTableau[++$i]))" est plus rapide ? Car on utilise la fonction "isset" à chaque boucle alors que dans mon code on n'utilise qu'une seule fois la fonction "count" (Enfin si tu es certain, je vais changer çà il y a pas de problème c'étais juste pour ma culture personnelle ^^)
@Malalam : je vais revoir le code en prenant en compte vos remarques (d'ailleurs si vous avez d'autres remarques çà serait merveilleux ! lol)
29 janv. 2007 à 15:02
plutot que de faire...
$i = 0;
$j = count($monTableau);
while ($i < $j)
{
// triatement sur $monTableau[$i]
$i++;
}
Sur un tableau indexé numériquement fais...
$i = -1;
while(isset($monTableau[++$i]))
{
// triatement sur $monTableau[$i]
}
D'ailleur d'une manière générale utilise la preincrementation... fais des comparaisons typées aussi quand tu peux... tu gagnera un peu en perf...
Tu ne devrais pas utiliser les die dans ta classe... son rôle n'est pas de gérer les erreurs... elle doit les stocker et tu doit gérer en dehor de ta classe l'action à faire en cas d'erreur... .. .
Après je pense qu'il y a moyen de simplifier le tout mais je n'ais que survolé le code... .. .
@ tchaOo°
29 janv. 2007 à 08:13
et puis mon code a 2 ans d'âge, c'était pas forcément une bonne idée de le suivre à la lettre ;-)
Je l'avais oublié ce code d'ailleurs. L'idée était bonne, mais la réalisation, moins.
Je testerai ton code (sans prendre en compte les remarques justifiées de FhX, je veux juste voir le comportement).
Juste, mon code était nettement moins lourd, mais son traitement était pourtant très long...tu as fait des bench sur le tien ? C'est un des gros problèmes potentiels : le temps pour traiter ne serait-ce qu'un paragraphe. Faut faire gaffe à ça.
28 janv. 2007 à 23:18
Quand tu fais : "$instance = new object();" , tu instancies la classe "object" dans $instance.
Une classe n'est pas une grande fonction. C'est un objet qui possède des propriétés et des méthodes.
Ex : Une classe "chaise".
Cette classe peut posséder plusieurs pieds, donc elle a une propriété "pieds".
On peut aussi déplacer la chaise, donc on va lui donner des coordonnées X et Y ainsi que le moyen de la déplacer.
Voici ce que donne mon exemple en code :
(je le fais en PHP5)
class chaise {
public $pieds = 0;
public $x = 0;
public $y = 0;
public function __construct($pieds) {
$this->pieds = $pieds;
}
public function BougeVers($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function OuJeSuis() {
return 'Je suis à la position '.$this->x.','.$this->y.'.';
}
}
$ma_chaise_a_trois_pieds = new chaise(3);
$ma_chaise_a_quatre_pieds = new chaise(4);
$ma_chaise_a_quatre_pieds->BougeVers(10,5);
echo $ma_chaise_a_trois_pieds->OuJeSuis();
echo '
';
echo $ma_chaise_a_quatre_pieds->OuJeSuis();
// affichera :
/*
* Je suis à la position 0,0.
*
* Je suis à la position 10,5.
*/
Voila comment fonctionne un objet. Utilise cet exemple pour ta propre classe :)
28 janv. 2007 à 21:33
Je suivis le code de Malalam mais si tu trouves que je devrais l'orienté objet, je suis pas contre mais je ne sais pas comment faire :-P Pour moi une classe c'est une sorte de grande fonction (je suppose que je suis totalement dans le faux mais je ne demande qu'à progresser :-))
"Instancier un objet pour pas s'en servir, c'est la première fois que je vois ca :)" Oui je sais c'est bien moi je fais tout de travers (que veux-tu c'est un don naturel XD)
Pour "Instancier" ma classe il suffirait que je la modifie pour qu'elle fonctionne de la façon que tu as décrite ?
28 janv. 2007 à 21:14
Si, l'orientée objet.
Instancier un objet pour pas s'en servir, c'est la première fois que je vois ca :)
Tu aurais du faire :
$string = new ta_classe('la chaine en bbcode a faire passer');
$string->correct_tags();
echo $string->tohtml();
Bref, ce que tu a fais ne ressemble à rien d'une classe.
C'est ce point la que tu dois revoir.