Una de las herramientas que utilizamos frecuentemente en ingeniería de software son las funciones. Estas nos permiten encapsular nuestro programa en piezas de código que hacen algo específico facilitándonos la vida como programadores. Pero ¿qué pasa cuando obtenemos errores al utilizar una función creada por nosotros? Bueno, existen tres pasos bastante útiles para hacer debugging a funciones. Para contarte de ellos, y que los puedas entender mejor, antes te contaré un poco más de funciones y de su interfaz.
Imagínate una función como un mini programa que cumple una tarea específica dentro de un programa mayor que te da varias ventajas. Seguramente quieres saber cuáles son las principales. Dos de las más importantes son que el código es más sencillo de leer y por lo mismo te permiten encontrar errores con mayor facilidad.
defsuma(a, b):"""Suma los números a y b
Parámetros: a, b int > 0
Retorna: a + b
"""
resultado = a + b
return resultado
En cuanto a la interfaz de una función, es el resumen de cómo es utilizada específicando:
En el código del ejemplo anterior está la declaración de una función llamada suma donde, explícitamente con docstrings, se explica cómo está compuesta su interfaz. Sus parámetros son dos números enteros a y b, hace una operación de suma de esos números y retorna el resultado de esa operación.
Para comenzar a hacer debugging a cualquier pieza de código solamente necesitas saber dos cosas:
En el caso específico de debugging a funciones debes pensar en la interfaz de la función como un contrato firmado entre la función y tú. Todos sabemos que cuando un contrato no se cumple pasarán cosas malas. Por esto, al llamar a una función, uno se compromete a mandar ciertos parámetros (precondiciones) y la función a hacer cierta tarea (postcondiciones).
suma(5, 3)
>> 8
En este código de ejemplo el llamado de la función se ejecutará correctamente. ¿Qué pasaría si al llamar a la función generáramos algún error? Tendríamos que comenzar a hacer debugging a la función y para ello debemos considerar tres posibilidades:
Lo primero que debes revisar es la primera posibilidad ejecutando un print de los parámetros que recibe la función. Adicionalmente, también puedes hacer un print del tipo de los valores de esos parámetros.
defsuma(a, b):
print(a, b) #Comprueba los valores recibidos
print(type(a), type(b)) #Comprueba el tipo de los valores
resultado = a + b
return resultado
suma('a', 3)
Si ejecutas este código verás que una de las variables no está en el formato que necesita la función para ejecutar la operación.
Una vez comprobado que los parámetros son correctos existe la posibilidad de que la función no haga lo que debe. Para verificar esto agrega prints de los resultados de cada una de las operaciones antes del return.
defsuma(a, b):
resultado = a - b
print(resultado) #Verifica el resultado de la operación antes del returnreturn resultado
suma(5, 3)
De este modo verás que la operación no se está ejecutando como esperarías y podrás comenzar a buscar en qué parte de esa operación está el error.
Agotando las otras dos posibilidades el error estará relacionado con el return de la función o con un mal uso del valor retornado por la función. Para este caso debes revisar que en la definición de la función exista un return con los valores u operaciones que esperas. Si el error no está ahí, verifica el llamado de la función y asegúrate de que el valor retornado se usa correctamente.
Ahora conoces tres pasos que te facilitarán hacer debugging a tus funciones. En este caso utilizamos Python, pero puedes utilizar el mismo proceso para casi cualquier lenguaje de programación. Esto incrementará increíblemente tus habilidades de programación.
Debugging, estructuras de datos, testing y más son habilidades de pensamiento computacional que necesitas conocer para convertirte en un verdadero computer scientist. Si no me crees, conoce más de ellas completando el Curso de Introducción al Pensamiento Computacional con Python y comienza tu camino en el mundo de las ciencias computacionales. ¡Nunca pares de aprender! 🚀🤓