Lumaktaw sa pangunahing content

EP: 10 - Poorly formed problems

EP 10. Poorly formed problems

Sometimes, poor requirements analysis and vague problems can cause miscommunication and forces the programmer to make an assumption, which is not always good. 

Take a look at this problem

Design a function that takes the image and determine whether the image is tall.

Now, this is somewhat problematic, we need clarification on what makes an image tall. Let's try to do the HtDF methodology.

The signature would be

;; Image -> Boolean

Since this seems to be a yes or no question, we are going to output a boolean.

The purpose of this function would be to produce true if the image is tall.
When designing the purpose with the boolean as the output, you must put there on what makes the condition true. It specifies on how to interpret the output.

Now we produce the stub of the function, We need to know what is the name of the function, which is not specified by the problem.

You will have to invent the name of a function, and make sure the name corresponds on the purpose of the function.

For racket, Function definitions that produce a boolean have a question mark at the end, It depends on the programming language whether question marks are allowed, as question marks are used for ternary operators in some languages.

(define (tall? img) false)

We will now write the tests

(check-expect (tall? (rectangle 2 3 "solid" "red")) true)

We will approximately 3 tests for this, will be tackled later.

Define the template

(define (tall? img)
    if (... img))

We are now asking a yes or no question, we have to use an if function to make a decision. 

From our intuition alone, we can determine if an image is tall if the height is greater than the width, with the guess, let us create the body

(define (tall? img)
  if (> (image-height img) (image-width img))
  true
  false))

If you ran Dr. Racket with the code, all test would be passed, but some code is highlighted in black. It is warning us that some code is not executed by condition. When we run test cases, we should think for more scenarios, for example, what if the image is wide? To ensure that the code is correct, we need to make tests for every possible scenario.

We will add a scenario when the image is wide

(check-expect (tall? (rectangle 3 2 "solid" "red")) false)

Now all our code is evaluated. We also need to know what to do with squares, the width and height of the image is equal.

When we encounter a case where we have another condition which actually happens fairly common when we actually write the code, we need to know what to do when this happens.

We can refactor the code to accompany said condition. It can also happen to existing tests or signature..

We can assume for now that squares are not tall, nor wide

(check-expect (tall? (rectangle 3 3 "solid" "red")) false)

And we need to update the purpose on our definition of tall, which is height > width.

We can also refactor the body of the current function to make the code shorter. Since all we do anyway is to output a boolean, there are already predicates that do that.

instead of using an if function, we can use the > predicate, It produces a boolean anyway

(define (tall? img)
  (> (image-height img) (image-width img)))

All tests should pass.


Mga Komento

Mga sikat na post sa blog na ito

Problem Solving using HtDF method

Problem Solving In this problem, we will use the HtDF method to create a function. Problem:  Design a function that pluralizes a given word. (Pluralize means to convert the word to its plural form.) For simplicity you may assume that just adding s is enough to pluralize a word. Here is the problem that we need to convert into a function. We need to do it systematically using the HtDF method. First we need the signature, recall that the signature will tell us what is the input and expected output. A word is the input and output of the function, and we can represent words, which is just a sequence of characters if you think about it, like a String. So the signature of the function is ;;String -> String Then we will need to know what is the function's purpose, we can look at the specifications to know the purpose. It says that the word is pluralized in the process "assumption that adding s at the end is the pluralized form of the word". Ther...

EP: 19 - big-bang Mechanism

Part 19. big-bang We are using Dr. Racket to design interactive programs, from this day forward, this is going to be very complicated. Imagine we have 2 interactive programs, one that counts down from 10 to 0 and some animation of a cat walking in the screen. These programs are interactive by just pressing the space key, the program restarts. These interactive programs change state and it affects the program behavior. On the countdown program, it generates a number from 10 to 0 every 1 second. It is also the same with the cat program, it just changes the x coordinate of the cat every miliseconds. These are 2 different functions, now how can we combine these 2 functions. We combine them by using Dr. Rackets big-bang primitive. (big-bang 0           (on-tick next-cat)           (to-draw render-cat)) We use 0 as the initial world state, then on every tick, we get the next x coordinate, we pass it to the render c...

EP: 18 - HtDF with Itemization

Part 18. HtDF with Itemization From the Countdown Display definition that we have made earlier, we are going to make a function out of it. We have to output an image depending on the state of the countdown.  Here is the Signature, Purpose and Stub. It is recommended to run the code often, the earlier we detect bugs, the better. We need some examples. For tests on itemizations, we need to have as many tests as there are cases. Also, if we have an interval, we have to test points of variance. For the Interval, there is not much variance in the seconds before midnight so it is okay to have only one test for that. There is a primitive called text which converts text to an image, we can also use number->string to convert a number into a string datatype. Note that when we are devising tests, we are already working out the behavior of the function before we start coding. Now we get the template and start creating the function body.  ...