JeuWeb - Crée ton jeu par navigateur
optimisation code, loader de function() ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : optimisation code, loader de function() ? (/showthread.php?tid=4853)

Pages : 1 2


optimisation code, loader de function() ? - php_addict - 31-05-2010

bonjour

je bosse comme un ouf sur mon script de resolution d'action (construire, cassage de figure, recrutement, etc...)

j'ai une boucle qui tourne sur un tableau:

exemple bête:

$action ['id_action']['type_d'action']
$action [1]['a'] --> construire
$action [2]['b'] --> on se tape dessus
$action [3]['a'] --> construire
$action [4]['c'] --> recrutement


Code :
foreach($action as $key=>$value)
{
if($value=='a') {construire();}
if($value=='b') {on_tape();}
if($value=='c') {recrut();}
}

je comptais mettre mes functions specifiques(construire() on_tape() recrut() etc ... dans des fichiers externes puis les inclure (include ou require) pourquoi? car mon script de resolution d'action fait deja plus de 1000 lignes de code (je sais c'est peu)

donc avant de faire tourner ma boucle il faut au prealable savoir quelles functions vont être incluses

j'en viens à ma question: comment faire autrement que:

Code :
foreach($action as $key=>$value)
{
// je determine toutes les function à inclure avec require();
}
// je charge mes include

PUIS

Code :
foreach($action as $key=>$value)
{
if($value=='a') {construire();}
if($value=='b') {on_tape();}
if($value=='c') {recrut();}
}

donc comment éviter 2 boucles: l'une pour determiner quels fichiers externes ont besoins d'être inclus et l'autre pour resoudre les actions...


désolé si cela n'est pas très clair:$


RE: optimisation code, loader de function() ? - Sephi-Chan - 31-05-2010

Tu peux aussi inclure tous tes fichiers, c'est pas ça qui va ralentir l'exécution. Smile
Je discutais de ça avec Anthor cet après-midi : il m'indiquait que chaque page rendue par un site tournant avec Zend Framework incluait plus de 200 fichiers !?


Sephi-Chan


RE: optimisation code, loader de function() ? - Anthor - 31-05-2010

Sinon y'a l'autoload, mais forcement ça implique de la POO et d'être à jour sur PHP, mais dans ce cas, la question ne se poserait même pas !


RE: optimisation code, loader de function() ? - Kihmé - 31-05-2010

je te conseillerais de passer à la POO, ton code en serait peut être moins complexe et des includes moins prise de tête, ou pas...


RE: optimisation code, loader de function() ? - php_addict - 31-05-2010

(31-05-2010, 04:34 PM)Sephi-Chan a écrit : Je discutais de ça avec Anthor cet après-midi : il m'indiquait que chaque page rendue par un site tournant avec Zend Framework incluait plus de 200 fichiers !?

ah ok, j'ai de la marge :-)))) donc pas besoin de me prendre le choux alors...

merci pour vos reponses rapides :-)


RE: optimisation code, loader de function() ? - Shudrum - 31-05-2010

C'est vrai que la POO réglerait tous tes problèmes.

Derrière ca, je suis entièrement d'accord avec Sephi, j'ai bossé sur un gros intra. pour Total, or, à la fin j'ai remarqué qu'on incluait plus d'une centaine de fichier, et franchement, la perte était négligeable.

C'est l'exécution du script qui prend du temps, pas la lecture.


RE: optimisation code, loader de function() ? - Anthor - 31-05-2010

Je rajouterais que 1000 lignes, c'est vraiment rien du tout !

Et si vraiment vous voulez optimiser, on ne fais pas comme ça. On installe APC. ^^


RE: optimisation code, loader de function() ? - Argorate - 31-05-2010

En parlant d'optimisation :p

3 if diffèrent qui se suivent sur la même variable... pas logique => switch/elseif/else?
(oui oui je sais c'est des optimisations qui ne font rien gagner tout ça... Mais c'est surtout pour la logique de la chose là)


Sinon si 1000 lignes c'est pas "beaucoup", c'est combien "beaucoup"?


RE: optimisation code, loader de function() ? - christouphe - 31-05-2010

Personnellement je considère comme "beaucoup de ligne":
  • 500 lignes pour une fonction/méthode,
  • 1500 lignes pour un script, car ça commence à faire. Mais si on fait de la POO, le code est fragmenté, le pire que j'ai pu voir c'est 3000 lignes pour une classe.



RE: optimisation code, loader de function() ? - Sephi-Chan - 31-05-2010

Une méthode de 500 lignes, c'est 10 fois trop à mon sens. Quand tu arrives au bout, tu ne sais plus ce qui s'est fait au début. Le maximum que je m'autorise, c'est 50 lignes, et c'est vraiment réservé aux méthodes les plus longues, typiquement actions des contrôleurs.

Mon crédo, c'est que le rôle d'une méthode doit pouvoir être résumé en 2 lignes.

Et tout ça dépend en plus beaucoup du langage utilisé (en Java ou en Dotnet, on aura tendance à avoir plus de ligne qu'en Ruby, Python ou même en PHP) !

Voici par exemple la méthode has_enough_resources_to_repair? de ma classe User.


def has_enough_resources_to_repair?(building)
update_resources!

energy_count >= building.repair_cost
end


public function hasEnoughResourcesToRepair($building){
$this->updateResources();

return $this->getEnergyCount() >= $building->getRepairCost();
}


Et la méthode repair de la classe Building.


def repair
return false unless user.has_enough_resources_to_repair?(self)

Building.transaction do
user.energy_count -= repair_cost
user.save!

self.hit_points = maximum_hit_points
save!
end

true
end


public function repair(){
if(!$this->getUser()->hasEnoughResourcesToRepair($this) return false;

$this->getDb()->startTransaction(); // Une ligne pour ouvrir la transaction.

$this->getUser()->decreaseEnergyCount($this->getRepairCost());
$this->getUser()->save();

$this->setHitPoints($this->getMaximumHitPoint());
$this->save();

$this->getDb()->stopTransaction(); // Une ligne pour fermer la transaction.

return true;
}

Déjà que cette dizaine de ligne n'est pas forcément agréable à lire, imagine si tu dois scroller !

Je pense que quand on fait de l'objet, il ne faut pas hésiter à faire plein de petits méthodes. Cf. la classe Building de Spherium. Ça ne coûte rien et ça clarifie le code en plus d'éviter les duplications inutiles.


Sephi-Chan