Cuando usar un bucle For y cuando un bucle Do

 Todos saben cómo funciona un blucle For. Bueno, es posible. Consideremos este bucle:

For i = 1 to Len(s)
  'Hacer algo con los caracteres de la cadena s
Next


Este bucle For es una abreviatura de un bucle Do como el siguiente:

i = 1
Do While i <= Len(s)
  'Hacer algo con los caracteres de la cadena s
  i = i + 1
Loop

Sin embargo, la comparación no es exacta. ¿Que ocurriría si alguna instrucción del bucle cambiara la longitud de la cadena s eliminando o añadiendo caracteres? De echo, está ocurriendo algo muy distinto. En el bucle Do, la longitud de la cadena se comprueba en cada iteración, mientras que en el bucle For se comprueba sólo una vez. Así que el bucle Do equivalente al bucle For realmente es el siguiente:

i = 1
iTemp = Len(s)
Do While i <= iTemp
  'Hacer algo con los caracteres de la cadena s
  i = i +1
Loop


Esta historia tiene dos moralejas:
  1. Para escribir bucles Do eficientes, se debe asegurar que las comprobaciones While y Until sean sencillas. No se debe comprobar la longitud de una cadena en cada iteración del bucle si se sabe que dicha longitud no va a cambiar. Se debe considerar la posibilidad de convertir los bucles Do sencillos en bucles For.
  2. Si va a cambiar lo que se comprueba dentro del bucle, se debe considerar la posibilidad de cambiar el bucle For por un bucle Do. Otro truco que funciona a veces consiste en procesar un bucle For hacia atrás, cambiando solo los elementos que ya se han contado. El siguiente bucle, que elimina los elementos seleccionados de un cuadro de lista, funciona tal como está escrito, pero fallaría si se contara hacia adelante, por que al eliminar elementos cambia el numero de elementos de la lista y el elemento actual:
For i = lstData.ListCount -1 to 0 Step -1
  If lstData.Selected(i) Then lstData.RemoveItem i
Next




Comentarios