JeuWeb - Crée ton jeu par navigateur
[Résolu] Retours multiples de fonction : tableau, tableau associatif, ou objet ? - 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 : [Résolu] Retours multiples de fonction : tableau, tableau associatif, ou objet ? (/showthread.php?tid=5320)

Pages : 1 2 3 4 5


[Résolu] Retours multiples de fonction : tableau, tableau associatif, ou objet ? - Ter Rowan - 25-03-2011

Coucou

j'ai une hésitation sur la solution à mettre en place pour des retours de fonction (de méthode à vrai dire)

je suis dans un système de calcul d'action, pour ce faire je vérifie d'abord que toutes les conditions sont réunies pour réaliser l'action, on supposera - en simplifiant - que les conditions correspondent à des objets de classes différentes (une classe pour les compétences, une classe pour les outils, etc...)
Toutes ces classes définissent une méthode qui retournait jusqu'à présent deux informations, un bonus malus pour connaitre la difficulté de l'action, et un niveau de consommation (si jamais l'action se fait j'utilise l'information, mais il faut d'abord que je vérifie toutes les conditions, je ne peux pas consommer tout de suite lors du traitement de la condition)

jusque là ca allait, deux infos, j'utilisais un pauvre tableau du type array ( 0 => $malus, 1 => $conso)
mais voilà, je m'aperçois que pour certaines conditions que je suis en train de coder, j'ai besoin d'une troisième info, et qui sait d'une 4ème, etc...

du coup pas très lisible $retour[0], $retour[1], $retour[2], ...

donc voilà, pour vous quelle est la meilleure solution ? je vois :

le define pour exploiter le tableau
$retour[ PENALITE ]

le tableau associatif
$retour[ "PENALITE" ]

la structure
$retour->penalite

En première intention, je pencherais pour le tableau associatif, mais y a peut être plus propre
celui que j'aime le moins est la structure : d'une part c'est plus de code lors de la construction de la variable (pas juste un simple return array( ....) ), d'autres part ça me gène d'utiliser des objets pour quelque chose qui n'en est pas vraiment un (pas de méthode, ni rien..)

qu'en pensez vous ?


RE: retours multiples de fonction : tableau, associatif, ou objet - niahoo - 25-03-2011

Utiliser des objets sans méthodes ne me gêne pas. De plus, qui sait si à force d'utiliser un objet de type réponse d'action tu n'auras pas intérêt à y ajouter des méthodes par la suite.

Mais la méthode que je préfère est plus simple :

si ta fonction retourne array($malus, $bonus, $autre) alors tu peux récupérer les infos directement dans des variables:

list ($malus, $bonus, $autre) = ma_fonction();

Mais c'est plus pratique avec un interface standardisée, si chaque fonction retourne différents nombres d'entrées dans le tableau, tu t'y perds rapidement.

note que si ta fonction retourne 3 entrées dans un tableau, tu peux en récupérer deux:
list ($bonus, $malus) = ma_fonction();
list($bonus, , $autre) = ma_fonction();

Par contre, l'inverse n'est pas possible, si tu fais
list ($a, $b, $c) = ma_fonction_qui_retourne_un_array_a_2_entrées()
la variable $c existera (je crois) et sera nulle.


RE: retours multiples de fonction : tableau, associatif, ou objet - Ter Rowan - 25-03-2011

merci pour cette info, je ne connaissais pas list, et effectivement ca peut aider

par contre ça ne répond pas complètement, en effet dans "mes_fonctions()" je ne vois pas les noms, ca reste des 0 1, etc

du coup si je rends associatif dans ma fonction, et que j'utilise une list dans la récupération ça rend inutile l association non ?


RE: retours multiples de fonction : tableau, associatif, ou objet - php_addict - 25-03-2011

ta fonction peut retourner ceci:

array ( 'malus' => $malus, 'conso' => $conso)


RE: retours multiples de fonction : tableau, associatif, ou objet - Myrina - 25-03-2011

