Yet another building metaphor

Preview:

Citation preview

Yet Another Building Metaphorfactor10.com :: @aslamkhn :: aslamkhan.net

Aslam Khan

mail at aslam.khan@factor10.com

blog at http://aslamkhan.net

tweet at @aslamkhn

skype at aslmkhn

10 I = INT(10 * RND(1))20 PRINT “GUESS MY NUMBER:”30 INPUT J40 IF INT(J) != I THEN GOTO 2050 PRINT “YOU GOT IT!”60 PRINT “PLAY AGAIN (Y/N)?”70 INPUT Y80 IF Y == ‘Y’ THEN GOTO 1090 PRINT “THANKS FOR PLAYING”

One of the first games that I wrote

alert(“Thanks for playing”);

It looks better with whitespace

do { var i = Math.floor(Math.random()*11);

do { var j = prompt(“Guess my number”); } while (i != j);

alert(“You got it!);y = confirm(“Play again?”);

} while (y);

The JS version

alert(“Thanks for playing”);

do { var i = Math.floor(Math.random()*11);

do { var j = prompt(“Guess my number”); } while (i != j);

alert(“You got it!);

y = confirm(“Play again?”);} while (y);

It reads better with whitespace

What else can we do about it?

alert(“Thanks for playing”);

do { var i = Math.floor(Math.random()*11);

do { var j = prompt(“Guess my number”); } while (i != j);

alert(“You got it!);

y = confirm(“Play again?”);} while (y);

do { do { } while alert(“You got it!);

alert(“Thanks for playing”);

var mystery_number = Math.floor(Math.random()*11);

var guessed_number = prompt(“Guess my number”);(guessed_number != mystery_number);

var play_again = confirm(“Play again?”);} while (play_again);

It reads better with nicer names

Can we do better than renaming?

do { do { } while alert(“You got it!);

alert(“Thanks for playing”);

var mystery_number = Math.floor(Math.random()*11);

var guessed_number = prompt(“Guess my number”);(guessed_number != mystery_number);

var play_again = confirm(“Play again?”);} while (play_again);

Make the intention clearer

keep_guessing_until_matched( mystery_number() );(play_again());

say_thanks();

do { } while

do {

keep_guessing_until_matched( mystery_number() ); } while (play_again());

say_thanks();

It’s still not good enough

Why?

Because it is still this design

10 I = INT(10 * RND(1))20 PRINT “GUESS MY NUMBER:”30 INPUT J40 IF INT(J) != I THEN GOTO 2050 PRINT “YOU GOT IT!”60 PRINT “PLAY AGAIN (Y/N)?”70 INPUT Y80 IF Y == ‘Y’ THEN GOTO 1090 PRINT “THANKS FOR PLAYING”

And it is not a very good

design either

10 I = INT(10 * RND(1))20 PRINT “GUESS MY NUMBER:”30 INPUT J40 IF INT(J) != I THEN GOTO 2050 PRINT “YOU GOT IT!”60 PRINT “PLAY AGAIN (Y/N)?”70 INPUT Y80 IF Y == ‘Y’ THEN GOTO 1090 PRINT “THANKS FOR PLAYING”

And it is not a very good

design either

How do I add a new feature?

10 I = INT(10 * RND(1))20 PRINT “GUESS MY NUMBER:”30 INPUT J40 IF INT(J) != I THEN GOTO 2050 PRINT “YOU GOT IT!”60 PRINT “PLAY AGAIN (Y/N)?”70 INPUT Y80 IF Y == ‘Y’ THEN GOTO 1090 PRINT “THANKS FOR PLAYING”

And it is not a very good

design either

How do I test it?

Let’s just focus on the game itself

TestCase("Game Tests", {"test new game should let us play": function() { var play = new_game(); assertFunction(play); },

"test play should let us check for a win": function() { var play = new_game(); var win = play(5); assertFunction(win); },

"test winning play": function() { var play = new_game(); var guess = play['mystery_number']; var win = play(guess); assertTrue(win());}

});

The game as Higher Order Functions

var play = new_game();var win = play(guess);

The rest is user interface stuff

Does Language Matter?

Every powerful language has this

Primitive expressions

Means of combination

Means of abstraction

(this parallels the basics of human understanding too, btw)

We use these languages to express and organise our thoughts

do {keep_guessing( mystery_number() );

} while (play_again());say_thanks();

OR

var play = new_game();var win = play(guess);

We use these languages to express and organise our thoughts

do {keep_guessing( mystery_number() );

} while (play_again());say_thanks();

OR

var play = new_game();var win = play(guess);

Build monolithic static structures

Build composable dynamic structures

JS let’s you build both.What do you want to build?

factor10.com :: @aslamkhn :: aslamkhan.net