El
curso original plantea una metodología para crear funciones
(how to design functions recipe). Es una "receta" que va a ser utilizada a lo largo de todo el curso.
A modo de introducción, la receta se compone de los siguientes pasos:
1) Firma, propósito y "colilla" (stub)
2) Definición de ejemplos, cada uno contenido dentro de expresiones
check-expect
3) Plantilla e inventario
4) Códificación del cuerpo de la función
5) Pruebas y depuración hasta que sea correcto
Para problemas "fáciles", puede que sea tedioso hacer la receta, por lo cual hay que tener algo de paciencia. La idea de la receta es atacar problemas complejos, de forma que los mismos sean descompuestos en trozos más pequeños que sean fáciles de manejar.
Cada paso se escribe como comentario dentro del código, a manera de guía. Como tal, los pasos no hacen parte de las expresiones de DrRacket.
El detalle de los pasos es el siguiente:
Firma
Indica el tipo de dato que entra como insumo de la función y el tipo de dato que debe generarse.
Por ahora, los tipos de datos son: Number (número), Integer (número entero), Natural (número natural), String (texto), Image (imágen), Boolean (booleano, es decir falso o verdadero).
Propósito
Indica lo que la función produce según lo que consume.
Colilla (stub)
Es un pequeño código de la función que se quiere hacer. En este paso, apenas se define el nombre de la función, el argumento y como cuerpo de la función se pone cualquier resultado que se desea obtener. La finalidad es verificar si el borrador de la función y los ejemplos están escritos correctamente, aunque el resultado produzca un error. Este paso es importante para detectar que no haga falta algún parentesis, que la constante haya sido definida previamente, etc. Si bien parecen detalles sin importancia, cuando no se detectan a tiempo pueden generar dolores de cabeza posteriormente.
Ejemplos / pruebas
Los ejemplos ayudan a entender que debe hacer la función. Varios ejemplos ayudan a ilustrar un comportamiento. Cuando los ejemplos se incluyen en expresiones
check-expect, significa que los mismos van a servir como pruebas unitarias para la totalidad de la función. Tan pronto como se encuentra un error, se corrige con prontitud.
Plantilla / inventario
Es un modelo predeterminado, el cual posteriormente se ajusta según la funciòn que se quiera diseñar.
Codificación del cuerpo de la función:
Es el proceso de considerar todos los pasos anteriores para establecer como completar la función.
El siguiente ejemplo ilustra rápidamente la receta:
; Number --> Number (firma)
; Produce el doble del número recibido (propósito)
(define (doble n) 0) ; colilla (stub)
;ejemplos:
(check-expect (doble 3) 6) ;la función "doble" con un argumento 3 deberia producir 6
(check-expect (doble 4.2) 8.4) ; la función "doble" con un argumento de 4.2 debería producir 8.4
(check-expect (doble 4.2) (* 2 4.2)) ; el doble de 4.2 debería ser 2 X 8.4, que es lo mismo que 8.4
Si se ejecuta hasta aquí se obtiene:
Los resultados de la prueba indican que el cero que produce la función difiere de los resultados esperados. Si bien la funciòn difiere de los esperado, se observa que el borrador de la función y los ejemplos estan bien escritos, por lo cual se puede avanzar con el proceso.
Retomando nuevamente se tiene:
; Number --> Number (firma)
; Produce el doble del número recibido (propósito)
;(define (doble n) 0) colilla (stub) - se coloca como comentario cuando ya se hizo la prueba
;ejemplos:
(check-expect (doble 3) 6) ;la función "doble" con un argumento 3 deberia producir 6
(check-expect (doble 4.2) 8.4) ; la función "doble" con un argumento de 4.2 debería producir 8.4
(check-expect (doble 4.2) (* 2 4.2)) ; el doble de 4.2 debería ser 2 X 4.2, que es lo mismo que 8.4
;plantilla
;(define (doble n)
; (... n))
;Cuerpo de la funciòn
(define (doble n) (*2 n))
Al final, DrRacket indica que todas las tres pruebas fueron correctas:
Más adelante se verá con mayor detalle esta receta.
Anterior
Siguiente