J'ai une boucle for où je dois ignorer le premier élément d'un tableau à base zéro.
Laquelle de ces propositions montre plus clairement mes intentions?
for($i=1 ; $i < count(array) ; $i++){
array[$i];
}
ou
for($i=0+1 ; $i < count(array) ; $i++){
array[$i];
}
$i=2-1
n'est la voie supérieure. : /foreach ($i in range(1, count))
(tout ce qui ressemble à PHP). Ou quelque chose commeforeach ($item in array.skip(1))
ce que ferait une personne C #.Réponses:
Je déteste les deux.
Qui a dit que vous pouviez utiliser des nombres magiques? Si vous commencez avec un décalage de 1, pourquoi ne pas nous dire POURQUOI vous commencez avec un décalage de 1. L'ajout d'un zéro tout aussi magique ne m'explique rien.
Est-ce le décalage de la charge utile? S'agit-il d'une chaîne pascale que vous convertissez en chaîne c terminée par null? Veuillez nous dire ce qui se passe.
Désolé, mais j'ai gaspillé une grande partie de ma carrière à décoder des mystères inutiles comme celui-ci et ma patience pour eux s'est épuisée. Une variable avec un nom décent est-elle vraiment trop demander?
Par nom décent, je veux dire un nom qui explique POURQUOI nous sautons le premier élément. Pas quelque chose qui dit simplement que nous sautons le premier élément. Le 1 m'a dit ça tout seul.
la source
static final int LONELIEST_NUMBER = 1
dans tout mon code Java. :-) Cela dit, après réflexion, j'aimerais revenir sur votre réponse, mais je ne peux pas sauf si vous la modifiez. Règle stupide de SO?Réponse courte: la première option est meilleure.
La deuxième option ajoute simplement du bruit. Il est très peu probable que 0 + 1 aide le lecteur à comprendre qu'il aurait pu être 0, mais c'est 1. Il est beaucoup plus probable qu'il sera perplexe un court instant et distrait de ce que la boucle représente. Surtout dans une langue où tous les tableaux commencent à 0.
Comme d'autres l'ont mentionné, si vous voulez souligner le fait que la boucle commence à 1, pas à 0, ajoutez simplement un commentaire.
la source
Ne nous dites pas que vous sautez le premier élément - nous pouvons le voir. Ce qui n'est pas évident, c'est pourquoi . Alors .. si ce n'est pas évident d'après le contexte, dites-nous pourquoi:
Ou, si vous êtes opposé aux commentaires, quelque chose comme:
N'utilisez pas de commentaires et de ruse pour nous rappeler le fonctionnement de la langue.
la source
Votre exemple semble artificiel. Dans le code du monde réel, le fait que les boucles doivent commencer au deuxième élément du tableau est très probablement évident à partir des lignes de code suivantes. Par exemple, si le vrai code ressemble à ceci
il n'y aurait aucune explication ou construction "0 + 1" nécessaire pour expliquer pourquoi la boucle commence à 1 au lieu de 0.
Cependant, si le code à l'intérieur de la boucle n'explique pas les raisons de manière aussi évidente (peut-être
array[0]
a une signification spéciale et doit être traité différemment des autres éléments), ajoutez un commentaire explicatif. Mais avant de faire cela, réfléchissez-y à deux fois si vous pouvez éviter d'avoirarray[0]
cette signification spéciale et réorganisez le code environnant, ce qui serait probablement la meilleure alternative.la source
Jamais vu l'option n ° 2, mais j'aime ça. Pourquoi? Avec l'option # 1, je me demande si le programmeur a oublié que les tableaux commencent à 0. L'option # 2 rend plus clair qu'ils commencent délibérément à 1.
Cela dit, il vaut mieux dans les deux cas ajouter un commentaire expliquant pourquoi vous sautez l'élément.
Ou, si vous pouvez facilement décrire pourquoi vous commencez à un, utilisez une constante. Par exemple, si vous regardez des arguments de ligne de commande, quelque chose comme
Personnellement, j'utiliserais probablement un commentaire à la place, YMMV.
la source
Je doute que quiconque soit dérouté par le premier. Nous avons tous dû le faire. Tant et si bien que le second est beaucoup plus susceptible de confondre. "Pourquoi y a-t-il un 0+? Ont-ils outrepassé l'opérateur + d'une manière ou d'une autre?"
Un compilateur décent transformera le second en premier de toute façon, mais il semble que vous utilisez PHP, qui est interprété. Donc, à chaque fois que l'interprète frappe cette boucle, il va falloir ajouter 0 et 1. Ce n'est pas grave, mais pourquoi faire faire le travail à l'interprète?
la source
Utilisez une variable qui explique le point de départ.
Vous devez " ignorer le premier élément d'un tableau à base zéro ", par exemple:
la source
Si l'un est obsédé par toutes les boucles commençant à zéro, vous pouvez utiliser une instruction continue. Ajoutez un commentaire à la raison pour laquelle vous sautez, car normalement, vous ne le feriez pas.
la source
if first then skip
avec un commentaire disant pourquoi. Toujours sans contexte, aucune des solutions n'est "la meilleure"Ce que je ferais, c'est supprimer le premier élément avant de boucler. Créez un nouveau tableau si vous en avez besoin. Expliquez dans un commentaire pourquoi vous le faites. Et puis faites juste un simple foreach.
De cette façon, votre intention est parfaitement claire.
Pour clarifier davantage, vous pouvez envelopper le code dans une méthode avec un nom approprié pour rendre les choses plus claires.
Cependant, tout cela manque encore de contexte. Que voulez-vous faire avec les éléments? Retournerez-vous le nouveau tableau? Vous souciez-vous de l'original et du nouveau tableau après vous
doStuff()
?Quoi qu'il en soit, il n'y a pas de réponse claire ici, et décider comment rendre le code lisible dépend grandement du contexte.
la source
$array[$i-1] = $array[$i]
ou quelque chose de similaire, selon la réponse de @ DocBrown?1
(voir le commentaire de Kevin Lee), cela ne rend pas le code plus clair du tout. Le lecteur doit comprendre array_shift, ce qu'il fait, comment cela fonctionne. Peut-être que cette ligne de code est un bug? Modifie-t-il le tableau ou en renvoie-t-il un nouveau? Insère-t-il un élément ou en supprime-t-il un? Change-t-il ou non les indices? Je ne vois pas comment l'utilisation d'une boucle à base unique ne serait pas une énorme amélioration de cette fonction (et étant donné son nom, instantanément compréhensible).