icon - line border java example
¿Por qué Guava no tiene postcondiciones? ¿Qué puedo usar en su lugar? (3)
Por lo tanto, Guava tiene condiciones previas simples pero útiles para verificar los argumentos del método. Pero supongo que sería razonable tener una clase de "Postcondiciones" también. ¿O es simplemente porque java proporciona aserciones?
Dado que no existe una clase como esta, ¿cuál es la "mejor" forma alternativa (práctica) de verificar las condiciones posteriores antes de que vuelva un mathod?
Precondiciones y postcondiciones sirven propósitos muy diferentes.
Las condiciones previas prueban la entrada, que no está bajo el control del método; postcondiciones probar la salida, que es. Por lo tanto, no tienen sentido dentro del método en sí, sino solo como código externo que prueba el método.
Sin embargo, si realmente quisiera poner tales aserciones en su código, las Condiciones previas de la guayaba también servirían para eso, incluso si ese no es su propósito.
Probar las condiciones del puesto sería superfluo. La forma en que probamos las condiciones posteriores en java es mediante pruebas unitarias .
Con las pruebas unitarias, nos aseguramos de que para una entrada determinada obtengamos una salida predecible. Con las condiciones Preconditions
, podemos verificar que tenemos entradas válidas y, por lo tanto, las pruebas ya garantizan la salida.
Yo usaría la palabra clave assert
Java dentro del propio método para codificar la postcondición.
¿Prueba de unidad o postcondición?
Pruebas unitarias y postcondiciones sirven para diferentes propósitos.
Una afirmación en una prueba unitaria proporciona una verificación del resultado de un método para un vector de entrada . Es un oráculo que especifica el resultado esperado para un caso específico.
Una assert
en el método en sí mismo verifica que para cualquier entrada que posea la postcondición. Es un oráculo que especifica (propiedades de) el resultado esperado para todos los casos posibles . Tal post-condición-como-oráculo se combina bien con técnicas de prueba automatizadas en las que es fácil generar entradas, pero difícil generar el valor esperado para cada entrada.
¿Postcondiciones de guayaba?
En cuanto a por qué Guava tiene una clase de condición previa, pero no una clase de poscondicionamiento, aquí tengo mi comprensión.
Guava Preconditions proporciona efectivamente una serie de abreviaturas para situaciones comunes en las que querría lanzar un tipo particular de excepción (argumento ilegal, puntero nulo, índice fuera de límites, estado ilegal) según las entradas del método o el estado del objeto.
Para las condiciones posteriores hay menos casos comunes. Por lo tanto, hay menos necesidad de proporcionar una taquigrafía para lanzar tipos específicos de excepciones. Una condición posterior fallida es como un "Error interno del servidor" de HTTP 500: todo lo que sabemos fue incorrecto al ejecutar nuestro método.
(Tenga en cuenta que la noción de precondición de Guava es bastante diferente de la del design-by-contract puro, en el que no hay ninguna garantía si no se cumple una precondición, ni siquiera que se lance una excepción razonable. La clase de condiciones previas de la guayaba es útil capacidades para hacer una API pública más defensiva).