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 originalfor (int i=0: i < max; i++)
{
if (myArray[i] != VALOR_DESEADO)
continue;
//Todo lo que se vaya a ejecutar en el bucle.
}
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 originalfor (int i=0: i < max; i++)
{
if (myArray[i] == VALOR_DESEADO)
{
//Todo lo que se vaya a ejecutar en el bucle.
}
}
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 originalfor (int i=0: i < max; i++)
{
if (condicion especifica)
{
//Todo lo que se vaya a ejecutar en el bucle, una sola vez.
break;
}
}
Caso 4:
Código C:
Ver originalfor (int i=0: i < max; i++)
{
if (condicion especifica)
{
//Todo lo que se vaya a ejecutar en el bucle, una sola vez.
i=max;
}
}
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 originalbool continuar = true;
for (int i=0: i < max && continuar; i++)
{
if (condicion especifica)
{
//Todo lo que se vaya a ejecutar en el bucle, una sola vez.
continuar = false;
}
}
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.