2012-04-16 12 views
7

¿Qué escribe normalmente cuando prueba el valor de retorno de indexOf?Práctica recomendada para probar el valor de retorno de indexOf

if str.indexOf("a") < 0 

vs

if str.indexOf("a") == -1 

Would un método preferirse sobre el otro?

En realidad estoy planteando esta pregunta para cualquier función en cualquier idioma que devuelva -1 por error.

Normalmente prefiero el enfoque < 0, porque si la función se extiende para devolver -2 en algún otro caso, el código seguirá funcionando.

Sin embargo, observo que el enfoque == -1 es más comúnmente utilizado. ¿Hay alguna razón por qué?

+1

En el caso de Java, indexOf especifica claramente que devolverá -1 si no se encuentra coincidencia en su cadena. Por lo tanto, cambiar eso sería una ruptura en la API y, por lo tanto, podemos contar con el hecho de que devolverá -1. Pero prefiero usar '' 0' sobre '== - 1' –

+0

' if (! ~ Str.indexOf ("a")) 'es un poco menos detallado. –

Respuesta

3

Intento implementar el principio general de que las pruebas de "condiciones de error" deben ser lo más amplias posibles. Por lo tanto, usaría < 0 en lugar de == -1.

Este es un principio que me enseñaron durante las clases de métodos formales durante mi CS degree.

En un simple if no importa demasiado, pero en los bucles es importante detectar cualquier condición "fuera de rango" para asegurar que el bucle está terminado, y no asumir que el valor de terminación del bucle será golpeado exactamente.

Tomemos por ejemplo esta:

i = 0; 
while (i < 10) { 
    ++i; 
    // something else increments i 
} 

V.S.

i = 0; 
while (i != 10) { 
    ++i; 
    // something else increments i 
} 

Este último caso podría fallar: el primer caso no.

+0

pero en este caso la API de Java nos dice específicamente que se devolverá -1. – rk2010

+0

es, pero está implícito que un valor entero de 0 o superior se devolverá en caso de éxito, por lo que lo contrario (es decir, '<0') es una prueba contraria perfectamente válida. – Alnitak

+0

Si se devuelve -2, no significa "no encontrado". No está definido ... ¿no esperarías que el código proceda y provoque NullPointer o algún error? De esa manera, al menos, el problema de JVM puede ser sacado a la luz. – rk2010

2

Yo también preferiría el enfoque < 0. La razón por la cual el enfoque == -1 es ampliamente utilizado es porque las funciones devolverían -1 si el índice falta y el caso de "función extendida" nunca ocurrirá, según la documentación de Java.

1

En casi todos los casos recomendable pegarse a la doc de Java en la mayor medida posible. Ver Java Doc: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf%28int%29

... según este: -1 será devuelto.

Así que siempre comprobaría -1. Si tiene un valor específico para verificar, es más seguro verificar ese valor específico, para protegerlo contra futuros cambios de código en la API java.

Por ejemplo, si obtiene un -2, eso significa que algo está muy mal en su JVM. No significa "no encontrado". Sería mejor que el código proceda y cause una excepción/error.

0

Como señala Sandeep Nair, el javaDoc lo explica, pero quiero comentar un poco.

Ambos funcionarían bien y no diría que uno es "mejor" que el otro. La razón por la que mucha gente escribe == -1 es que existe una convención general de que los métodos de búsqueda devuelven -1 si "no se pueden encontrar cosas". No podemos usar 0 ya que se utilizan como índices en matrices, etc.

Por lo tanto, es una cuestión de opinión. Mientras la convención se mantenga, no importa.

0

Usaría -1 simplemente porque quiero comprobar lo que estoy esperando.

No estoy esperando -2. Si obtuve -2, eso probablemente significa que tengo algunos problemas. Comprobar lo que está esperando es simplemente mejor que comprobar lo que puede esperar.

Cuestiones relacionadas