Haz tu código más fiable con Asserts

0
5212

En este tutorial veremos cuales son las ventajas de realizar comprobaciones en nuestro código mediante asserts (o aserciones), y las distintas opciones de las que disponemos en Java.

Índice de contenidos

1. Introducción

La mayoría de los métodos y de las clases mantienen ciertas restricciones sobre los valores que aceptan como parámetros.

Este tipo de restricciones deben documentarse correctamente para que, con el paso del tiempo, no caigan en el olvido, favoreciendo el hecho de que la aplicación falle o caiga en estados incoherentes si se realizan modificaciones sobre el código sin tener esta serie de restricciones en cuenta.

Por otro lado, documentar el código no siempre es la mejor solución: Es fácil pasarlo por alto, añade tareas de mantenimiento sobre el mismo,…

Por ello, suele ser mejor práctica hacer que nuestro código revele toda la información necesaria para comprender todo el dominio que nuestro sistema trata de dar solución y, tal y como se establece en el diseño por contrato, en este punto es donde entran las aserciones.

Las aserciones son predicados (funciones que devuelven valores lógicos verdadero-falso) y que se espera que siempre sean verdad. Si una aserción se evalúa como falsa en tiempo de ejecución la aserción falla, normalmente lanzando una excepción.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro Retina 15′ (2.7 Ghz Intel Core I7, 16GB DDR3).
  • Sistema Operativo: Mac OS El Capitan 10.11

3. Ventajas

La programación con aserciones nos ofrece múltiples beneficios. A continuación realizaremos un pequeño resumen de los principales, aunque algunos ya los hemos nombrado en el punto anterior:

  • Favorecen el diseño por contrato, pasando del establecimiento de axiomas a la comprobación de valores de una manera limpia y efectiva.
  • Favorecen el principio falla pronto y rápido si detectas un error.
  • Se garantizan las condiciones necesarias para que nuestro código funcione correctamente.
  • Mejora la mantenibilidad y la legibilidad de nuestro código, facilitando las labores de modificación, refactorización y optimización del mismo.

4. Librerías de Asserts

4.1. Spring Framework

Spring Framework ofrece, dentro de su repositorio de utilidades, una clase a través de la cual
realizar estas aserciones: org.springframework.util.Assert.

A modo de ejemplo se muestran a continuación algunos ejemplos de las funciones que ofrece la clase:

  • isAssignable(superType, subType):
    • Comprueba que la subclase superType es superclase de subType.
    • Assert.isAssignable(FourWheelsVehicle, Motorcycle, «La moto no es una subclase de VehículoDeCuatroRuedas.»)
  • state(boolean)

    • Comprueba el estado de un objeto.
    • Assert.state(vehicle.isReady(),»El vehículo no está listo todavía.»)
  • notNull(object)

    • Comprueba que el valor no es nulo.
    • Assert.notNull(document, «El documento no puede ser nulo.»)

Cuando alguna de las aserciones no se cumpla, el sistema lanzará una excepción de tipo java.lang.IllegalArgumentException.

Para más información referente a las funciones que mantienen la clase se puede visitar la página de documentación.

4.2. Guava

El conjunto de librería comunes de Google nos ofrece, una serie de utilidades para la realización
de aserciones a través de la clase com.google.commons.base.Preconditions.

Cada aserción tiene tres variantes:

  • Sin argumentos adicionales: lanza las excepciones sin mensajes o información adicional.
  • Un argumento de tipo Object: lanza las excepciones con el mensaje contenido en object.tostring().
  • Un argumento de tipo String: lanza las excepciones con el mensaje establecido en el argumento.

Algunas de las aserciones que mantiene son:

  • checkArgument(boolean)

    • Comprueba que el predicado es cierto.
    • Preconditions.checkArgument(minute < 60, «Los minutos deben ser inferiores a 60.»)
  • checkNotNull(T)

    • Comprueba que el valor no es nulo.
    • Preconditions.checkNotNull(document, «El documento no puede ser nulo.»)
  • checkState(boolean)

    • Comprueba el estado de un objeto.
    • Preconditions.checkState(vehicle.isReady(), «El vehículo no está listo todavía.»)

En los casos en los que no se cumpla la aserción el sistema lanzará una excepción de tipo java.lang.IllegalArgumentException.

Para más información se puede visitar su repositorio en github, donde se explican la totalidad de los métodos de la clase.

4.3. Apache Commons

El proyecto Apache Commmons provee una serie de funcionalidades reusables y de
ámbito general, entre las cuales cuenta con la clase org.apache.commons.lang3.Validate
que nos provee de las funciones necesarias para la realización de aserciones.

Cada aserción tiene tres variantes:

  • Sin argumentos adicionales: Lanza las excepciones sin mensajes o información adicional.
  • Con un argumento de tipo String: Lanza las excepciones con el mensaje establecido en el argumento.
  • Con un argumento de tipo String seguido por varargs: Lanza la excepción con el mensaje establecido en el argumento y sustituyendo las etiquetas con los valores de definidos como varargs.

A continuación, una muestra de las funciones para la realicación de aserciones:

  • isTrue(boolena)

    • Comprueba que el predicado es cierto.
    • Validate.isTrue(minute < 60, «Los minutos deben ser inferiores a 60.»)
  • notNull(T object)

    • Comprueba que el valor no es nulo.
    • Validate.notNull(document, «El documento no puede ser nulo.»)
  • validState(T collection, index)

    • Comprueba el estado de un objeto.
    • Validate.validState(vehicle.isReady(),»El vehículo no está listo todavía.»)

En caso no cumplirse la aserción se lanzará una excepción de tipo java.lang.IllegalArgumentException.

Para más información se puede visitar la documentación de la clase, donde se explican la totalidad de los métodos de la clase.

4.4. Java

Las aserciones en Java aparecen por primera vez en la versión 1.4 y no ofrecen otra acción que la misma aserción. Se desaconseja su uso en entornos productivos y requiere de el establecimiento de ciertas opciones de la JVM (-ea).

Un ejemplo de uso puede verse a continuación:

En caso de no cumplirse la aserción se lanza un error de tipo java.lang.AssertionError.

5. Conclusiones

Durante el tutorial hemos visto que el trabajo con aserciones nos ofrece numerosas ventajas durante la práctica del desarrollo. También hemos visto algunas de las opciones de las que dispone Java para realizar aserciones.

Como consecuencia ¡ya no tendréis excusas para no utilizarlas!

Dejar respuesta

Please enter your comment!
Please enter your name here