Esta es la forma más popular (me parece) de verificar si un valor está en una matriz:
for (int x : array)
{
if (x == value)
return true;
}
return false;
Sin embargo, en un libro que leí hace muchos años por, probablemente, Wirth o Dijkstra, se dijo que este estilo es mejor (en comparación con un bucle while con una salida adentro):
int i = 0;
while (i < array.length && array[i] != value)
i++;
return i < array.length;
De esta manera, la condición de salida adicional se convierte en una parte explícita del bucle invariante, no hay condiciones ocultas y salidas dentro del bucle, todo es más obvio y más en una forma de programación estructurada. En general, preferí este último patrón siempre que era posible y usé el for
bucle para iterar solo de a
a b
.
Y, sin embargo, no puedo decir que la primera versión sea menos clara. Quizás sea aún más claro y fácil de entender, al menos para los principiantes. ¿Entonces todavía me pregunto cuál es mejor?
¿Tal vez alguien puede dar una buena razón a favor de uno de los métodos?
Actualización: no se trata de puntos de retorno de funciones múltiples, lambdas o de encontrar un elemento en una matriz per se. Se trata de cómo escribir bucles con invariantes más complejos que una sola desigualdad.
Actualización: OK, veo el punto de las personas que responden y comentan: mezclé el bucle foreach aquí, que en sí mismo es mucho más claro y legible que un bucle while. No debería haber hecho eso. Pero esta también es una pregunta interesante, así que vamos a dejarlo como está: foreach-loop y una condición adicional en el interior, o while-loop con un ciclo explícito invariante y una condición posterior después. Parece que el foreach-loop con una condición y una salida / break está ganando. Crearé una pregunta adicional sin el foreach-loop (para una lista vinculada).
collection.contains(foo)