Upload
aslam-khan
View
1.264
Download
0
Embed Size (px)
Citation preview
Yet Another Building Metaphorfactor10.com :: @aslamkhn :: aslamkhan.net
Aslam Khan
mail at [email protected]
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