120 likes | 254 Views
Programación con Assertions. Qué es un assertion?. Es un enunciado colocado en un programa , que el programador tiene la seguridad de que en ese lugar el e nunciado siempre es verdad . Se utiliza para ayudar en la verificación de la correctitud del programa .
E N D
Quées un assertion? • Es un enunciadocolocado en un programa, que el programadortiene la seguridad de que en eselugar el enunciadosiempreesverdad. • Se utilizaparaayudar en la verificaciónde la correctituddel programa. • Como precondición • Se coloca al comienzo de una sección de código • Como Post condición • describe el estado esperado al final de la ejecución.
Funcionamiento • Una vez definidos lo Assertionsse comprueban en tiempo de ejecución o estáticamente a veces. • Una aserción se evalúa como false en tiempo de ejecución, se produce un error de aserción, que por lo general hace que la ejecución deba abortar.
Mas… • El uso de las afirmaciones ayuda al programador en el diseño, desarrollo y a razonar acerca de un programa. • Se utilizan solamente para comprobar los supuestos en tiempo de ejecución.
Diseñoporcontrato • Las afirmaciones pueden funcionar como una forma de documentación: • Pueden describir el estado del código que se espera encontrar antes de ejecutar (sus condiciones ), y el estado del código que se espera producir cuando termine de ejecutarse • También puede especificar invariantes de una clase.
Ventajas • La ventaja de la utilización de las declaraciones de aserción en lugar de afirmaciones en los comentarios es que el programa puede comprobar las afirmaciones cada vez que se ejecuta, • si la afirmación no se sostiene, un error se puede informar . • Esto evita que el código de conseguir fuera de sintonía con las afirmaciones (un problema que puede ocurrir con los comentarios).
Ejemplo int total =countNumberOfUsers(); if(total %2==0) { // total es par } else { // total impar y no negativo assert(total %2==1); }
Uso • Para declarar un assertionen una clase Java, se usa la palabra clave assert que tiene la siguiente sintáxis: assert Expresion1; assert Expresión1:Expresión2; • Expresión1 tiene que ser una expresión booleana o se producirá un error de compilación. • Cuando se evalúa un assertionque solo tenga Expresión1, se comprueba la veracidad de la expresión y si es verdadera se continúa la ejecución del programa, pero si es falsa, se lanza una excepción de tipo AssertionError.
Ejemplo: Si supiesemosque…. • Alguna condición debía ser cierta en alguna parte del código (el invariante) lo colocaba como comentario: if (a==1){ ... } elseif (a==2){ ... } else { //cuando a==3 ... } • Aquies donde se puede aplicar la nueva instrucción assert, (y en general para cualquier invariante): if (a==1){ ... } elseif (a==2){ ... } else { assert (a==3) ... }
De esta manera conseguimos proteger el else. Si se entra por el else y el aserto no se cumple, se genera una excepción de tipo AssertionError. • Otro candidato para los asertos es una sentencia switch que no tenga cláusula default. En este caso el aserto comprobará que nunca se entra por el default, de esta manera:
Assertion con switch switch (suerte) { case Moneda.CARA: ... return; case Moneda.CRUZ: ... return; case default: assert false; }
Conclusiones • Los assertions son un buen método para comprobar valores de variables, expresiones y para comprobar estados del programa por donde no se tiene que pasar. • Esto también se puede hacer con una serie de If's, pero no sería tan eficiente, y sobre todo no se podría desactivar cuando uno quiera. • Como moraleja final, en el informe de fallo del Ariane 5 (explotó en el aire por una mala conversión de un float de 64 bits a un integer de 32) donde los asertos (comprobando la buena conversión) hubiesen evitado la catástrofe.