de regreso en bucle for o fuera del bucle

Hoy en día, alguien que asistió a mí mal uso de la return palabra clave de Java. Yo había escrito un simple for bucle para validar que algo es de una matriz. Suponiendo array es una matriz de longitud n, este fue mi código:

for (int i = 0; i < array.length; ++i) {
    if (array[i] == valueToFind) {
        return true;
    }
}
return false;

Ahora alguien me dijo que esto no es muy buena programación, porque yo uso el return declaración dentro de un bucle y esto haría que la recolección de basura a un mal funcionamiento. Por lo tanto, un mejor código sería:

int i = 0;
while (i < array.length && array[i] != valueToFind) {
    ++i;
}
return i != array.length;

El problema es que yo no puede venir para arriba con una adecuada explenation de por qué el primer bucle for no es una buena práctica. Puede alguien darme una explicación?

  • ¿Qué fue exactamente lo que la persona que dio como razón para la primera no está bien? Se mete con el GC?
  • Si GC nunca funciona mal, es el JVM del problema, no su programa de… el código es totalmente válido.
  • «esto haría que la recolección de basura mal funcionamiento»: ¿Puede explicar?
  • Algunas personas se oponen a returns dentro de for bucles. Y otras personas de objeto y, a continuación, constituyen razones cuando se le preguntó por qué …
  • Esto es sólo una guerra religiosa.
InformationsquelleAutor Daan Pape | 2012-05-29

5 Kommentare

  1. 59

    Ahora alguien me dijo que esto no es muy buena programación, porque yo uso la sentencia return dentro de un bucle y esto haría que la recolección de basura a un mal funcionamiento.

    Eso es incorrecto, y sugiere que usted debe tratar a otros consejos de esa persona con un grado de escepticismo.

    El mantra de que «sólo tienen una instrucción return» (o, más generalmente, sólo un punto de salida) es importante en los idiomas donde usted tiene que manejar todos los recursos de ti mismo – de esa manera usted puede asegurarse de colocar todo el código de limpieza en un solo lugar.

    Es mucho menos útil en Java: tan pronto como usted sabe que usted debe devolver (y lo que el valor de retorno debe ser), acaba de volver. De esa manera es más fácil de leer – usted no tiene que tomar en cualquiera de el resto de el método para trabajar de lo que más va a suceder (aparte de finally bloques).

    • Una sola instrucción return era parte del código de la convención de donde solía trabajar. Me parece que esto lleva a un montón de anidación y mucho más difícil la lectura del código.
    • De hecho. Generalmente, es el resultado de que las personas tienen una idea sin la comprensión de la la razón ¿por qué es una buena idea en un contexto determinado.
    • En la presencia de excepciones, una única salida es a infeasable, como casi cualquier pieza de trivial código podría subir uno. Es mejor ir con el flujo de la lengua aquí en lugar de forzar el código para comportarse de acuerdo a algunas reglas que podría haber tenido sentido en un entorno diferente/idioma.
    • mira lo que has hecho, alguien está utilizando esta respuesta para intentar evitar la Paralización Problema.
  2. 6

    Ahora alguien me dijo que esto no es muy buena programación, porque yo
    el uso de la sentencia return dentro de un bucle y esta sería la causa de la basura
    colección de mal funcionamiento.

    Que un montón de basura. Todo dentro del método sería limpiada, salvo que existieran otras referencias a ella en la clase o en otros lugares (una razón por la encapsulación es importante). Como regla general, es mejor utilizar una instrucción return, simplemente porque es más fácil de averiguar dónde está el método de salida.

    Personalmente, me gustaría escribir:

    Boolean retVal = false;
    for(int i=0; i<array.length; ++i){
        if(array[i]==valueToFind) {
            retVal = true;
            break; //Break immediately helps if you are looking through a big array
        }
    }
    return retVal;
    • Meh; es generalmente mejor para escribir la más legible el código, lo que significa que el número de los estados de retorno. Por ejemplo, si usted tiene un montón de guardia cláusulas, cada una de ellas (OMI) debe devolver de inmediato en caso de error.
    • Como una nota del lado, no hay nada de GC en este método, ya que no hay ningún objeto de asignaciones de aquí.
    • Definitivamente de acuerdo con Dave — no veo por qué no «, donde el método de salida» es de alguna importancia per se. Lo que importa es la facilidad con que se puede seguir la lógica del método.
  3. 3

    Ha habido metodologías en todos los idiomas que abogan por el uso de una sola instrucción return en cualquier función. Sin embargo imposible puede ser en cierto código, algunas personas se esfuerzan para que, sin embargo, que puede terminar encima de hacer el código más complejo (como en más líneas de código), pero por otro lado, algo más fácil de seguir (como en el flujo de la lógica).

    Esto no estropear la recolección de basura en cualquier manera!!

    La mejor manera de hacerlo es establecer un valor booleano, si quieres escuchar a él.

    boolean flag = false;
    for(int i=0; i<array.length; ++i){
        if(array[i] == valueToFind) {
            flag = true;
            break;
        }
    }
    return flag;
  4. 2

    Algunas personas argumentan que un método debe tener un único punto de salida (por ejemplo, sólo uno return). Personalmente, creo que intentando meter a esa regla produce un código más difícil la lectura. En tu ejemplo, tan pronto como usted encontrar lo que estaban buscando, devolver de forma inmediata, clara y eficiente.

    Citando el C2 de la wiki:

    El original de la importancia de tener una sola entrada y una sola salida de una función es que se parte de la definición original de StructuredProgramming frente a indisciplinado goto SpaghettiCode, y se permitió una limpia de análisis matemático en base a eso.

    Ahora que la programación estructurada, desde hace mucho se ganó el día, y no uno en particular se preocupa por que ya, y el resto de la página es en gran parte sobre las mejores prácticas y la estética y tal, no se trata de un análisis matemático de programación estructurada construcciones.

  5. 1

    El código es válido (he.e, va a compilar y ejecutar) en ambos casos.

    Uno de mis profesores en la Uni nos dijo que no es conveniente tener continue, return declaraciones en cualquier bucle – for o while. La razón de esto es que, al examinar el código, no es no es inmediatamente claro si la longitud del bucle se ejecutará o la return o continue se llevará a efecto.

    Ver ¿Por qué se siguen dentro de un bucle es una mala idea? para un ejemplo.

    El punto clave a tener en cuenta es que para escenarios simples como este no (OMI) de la materia, pero cuando usted tiene una lógica compleja de determinar el valor de retorno, el código es ‘general’ más legible si usted tiene una sola instrucción return en lugar de varios.

    Con respecto a la Recolección de Basura – no tengo idea de por qué esto sería un problema.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein