8
votes

Est-ce un mauvais modèle? (Switch à l'intérieur de la boucle)

Je me trouve en train de rédiger un code tel que:

if($array[0] == 'something') {
    doSomething($array[0]);
}
if($array[1] == 'somethingelse') {
    doSomethingElse($array[1]);
}


1 commentaires

La principale chose que je vois avec ce code est que cela fonctionnera plutôt bien s'il y a peu de valeurs dans le tableau $, mais je m'attends à ce qu'elle soit beaucoup plus lente s'il y a un grand nombre de valeurs (pensez simplement à 10 000 valeurs, ce commutateur Doit être exécuté pour chaque valeur de la matrice. Vous connaissez les données avec qui vous travaillez, alors choisissez la solution en conséquence. Personnellement, je ferais le siest, mais c'est juste moi.


6 Réponses :


5
votes

J'ai tendance à utiliser le commutateur dans la boucle de Forach. IMHO est moins sale qu'un tas de si.

Vous pouvez mettre votre commutateur dans une autre fonction, comme: xxx


0 commentaires

0
votes

Essayez ceci:

traversez chaque version - avec le commutateur et avec le si - un million de fois. Temps chaque course.

Faites-nous savoir lequel fonctionne plus vite.


1 commentaires

Je ne cherche pas de techniques d'optimisation, plutôt mieux (s'ils existent) des techniques de conception.



1
votes

Il y a (au moins) une autre possibilité: utilisez un dictionnaire de rechercher pour expédier des travaux sur une fonction.

Recherchez la fonction à l'aide de $ clé en tant que "touche", récupérez la référence de fonction et appliquez-la avec une valeur $ en tant que paramètre.

Pardonne-moi mais mon php-fu est un peu rouillé.


0 commentaires

0
votes

rien de mal avec ça.

Si vous n'avez que 2 ou 3 articles, j'irais avec le cas de la complexité du code. Si vous avez plus de 5, je vais certainement aller avec le commutateur ...


0 commentaires

15
votes

Mappage de vos fonctions à des clés dans un tableau de dictionnaire / associatif est une approche commune de cette situation (comme @jldupont a mentionné) - non seulement dans PHP, mais dans de nombreuses langues dynamiques avec des tableaux associatifs. Par exemple, Python et Lua ne sont même pas ont em> une instruction de commutation - c'est à peu près le seul moyen d'émuler un commutateur.

Considérez cette approche: P>

Goodbye.
Hello.


3 commentaires

C'est une solution que je n'ai pas pensé. Relatif au code que j'avais à l'esprit lorsque j'ai posté ceci, ceci est surchargé, mais je peux certainement penser à certaines utilisations. Merci!


Ceci est effectivement une table d'expédition axée sur les données, qui s'est révélée être une technique la plus utile sur des décennies d'une utilisation ridiculement fréquente.


En outre, une langue n'a pas besoin d'être dynamique pour cette approche d'être utile. J'ai fait des choses similaires dans C ++, C # et VB.net aussi. :)



5
votes

Ce n'est pas une solution "mauvaise", mais comme toujours, il existe des alternatives. Par exemple, vous pouvez vous débarrasser de l'instruction de commutation et utiliser un gestionnaire interprété pour les chaînes. Ceci est similaire à une liste de points de fonction, mais vous n'avez pas à tenir une liste à jour pour ajouter de nouveaux comportements; Il suffit de simplement ajouter la nouvelle fonction au gestionnaire en prendre soin.

$array = array(
  "something" => "itsasecret",
  "somethingelse" => "i can't tell you",
);

class Handler {
  static function something($value) {
    printf("something: %s\n", $value);
  }

  static function somethingelse($value) {
    printf("somethingelse: %s\n", $value);
  }
}

$handler = new Handler();
foreach($array as $key => $value) {
  $handler->$key($value);
}


1 commentaires

Donne certainement des idées, merci pour votre réponse Jheddings. +1