Pregunta

¿Deberían los desarrolladores evitar el uso? continuar en C# o su equivalente en otros lenguajes para forzar la siguiente iteración de un bucle?¿Se superpondrían los argumentos a favor o en contra con los argumentos sobre Ir a?

¿Fue útil?

Solución

¡Creo que debería usarse más continuar!

Con demasiada frecuencia me encuentro con códigos como:

for (...)
{
   if (!cond1)
   {
      if (!cond2)
      {
          ... highly indented lines ...
      }
   }
}

en lugar de

for (...)
{
   if (cond1 || cond2)
   {
      continue;
   }

   ...
}

¡Úselo para hacer que el código sea más legible!

Otros consejos

Es continue más dañino que, digamos, break?

En todo caso, en la mayoría de los casos en los que lo encuentro/uso, encuentro que hace que el código sea más claro y menos parecido a un espagueti.

Puedes escribir código bueno con o sin continuar y puedes escribir código incorrecto con o sin continuar.

Probablemente haya cierta superposición con los argumentos sobre goto, pero en lo que a mí respecta, el uso de continuar es equivalente a usar declaraciones de interrupción (en bucles) o declaraciones de retorno desde cualquier parte del cuerpo de un método; si se usa correctamente, puede simplificar el código. (Es menos probable que contenga errores, más fácil de mantener).

No existen palabras clave dañinas.Sólo hay usos dañinos para ellos.

Ir a no es perjudicial per se, ni tampoco lo es continuar.Hay que utilizarlos con cuidado, eso es todo.

Si continuar está causando un problema de legibilidad, entonces es probable que tenga otros problemas.Por ejemplo, cantidades masivas de código dentro de un bucle for.Si tiene que escribir bucles for grandes, intentaría seguir usando continuar cerca de la parte superior del bucle for.De lo contrario, es fácil pasar por alto una continuación enterrada profundamente en medio de un bucle for.

Me gusta usar continuar al comienzo de los bucles para manejar condiciones if simples.

Para mí, hace que el código sea más legible ya que no hay anidamiento adicional y puedes ver que he tratado explícitamente estos casos.

¿Es esta la misma razón por la que usaría goto?Tal vez.A veces los uso para facilitar la lectura y para detener el anidamiento de código, pero generalmente los uso más para limpieza/manejo de errores.

Yo diria:"Eso depende".

Si tiene un código de bucle razonablemente pequeño (donde puede ver el código de bucle completo sin desplazarse), generalmente está bien usar continuar.

Sin embargo, si el cuerpo del bucle es grande (por ejemplo, debido a un interruptor grande) y hay algún código de seguimiento (por ejemplo, debajo del interruptor), puede introducir errores fácilmente agregando un continuar y, por lo tanto, omitiendo ese código a veces.Me encontré con esto en el corazón de un intérprete de código de bytes, donde a veces algún código de instrumentación no se ejecutaba debido a una continuación en algunas ramas de casos.

Este podría ser un caso construido un tanto artificialmente, pero generalmente trato de evitar continuar y usar un if (pero sin anidar demasiado profundamente como en el código de muestra de Rob).

No creo que continuar pueda ser tan difícil como ir a, ya que continuar nunca saca la ejecución del bloque de código en el que se encuentra.

Si está iterando a través de cualquier tipo de conjunto de resultados y realizando operaciones en dichos resultados, por ejemplo, dentro de un for each, y si un resultado en particular causó un problema, es bastante útil capturar un error esperado (a través de try-catch), registrarlo y pasar al siguiente resultado mediante continuar.Continuar es especialmente útil, en mi opinión, para servicios desatendidos que realizan trabajos en horas impares, y una excepción no debería afectar la otra x cantidad de registros.

  1. Usar continue al comienzo de un bucle para evitar la iteración sobre elementos innecesarios no es dañino y puede ser muy útil, pero usarlo en medio de ifs y elses anidados puede convertir el código del bucle en un laberinto complejo, para comprender y validar.

  2. Creo que evitar su uso también es el resultado de un malentendido semántico.Las personas que nunca ven/escriben la palabra clave "continuar" en su código, cuando ven un código con continuar pueden interpretarlo como "la continuación del flujo natural".Si en lugar de continuar tuviéramos próximo, por ejemplo, creo que más personas apreciarían esta valiosa función del cursor.

goto se puede utilizar como continuación, pero no al revés.

Puede "ir" a cualquier lugar, rompiendo así el control de flujo arbitrariamente.

Así continúan, no tan dañinos.

Otros lo han insinuado...pero continuar y romper son impuestos por el compilador y tienen sus propias reglas asociadas.Goto no tiene tales limitaciones, aunque el efecto neto podría casi ser el mismo, en algunas circunstancias.

No considero que continuar o interrumpir sea perjudicial per se, aunque estoy seguro de que cualquiera de los dos puede usarse mal de una manera que provocaría náuseas a cualquier programador en su sano juicio.

Yo diría que sí.Para mí, simplemente rompe el "flujo" de un código escrito con fluidez.

Otro argumento también podría ser que si se ciñe a las palabras clave básicas admitidas por la mayoría de los lenguajes modernos, entonces el flujo de su programa (si no la lógica o el código) podría trasladarse a cualquier otro lenguaje.Tener una palabra clave no admitida (es decir, continuar o ir a) rompería eso.

En realidad, es más una preferencia personal, pero nunca he tenido que usarlo y realmente no lo considero una opción cuando escribo código nuevo.(igual que ir a.)

En lo que respecta a este programador, Anidado si/si no considerado perjudicial.

Continuar es una función realmente útil en la mayoría de los lenguajes, porque permite omitir bloques de código bajo ciertas condiciones.

Una alternativa sería utilizar variables booleanas en declaraciones if, pero sería necesario restablecerlas después de cada uso.

Continuar me parece mal.el descanso te saca de allí, pero continuar parece ser solo espagueti.

Por otro lado, puedes emular continuar con pausa (al menos en Java).

for (String str : strs) contLp: {
    ...
       continue contLp;
    ...
}

continuar puede ser útil en algunas circunstancias, pero todavía me parece sucio.

for (char c : cs) {
    final int i;
    if ('0' <= c && c <= '9') {
        i = c - '0';
    } else if ('a' <= c && c <= 'z') {
        i = c - 'a' + 10;
    } else {
        continue;
    }
    ... use i ...
}

Creo que el argumento fundamental en contra de continuar es que hace que sea más difícil PROBAR que el código es correcto.Esto se demuestra en el sentido matemático.Pero probablemente no le importe porque nadie tiene los recursos para "probar" un programa informático que sea significativamente complejo.

Ingrese a las herramientas de análisis estático.Quizás les pongas las cosas más difíciles...

Y el ir a, suena como una pesadilla por las mismas razones pero en cualquier lugar aleatorio del código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top