Le plus propre reste quand même l'objet; de plus en utilisant une interface définissant les méthodes pour récupérer les informations dont tu as besoin après le retour, rien n'empêche sur une action particulière d'utiliser ta classe par défaut implémentant cette interface mais une autre classe spécifique pour cette action. Le traitement post-action reste ainsi inchangé.


RE: retours multiples de fonction : tableau, associatif, ou objet - niahoo - 25-03-2011

Ouais enfin chacun sa définition de « propre » … L'avantage de l'objet c'est de ne pas avoir à tenir compte de l'ordre des infos. Tout comme avec un tableau avec des clés nommées.

Dans tes fonctions tu ne vois pas les noms, en effet, mais est-ce un problème ? les noms tu les vois logiquement sur tes variables.
Enfin pour moi ça coule de source, je ne fais pas
$result['machins'] = 234, $result['trucs'] = blahblah;


return $result;
Je retourne plutôt un array avec mes variables
return array($machins, $trucs);

Du coup c'est tranparent


list ($machins, $trucs) <= return array ($machins, $trucs)



RE: retours multiples de fonction : tableau, associatif, ou objet - Myrina - 25-03-2011

Sauf que ton exemple reste figé sur deux valeurs de retour. Il faut pouvoir gérer des valeurs de retour supplémentaires de la manière la plus transparente possible. D'utiliser les objets permet de cadrer le dialogue et donc de rendre moins adhérent le code de la méthode dans l'action du code traitant du retour de l'exécution de l'action.
De plus, je verrai bien l'utilisation d'un Iterator afin de permettre au traitement du retour de l'action d'utiliser une structure du style suivant pour traiter les retours supplémentaires:
foreach ($objet_retour as $key =>$value) {
.
.
.
}



RE: retours multiples de fonction : tableau, associatif, ou objet - Argorate - 25-03-2011

Pour ma part c'est différent selon les cas, des fois que je retourne "return $result;" qui est un tableau qui a été définit au fur et a mesure d'un traitement (exemple pour une attaque lancer).

Il m'ait deja arrivé de retourne un tableau défini a la volet "return array($machins, $trucs);" voir même d'utilisé les list effectivement, bien que rare, puisque la plus part du temps je préfère garder la structure de tableau pour ranger mes données tous regroupé tel un objet sans méthode...

Après dire que $toto->tata c'est "plus propre" que $toto['tata']... Chacun fera comme il veux Smile
M'enfin perdre du temps a définir un objet alors qu'un tableau fait l'affaire, ne me parait pas spécialement pertinent, en tout cas je ne vois pas d'avantage a faire cela?!


RE: retours multiples de fonction : tableau, associatif, ou objet - srm - 25-03-2011

Je retournerais un objet du type "Retour", enfin le nom de classe qui correspond le mieux à l'objet retourné.
Mais pas un faux objet, un vrai objet avec une classe même si elle n'a que des propriétés, au moins ton objet est bien définis.


RE: retours multiples de fonction : tableau, associatif, ou objet - niahoo - 25-03-2011

Non mais tant qu'à implémenter iterator, autant utiliser un tableau. pasque dans un tableau aussi tu peux mettre une variable fourre tout.

Enfin bon, j'ai été le premier à dire sur ce topic qu'utiliser un objet n'était pas une mauvaise solution. Maintenant, est-ce vraiment nécessaire ? Est-ce que « rendre moins adhérent le code de la méthode dans l'action du code traitant du retour de l'exécution de l'action » n'est pas une fausse bonne idée ?

Pasque il faut un peu maîtriser son code, connaitre les interfaces des retours de fonction. Tu dis que mon exemple est figé à deux réponses, mais ton objet aussi. sauf si tu lui ajoute des membres comme tu le feras sur un tableau. L'abstraction c'est bien avec parcimonie, à un moment faut que le code il fasse quelque chose sinon il n'avance pas. Ici il s'agît simplement de récupérer 3 pauvres variables.