Part 8. Function Design - HTDF Recipes
The HTDF recipe that MIT uses to teach students to design functions is a perfect way to design hard functions easier, but the price to pay is that simple functions will have a hard time for designing using this method.The HTDF recipe model, when summarized, consists of 5 steps
- Signature, purpose and stub
- Define examples, Wrap each in check-expert (for racket only, use assertion tests appropriate for your language)
- Template and Inventory
- Code the function body
- Test and Debug until correct
Here is an Example
Design a function that consumes a number and reproduces twice that number. Call your function Double. Follow the HTDF Recipe and show the stub and template
Let us do the first step.
A signature is more of a data flow of a function. It requests the input type and produces the expected output data type of a function. In this example, the function must accept a number and outputs a number.
;Signature
;Number -> Number
Then we list the purpose of the function, it is already stated in the requirements.
;Produces 2 times the given number
Then finally we have the function stub. It is a piece of code that bootstraps or scaffolds the function to give some expected output of the correct datatype regardless of the input. It is to prepare the function to be written.
;a stub - Racket
(define (double n) 0)
You can design stubs in your preferred programming language that supports functions/procedures/definitions/subroutines or whatever the language specifications call it.
The next step which is examples, allows us to write test cases where we would check if the function produces the expected output. For Dr. Racket, there is a primitive called check-expect Which is racket's assertion test library. Programming languages have their own test frameworks or assertion libraries.
(check-expect (double 3) 6)
(check-expect (double 4.2) 8.4)
Both of these tests are obviously gonna fail as the stub has not been fully defined yet. It allows problems to be detected early on
check-expect: actual value 0 differs from 6, the expected value.
check-expect: actual value 0 differs from 42/5, the expected value. The template makes the clear sense of what the function has to work with. It identifies on how the parameter should work with the function, for primitives, it can be as simple as an ellipse and that parameter (define (double n) (... n)) This tells us that we will do something with the parameter n, we will write more complex templates for complex functions Then we start coding. Using the previous steps that we undertook, you now should have an idea on how to implement this. To have an idea on what the code should be, refer to your test cases and the purpose to learn how the expected output is made. For this example, the result is due to the multiplication process, and we have clues in the purpose on why is that so. Then, you can implement multiplication in your function body, using the evaluation rules to get the logic right. These is how the previous process helps with the function design
- the signature tells you the type of the parameter(s) and the type of the data the function body must produce
- the purpose describes what the function body must produce in English
- the examples provide several concrete examples of what the function body must produce
- the template tells you the raw material you have to work with
The last step is to test and debug.
Mga Komento
Mag-post ng isang Komento