Sigueme en Twitter
«Anterior | Siguiente»

¿Que es una Aserción?

2/12/2008

Citando a Steve McConnell, una aserción (en ingles assert) se define como:

“.. código que se usa durante el desarrollo -usualmente una rutina o una macro- que permite a un programa auto diagnosticarse al momento que se ejecuta”

O dicho en términos mas simples, piensa en las aserciones como banderas que te indican cuando ocurre algún evento que nunca debería de ocurrir.

Pongamos un ejemplo donde has desarrollado un programa para procesar facturaciones de una pequeña empresa, y sabes que tu programa máximo puede procesar 10,000 facturaciones al día. Estas seguro que la empresa es tan pequeña que normalmente no llegara ni al 10% de esa cantidad, pero sin embargo el riesgo existe. Aquí es donde es útil una aserción.

Las aserciones son especialmente útiles en programas donde necesitas la mayor confiabilidad posible, y en caso de que ocurra un error poder diagnosticarlo rápidamente.

Todo código que vaya a producción no debe de depender de las aserciones para funcionar. Debes de utilizar un correcto manejo de errores (excepciones, loggeo, etc) para los errores que puedes esperar que ocurran comúnmente, y las aserciones para los errores que nunca deberían de ocurrir.

En términos prácticos

Lenguajes como C#, Java o PHP ya traen incluida esta funcionalidad. Comúnmente una aserción recibe un par de parámetros. Una expresión booleana y el mensaje que salta en caso de error.

En Java la declaramos de la siguiente manera:

1
2
int numero = 5;
assert numero > 10 : "El número es menor a 10!";

En C# hacemos uso de la clase Debug:

1
2
int numero = 5;
Debug.Assert(numero > 10, "El número es menor a 10!");

En PHP usamos utilizamos assert():

1
2
$numero = 5;
assert($numero > 10);

Todos lanzaran errores o warnings avisándonos de la catástrofe.

Enlaces:


Hay 9 comentarios:

  1. 2/12/2008moy dice:

    Creo que en este caso el ejemplo no fué del todo bueno :P

    En ese caso convendría mejor una excepción de runtime, no un assert. El assert, desde mi punto de vista, es para probar la lógica de tu programa, por ejemplo, justo al entrar a una función usar assert para verificar que los argumentos no sean nulos. Si tu tienes control sobre estos argumentos, usa assert, si es una API pública (tienes usuarios que no están bajo tu control) arroja una excepcion o regresa un error como NULL_ARGS_PROVIDED etc.

    En el caso de la facturación, el error se causaria por causas externas, ajenas a la lógica intrínseca de tu programa (mucha facturación). Tú mismo lo dices al final, usa excepciones y errores de retorno para errores que pueden ocurrir y asserts para aquellos que NUNCA deberian ocurrir, según la lógica de tu programa.

    Buen post :-)

  2. 3/12/2008Victor De la Rocha dice:

    No entiendo la diferencia de eso a poner un IF validando que no exceda tal cantidad.

    No entiendo que se hace mas rápido o sencillo :P

  3. 3/12/2008moy dice:

    En PHP posiblemente no exista diferencia. En C la diferencia es muy notoria, un assert() es un macro unicamente definido si la macro NDEBUG fue definida para la compilación, de otro modo todos los assert desaparecen y por ello no so ejecutados en runtime.

    Para PHP creo que la unica diferencia es conveniencia en la syntaxis.

  4. 3/12/2008Victor De la Rocha dice:

    oh!

    ¿Sería como ir poniendo alerts en un código para debuggear, pero si la compilación es oficial, estos no aparecen?

  5. 3/12/2008moy dice:

    correcto, no más no menos, es para debugear.

  6. 3/12/2008Victor De la Rocha dice:

    se lee muy lindo, Gracias por la explicación y pues mucho gusto sr Aserción! :)

  7. 3/12/2008pablasso dice:

    @moy A veces la línea entre donde utilizar una excepción o una aserción es muy delgado (o aún lo es para mi). Me explico, en el ejemplo de la facturación considero que utilizar el assert es justificado porque si esa condición llega a ocurrir entonces es una falla en la lógica de mi programa. Estoy asumiendo que algo nunca pasara y debido a eso lo tengo que verificar.

    Es decir, si se llegan a las 10,000 facturaciones lo que tiene que cambiar es la lógica de mi programa, ninguna condición externa solucionara el problema cambiando en algo (o claro, le podemos pedir a nuestro cliente que no venda tanto.. y después ser despedidos).

    Muy fregonas tus respuestas :-)

  8. 3/12/2008moy dice:

    Creo que puedo ponerlo en terminos mas simples.

    assert se usa cuando tienes control absoluto sobre la condicion y es tu total responsabilidad que se cumpla, de lo contrario es un bug en el código que justifica un abortar el programa.

    En el caso de la facturación, al ejemplo le hizo falta detalle, tu no controlas cuanto factura tu cliente, por lo tanto una aserción no hace sentido. Una excepción es lo correcto.

    Sin embargo, si tienes un metodo/función llamado create_invoice() que espera no ser llamado mas de N veces por dia por que tu base de datos pitera no soporta mas de N registros simultaneos puedes poner el assert, pero, aqui va la cosa importante, pones el assert ADICIONALMENTE a la excepción. La excepción debe ser llamada ANTES de create_invoice(), de tal forma que create_invoice() ASUME que quien sea que lo llame, se encargará de que nunca lo llame mas de N veces, es responsabilidad de la capa de arriba NUNCA llamar create_invoice mas de N veces, y para eso usa una validación con un if (mas de N veces){ throw new RuntimeException() }, si por un bug, tu excepción no es arrojada, entonces tienes el assert en create_invoice que cachara el catastrófico error.

  9. 3/12/2008Victor De la Rocha dice:

    Esa última respuesta deja todavía todo mucho mas claro.

Escribe tu comentario:

¿Escribiste código?


  Los mas frikis pueden suscribirse a los comentarios por RSS.