Tengo un bucle for donde debo omitir el primer elemento en una matriz basada en cero.
¿Cuál de estos muestra mis intenciones más claramente?
for($i=1 ; $i < count(array) ; $i++){
array[$i];
}
o
for($i=0+1 ; $i < count(array) ; $i++){
array[$i];
}
$i=2-1
es el camino superior. : /foreach ($i in range(1, count))
(lo que sea que se vea en PHP). O algo así comoforeach ($item in array.skip(1))
lo que haría una persona de C #.Respuestas:
Odio a los dos.
¿Quién dijo que podrías usar números mágicos? Si va a comenzar con un desplazamiento de 1, ¿qué tal si nos dice POR QUÉ está comenzando con un desplazamiento de 1. Agregar un cero igualmente mágico no me explica nada.
¿Es este el desplazamiento de la carga útil? ¿Es esta una cadena pascal que está convirtiendo en una cadena c terminada en nulo? Por favor dinos qué está pasando.
Lo siento, pero he desperdiciado gran parte de mi carrera descifrando misterios sin sentido como este y mi paciencia por ellos se ha agotado. ¿Es una variable con un nombre decente realmente mucho pedir?
Por nombre decente me refiero a un nombre que explica POR QUÉ estamos omitiendo el primer elemento. No es algo que simplemente diga que estamos omitiendo el primer elemento. El 1 me dijo que por sí solo.
fuente
static final int LONELIEST_NUMBER = 1
en todo mi código Java. :-) Dicho esto, pensándolo bien, me gustaría anular la votación de su respuesta, pero no puedo a menos que la edite. ¿Tan tonta regla?Respuesta corta: la primera opción es mejor.
La segunda opción solo agrega ruido. Es muy poco probable que 0 + 1 ayude al lector a comprender que podría haber sido 0, pero es 1. Es mucho más probable que se desconcierte un momento y se distraiga de lo que trata el ciclo. Especialmente en un lenguaje donde todas las matrices comienzan en 0.
Como se mencionó anteriormente, si desea enfatizar el hecho de que el ciclo comienza desde 1, no desde 0, simplemente agregue un comentario.
fuente
No nos digas que te estás saltando el primer elemento, podemos ver eso. Lo que no es obvio es por qué . Entonces ... si no es obvio por el contexto, dinos por qué:
O, si eres reacio a los comentarios, algo como:
No use comentarios y trucos para recordarnos cómo funciona el lenguaje.
fuente
Tu ejemplo parece artificial. En el código del mundo real, el hecho de que los bucles deben comenzar en el segundo elemento de matriz es probablemente obvio en las siguientes líneas de código. Por ejemplo, si el código real se ve así
no habría explicación o construcción "0 + 1" necesaria para aclarar por qué el ciclo comienza en 1 en lugar de 0.
Sin embargo, si el código dentro del bucle no explica las razones de una manera tan obvia (tal vez
array[0]
tiene un significado especial y debe tratarse de manera diferente a los elementos restantes), entonces agregue un comentario explicativo. Pero antes de hacer esto, piense dos veces si puede evitar tenerarray[0]
este significado especial y reorganice el código circundante, que probablemente sería la mejor alternativa.fuente
Nunca vi la opción # 2, pero me gusta. ¿Por qué? Con la opción n. ° 1, me pregunto si el programador olvidó que las matrices comienzan en 0. La opción n. ° 2 aclara que están comenzando deliberadamente en 1.
Dicho esto, lo mejor en cualquier caso es agregar un comentario por qué está omitiendo el elemento.
O, si puede describir fácilmente por qué está comenzando en uno, use una constante. Por ejemplo, si observa los argumentos de la línea de comandos, algo como
Personalmente, probablemente solo usaría un comentario, YMMV.
fuente
Dudo que alguien se confunda con el primero. Todos hemos tenido que hacerlo. Tanto es así que es mucho más probable que el segundo confunda. "¿Por qué hay un 0+ allí? ¿Anularon el operador + de alguna manera?"
Un compilador decente convertirá el segundo en el primero de todos modos, pero parece que estás usando PHP, que se interpreta. Entonces, cada vez que el intérprete llegue a ese ciclo, tendrá que agregar 0 y 1. No es gran cosa, pero ¿por qué hacer que el intérprete haga el trabajo?
fuente
Use una variable que explique el punto de inicio.
Debe " omitir el primer elemento en una matriz basada en cero ", por ejemplo:
fuente
Si uno está obsesivo con todos los bucles que comienzan en cero, podría usar una declaración de continuación. Agregue un comentario sobre por qué está omitiendo, ya que normalmente uno no lo haría.
fuente
if first then skip
con un comentario que dice por qué. Aún sin contexto, ninguna de las soluciones es "mejor"Lo que haría es eliminar el primer elemento antes de repetir. Cree una nueva matriz si es necesario. Explica en un comentario por qué lo estás haciendo. Y luego haz un simple foreach.
De esta manera tu intención es perfectamente clara.
Para aclarar más, podría envolver el código en un método con un nombre apropiado para aclarar las cosas.
Sin embargo, a todo esto todavía le falta contexto. ¿Qué quieres hacer con los elementos? ¿Volverá la nueva matriz? ¿Te importa el original y el nuevo conjunto después de ti
doStuff()
?De todos modos, no hay una respuesta clara aquí, y decidir cómo hacer que el código sea legible depende en gran medida del contexto.
fuente
$array[$i-1] = $array[$i]
o algo similar, según la respuesta de @ DocBrown?1
(ver el comentario de Kevin Lee), no hace que el código sea más claro. El lector debe comprender array_shift, qué hace, cómo funciona. ¿Quizás esta línea de código es un error? ¿Modifica la matriz o devuelve una nueva? ¿Inserta un elemento o elimina uno? ¿Cambia los índices o no? No veo cómo usar un bucle basado en uno no sería una gran mejora en esa función (y dado su nombre, comprensible al instante).