2012-03-18 8 views

Respuesta

18

La razón por la que se hace es porque los códigos de estado son números enteros , por lo que esta expresión será una división entera.

La división entera significa que all successful HTTP status codes (es decir, los de 200-299) hará que la expresión falsa, no sólo 200.

no ser quisquilloso sobre Tim Bray, pero si yo estaba escribiendo esto mismo y quería transmitir mi intención con claridad, luego, para facilitar la lectura, probablemente querría ver algo más parecido al !statusCode.isSuccessful. Si no sabía que HTTP 2xx significaba códigos de estado exitosos, no sería obvio cuál era la intención de la división de enteros.

Por supuesto, la división de enteros es probablemente más eficiente que hacer un montón de objetos StatusCode hipotéticos y luego hacer el envío del método isSuccessful en ellos. Y el rendimiento es probablemente un objetivo clave para una clase de biblioteca de red.


Es HTTP_STATUS/100! = 2 mejor o más rápido que HTTP_STATUS! = 200?

No será más rápido (dos operaciones que en una), pero si es "mejor" es una comparación de manzanas a naranjas, ya que esas dos operaciones tienen un comportamiento diferente.

+0

+1 para la explicación de por qué querría hacer esto, pero la PREGUNTA realmente debería ser, ¿es mejor y más rápida la división y los iguales? Que una comprobación de una RANGO de valores, porque eso es lo que representa la división. – dldnh

+0

Y este truco es bueno y rápido si solo está comprobando si la operación fue exitosa, pero no le importa la definición granular de éxito que el servidor está informando. Probablemente sabrá si necesita información detallada de la respuesta. – gorjusborg

+0

¿No necesita esto ser envuelto en algo como un parseInt()? 250/100 === 2.51 ... entonces la expresión, httpCode/100! = 2 todavía se resolvería en TRUE, ¿verdad? – RavenHursT

3

Suponiendo http_status es un número entero (por lo que la división devuelve un entero), no es mejor o más rápido , pero diferente.

Permitirá que cualquier código de estado 2nn active esa condición. Un código de estado 2nn ...

... indica la acción solicitada por el cliente fue recibido, entendido, aceptado y procesado correctamente.

Source.

9

http_status/100 != 2 no es lo mismo que http_status != 200. Es esencialmente equivalente a (http_status < 200 || http_status > 299) (recuerde que cualquier cosa en ese rango constituye "success").

Dicho esto, dividir es horrible y completamente obtuso. Siempre usaría la comparación explícita, porque entonces la intención es clara.

+0

Creo que debería ser '||' ... – MByD

+0

Maldita sea, me concentré tanto en el "/ 100! = 2" Me olvidé por completo de los códigos a través de 201 - 299 –

2

Uno de los profesionales a favor del método de división de Tim Bray para detectar mensajes de nivel no 200 es que es más fácil realizar una prueba unitaria.

Este método a continuación necesitaría probarse tres veces; 2xx, 1xx y> 299.

(http_status < 200 || http_status > 299) 

Este método requiere solo dos.

http_status/100 != 2 

Esto no quiere decir que siempre es mejor usar el método de división frente al comparar, pero es un punto vale la pena hacer. En un proyecto en el que estoy trabajando, donde la diferencia de velocidad entre estos dos métodos no es un problema, prefiero el método de división de Tim Bray porque conduce a un caso de prueba menos para tener que probar. Tenemos pautas estrictas para la cobertura del código.

+0

Buen punto, pero tan doloroso tal como es, el primer método es más claro en cuanto a la intención y discutible también es una buena opción. –

3

He visto muchos códigos con validación codificada, y he tenido problemas con este enfoque con frecuencia.

Cuando yo refactorización en este tipo de código, el aproach que más uso es la aplicación de la verificación con una clase de javax-WS: javax.ws.rs.core.Response.Status.Family

algo como esto:

if(Response.Status.Family.familyOf(responseCode).equals(Response.Status.Family.SUCCESSFUL)){ 
    //do your thing 
} 

también puede comprobar si hay otros tipos de estado:

  • INFORMATIVO - 1xx
  • SUCCESSFULL - 2xx
  • REDIRECCIONAMIENTO - 3xx
  • CLIENT_ERROR - 4xx
  • SERVER_ERROR - 5xx

JavaDoc: Response.Status.Family

Cuestiones relacionadas