Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/06/2015, 09:45
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: continue vs if en un loop

Realmente no dejan de ser modismos y cada uno elige uno u otro por unas razones u otras. Veamos:

Caso 1:
Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.         if (myArray[i] != VALOR_DESEADO)
  4.              continue;
  5.  
  6.              //Todo lo que se vaya a ejecutar en el bucle.
  7. }

La principal ventaja de este código es que reduces la indentación. Imagínate que tuvieses que hacer 6 o 7 chequeos para saber si debes ejecutar el contenido del bucle... si resolvieses el problema usando ifs encadenados acabarías con una indentación excesiva, mientras que con esta solución mantienes un nivel de indentación razonable.

Caso 2:
Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.         if (myArray[i] == VALOR_DESEADO)
  4.         {
  5.              //Todo lo que se vaya a ejecutar en el bucle.
  6.          }
  7. }

Los que defienden este código se escudan en que tanto continue como break introducen saltos en el código... a lo que yo suelo pensar que el if también cuando no se cumple la condición.

Al final, creo que la mejor solución depende de cada caso. Lo que debe primar, en mi opinión, es la legibilidad del código y, claro está, dependerá de las condiciones del mismo que una opción ofrezca un código más sencillo que la otra.

Pasando a los otros dos ejemplos tenemos:

Caso 3:

Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.        if (condicion especifica)
  4.        {
  5.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  6.          break;
  7.        }
  8. }

Caso 4:
Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.        if (condicion especifica)
  4.        {
  5.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  6.          i=max;
  7.        }
  8. }

Ahora tengo que hacer una aclaración y es que el caso 4 suele tener la forma que detallo a continuación. El motivo es que suele ser mejor opción usar una variable externa a modificar los valores del for:

Código C:
Ver original
  1. bool continuar = true;
  2. for (int i=0: i < max && continuar; i++)
  3. {
  4.        if (condicion especifica)
  5.        {
  6.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  7.          continuar = false;
  8.        }
  9. }

En este caso, el caso 3 será ridículamente más eficiente que el caso 4, ya que el break se sustituye por un salto al final del bucle mientras que en el otro caso tenemos una asignación, una comparación y un salto al final del bucle... 3 instrucciones a cambio de una. Lo dicho, una mejora de rendimiento despreciable.

El problema que presenta el caso 3 es que para depurarlo (haciendo pasadas generales en el bucle para saber cuándo se sale del mismo) necesitas al menos dos puntos de parada: el inicio del bucle y cada break que haya dentro del bucle, mientras que el caso 4 únicamente necesita un breakpoint.

Está claro que la definición del for en el caso 3 es más legible que la utilizada en el caso 4 (mi versión) y además evitas el uso de una variable adicional.

Al final, ¿en qué quedamos? pues en que, si puedes elegir, elijas siempre la opción que consideres más oportuna en cada momento. Si no puedes elegir no hay mucho que pensar, pero al menos conoces las alternativas.