¿Por qué usamos mal los bucles?

Para empezar a hablar sobre esto, debemos entender cuáles son los usos de los principales bucles independientemente del lenguaje. Hablamos por supuesto de for y de while.

El bucle de for es para un uso determinado, es decir, un bucle en el que sé cuantas veces debe repetirse algo. Por ejemplo, imprimir 10 números por pantalla. De esta manera la sintaxis, principalmente, nos ayudará a resolver ese breve problema de una forma mucho más eficaz.

Y en el caso de while nos sirve para situaciones indeterminadas, no sé si se ejecutará 3 veces, 10 o 50 veces. Y además nos dota de la posibilidad de estructurar nuestra lógica para lo que necesitamos comprobar para que se ejecute el bucle.

Por supuesto ambos bucles y sus transformaciones en función de los lenguajes, se pueden usar para lo que cada uno quiera, pero al final se trata de no usar un destornillador para cavar un agujero.

Veamos algunos ejemplos, usaré Python al ser un lenguaje más simple, pero seguro que es fácil llevarlo al lenguaje que manejais.

for numero in range(0, 9):
    print(numero);

En este caso podemos ver como tenemos un for que recorre los 9 números y los saca por pantalla.

encontrado_trabajador = False;

while not encontrado_trabajador:
    # Lógica para buscarle...

    if trabajador.name = "pepe":
        encontrado_trabajador = True;

Y aquí tenemos el caso de while, donde para buscar a un trabajador en una colección de datos, y desconocemos su posición, podriamos elaborar algo de este estilo.

Por supuesto estos son ejemplos sencillos, para entender la logica, de esta manera deberiamos evitar situaciones de este estilo.

contador = 0;

while contador < 10:
    print("Hola");
    contador += 1;

Una situación que se realiza mucho, cuando en realidad con un for sería mucho más legible.

for indice in range(0, len(trabajadores)):
    if trabajadores[indice].nombre == "pepe":
        print(trabajadores[indice]);

En este ejemplo, que es más claro un while como ya he comentado, al final nos obliga a llevar a lo siguiente con un break, ya que no podemos controlar el bucle de otra manera.

for indice in range(0, len(trabajadores)):
    if trabajadores[indice].nombre == "pepe":
        print(trabajadores[indice]);
        break;

Y poco a poco las cuestiones que vamos resolviendo, no hacen nada más que ir en la dirección incorrecta. Recuerdo que el uso más correcto en cuanto al uso de los bucles, sería lo siguiente.

while not encontrado_trabajador and indice < 10:
    if trabajadores[indice].name = "pepe":
        encontrado_trabajador = True;

De esta manera cubrimos las dos opciones, tanto si encontramos lo que estamos buscando como si llegamos al final de la colección de datos. Recordad que no es la forma más optimza de buscar algo en una colección, solamente es un ejemplo. Y además, nos permite el hecho de usar el while, tener un interruptor para el bucle, algo que es más legible hacer así que con un break.

Es muy fácil perderse en las malas practicas cuando hablamos de bucles, es un error muy común. Pero hay que huir de esos pensamientos de escribir menos es mejor, o mi favorito, luego lo cambio, porque la realidad, es que no lo arreglamos.