Uno de los caballos de batalla de la enseñanza de la programación es hacer
ver a los alumnos que una de las funciones principales de los lenguajes es la
de facilitar que se eviten errores. La tipificación y posterior comprobación de
datos de los compiladores, por ejemplo, es un mecanismo que refleja dicha
intención; al fin y al cabo, todas las variables se almacenan en memoria de
igual forma, sin importar el tipo (más que para reservar el espacio), por lo
que no es difícil darse cuenta de que el especificar que un tipo es entero,
flotante o cadena es un modo de controlar los fallos en los lenguajes fuertemente tipados. De lo contrario, sólo habría
que especificar cuántos bytes ocuparía la variable con la que queremos
trabajar, y no su tipo.
Esto es extensible al tipo de
las funciones y a sus parámetros. Así, si un parámetro es de tipo entero
estamos indicando al compilador que nos avise si, por algún descuido, hemos
permitido que la función reciba una cadena a través de dicho parámetro. No debe
preocuparnos si además debe ser entero positivo, ya que la mayoría de los
lenguajes admiten datos numéricos sin signo como tipos estándar. Sin embargo, los
compiladores no son capaces de limitar que el valor del parámetro debe
pertenecer a uno o varios rangos (por ejemplo, que el parámetro int iAge deba
estar entre -1 y 150 [considerando -1 como "desconocido"]).
Una magnífica y eficiente
práctica es cubrir esta limitación mediante programación de aserciones
(invariantes, precondiciones y postcondiciones), donde una "aserción" es una
condición indispensable que debe cumplir un valor para que el sistema pueda
continuar ejecutándose. En el ejemplo anterior, la aserción debería cubrir el
rango de edad, por lo que el cuerpo de la función contendría, nada más
comenzar, una precondición similar a la siguiente:
Debug.Assert(iAge >= -1 && iAge <= 150,
Error.ImprimirFatal(Error.EError.RangoIncorrecto,
"iAge", "[-1,150]", iAge));
Otro tipo de aserciones
comprueban cuándo un parámetro es nulo, cadena vacía, una conexión
supuestamente abierta está cerrada, el usuario no está autenticado…
La alternativa a las aserciones es emplear condicionales y lanzar excepciones. Tanto uno como las otras suelen estar
implementadas en los distintos lenguajes de programación como métodos cuyo
primer parámetro es la condición a cumplir, el segundo es la acción en caso de
que no se cumpla y que, tras ejecutar ésta, automáticamente finalizan la ejecución de la
aplicación.