Aserciones(Assertions)

pandemonium
27 de Abril del 2006
que saben acerca de las aserciones en java o el keyword assert ya que no le encuertro gran utilidaad en lanzar un AssertionError para que la VM se para pudiendo construirse una excepcion que lo contenga.

chuidiang
27 de Abril del 2006
Hola:

Las aserciones se usan en una técnica de programación llamada "programación por contrato".

Si tu haces una función, lo habitual que hacemos todos es protegernos contra los parámetros de entrada. Comprobar si son null, si están en el rango adecuado, etc, etc. Si no es así, nos apañamos como podemos dentro del código o lanzamos una excepción.

Esto es lo que se conoce como "programación defensiva" en el que tratas de garantizar que tu método salga airoso pasen lo que le pasen como parámetro, por mal que esté.

El problema de este tipo de programación es que es fácil equivocarse. Siempre puede haber una comprobación que se te pase por alto o que sea compleja de hacer.

También tiene la pega de que suelen repetise comprobaciones. Tu compruebas tus parámetros y quizás llames a otro método pasándole alguno de esos parámetros que a su vez vuelve a comprobarlos y así sucesivamente. El código al final queda feo porque las primeras líneas de todos los métodos son comprobaciones, if, if y más if.

En la "programación por contrato", el método en un comentario dice exactamente qué espera de los parámetros y no se preocupa de comprobar nada. Por ejemplo, el método puede decir cosas como "este parámetro no puede ser null" o este valor debe ser mayor de 10. Es responsabilidad del que usa el método asegurar que el parámetro cumple y si no cumple, el método no garantiza nada, puede incluso "cascar".

Java para facilitar este tipo de programación tiene el assert(). Al principio del método únicamente se comprueba que lo que has puesto en el comentario se cumple, es decir, que el parámetro no es null o el valor es mayor que 10 con un assert().

Si al ejecutar salta un assert(), sabes que es culpa del que llama al método y es ahí donde debe corregirse el problema.

Las excepciones siguen siendo necesarias. Con un assert, por ejemplo, no puedes controlar que al leer un fichero te salte una IOException.

Si quieres ampliar el tema, supongo que no te costará encontrar cosas en internet sobre la "programación por contrato".

Se bueno.