Desarrollo de programas

Llegados a este punto, deberíamos poder mirar las funciones de Python completas y adivinar qué hacen. También, si ha hecho los ejercicios, habrá escrito algunas pequeñas funciones. Tal como vaya escribiendo funciones mayores puede empezar a experimentar más dificultades, especialmente con los errores en tiempo de ejecución y los semánticos.

Para lidiar con programas de mayor complejidad, vamos a sugerirle una técnica que llamaremos desarrollo incremental. El objetivo del desarrollo incremental es sustituir largas sesiones de depuración insertando y probando cada vez pequeñas porciones de código.

Por ejemplo, supongamos que desea encontrar la distancia entre dos puntos, dados por las coordenadas (x1, y1 ) y (x2, y2 ). Por el teorema de Pitágoras, podemos escribir la distancia es:

El primer paso es considerar qué aspecto tendrı́a la función distancia en
Python. En otras palabras, ¿cuáles son las entradas (parámetros) y cuál es la salida (valor de retorno)?

En este caso, los dos puntos son los parámetros, que podemos representar usando cuatro parámetros. El valor de retorno es la distancia, que es un valor en coma flotante.

Podemos escribir un bosquejo de la función:

Obviamente, esta función no calcula distancias; siempre devuelve cero. Pero la sintaxis es correcta y se ejecutará, lo que significa que podemos probarla antes de complicarla más.

Para comprobar la nueva función, tenemos que llamarla con valores de ejemplo:

Hemos elegido estos valores de tal forma que la distancia horizontal sea igual a 3 y la distancia vertical sea igual a 4; de esa manera el resultado es 5 (la hipotenusa del triángulo 3-4-5). Cuando comprobemos una función, es útil saber la respuesta correcta.

Hasta el momento, hemos comprobado que la sintaxis de la función es correcta, ası́ que podemos empezar a añadir lı́neas de código. Después de cada cambio incremental, comprobamos de nuevo la función. Si en un momento dado aparece un error, sabremos dónde está exactamente: en la última lı́nea que hayamos añadido.

El siguiente paso en el cálculo es encontrar las diferencias entre x2 − x1 e y2 − y1. Almacenaremos dichos valores en variables temporales llamadas dx y dy y las imprimiremos.

Si la función funciona, las salidas deberı́an ser 3 y 4. Si es ası́, sabemos que la función recibe correctamente los parámetros y realiza correctamente el primer cálculo. Si no, sólo hay unas pocas lı́neas que revisar.

Ahora calculamos la suma de los cuadrados de dx y dy:

Observa en que hemos eliminado las sentencias print() que escribimos en el paso anterior. Este código se llama andamiaje porque es útil para construir el programa pero no es parte del producto final.

De nuevo querremos ejecutar el programa en este estado y comprobar la salida (que deberı́a dar 25).

Por último, si hemos importado el módulo math, podemos usar la función sqrt para calcular y devolver el resultado:

Si todo funciona correctamente, hemos terminado. Podrı́a hacer que imprimiera el resultado colocando la función print(resultado) antes que la sentencia return.

Al principio, deberı́a añadir solamente una o dos lı́neas de código cada vez. Conforme ganemos experiencia, escribiremos y depuraremos trozos más grandes. Sin embargo, el proceso de desarrollo incremental puede ahorrarle mucho tiempo de depurado.

Los aspectos fundamentales del proceso son:

  1. Comience con un programa que funcione y hágale pequeños cambios incrementales. Si hay un error, sabrá exactamente dónde está.
  2. Use variables temporales para mantener valores intermedios, de tal manera que pueda mostrarlos por pantalla y comprobarlos.
  3. Una vez que el programa esté funcionando, tal vez prefiera eliminar parte del andamiaje o aglutinar múltiples sentencias en expresiones compuestas, pero sólo si eso no hace que el programa sea difícil de leer.

Como actividad, utilice el desarrollo incremental para escribir una función de nombre hipotenusa que devuelva la longitud de la hipotenusa de un triángulo rectángulo, dando como parámetros los dos catetos. Registre cada estado del desarrollo incremental según vaya avanzando.