The How to Design Functions Recipe

There’s an interesting course at Coursera — Introduction to Systematic Program Design — that teaches a spesific design process for programming. The course uses Racket, a Scheme dialect, but the design techniques are easily transferable to any language.

One of the fundamental ideas is a design method for constructing functions. The link describes the process in detail, I will illustrate a simplified process using JavaScript.

Let’s say you are to implement a function that computes the factorial of a number.

Step 1: Signature, purpose and stub #

The first step is creating the signature for the function. A signature is simply a statement of the type of the input argument and the output argument. In our case that is: Number -> Number.

The purpose is a short description of what the function does, in our case: computes the factorial of n

Nest we make a stub, the outer shell of the function with a dummy return value, which should be of the right type.

// Number -> Number
// computes the factorial of n
fact = function(n) {
  return 0
}

Step 2: Define examples/tests #

Next we provide examples for how the function should work.

debug(fact(5) === 120)
debug(fact(0) === 1)

Step 3: Using the stub/template, write the function #


// Number -> Number
// computes the factorial of n
fact = function(n) {
    var res = 1;
    if (n > 1) {
        for (var i = 1; i <= n; i++) {
            res *= i;
        }
    }
    return res;
}

debug(fact(5) === 120)
debug(fact(0) === 1)

Step 3: Test, debug and refactor #

Running the tests, they both return true. Looking at the function some more we see that it can be shortened. Finally, we have:


// Number -> Number
// computes the factorial of n
fact = function(n) {
    var res = 1;
    for (var i = 2; i <= n; i++) {
        res *= i;
    }
    return res;
}

debug(fact(5) === 120)
debug(fact(0) === 1)

We run the tests again and see that they still return true.

The process has a lot in common with test driven development of course, but it’s nice to see that it can be implemented so easily in JavaScript without using any test library.

 
13
Kudos
 
13
Kudos

Now read this

Page Specific JavaScript in Rails

Rails and the Asset Pipeline # The Rails asset-pipeline compresses and minifies your JavaScript (or CoffeeScript) and CSS files. It combines your separate JavaScript files into one big file that is delivered by the server, and thereby... Continue →