Smalltalk en Extreme Programming (deel 2)
In eerste instantie was ik van plan om test driven een oplossing te gaan zoeken voor de sudoku puzzel, maar ik heb toch besloten om eerst aan de web interface te gaan werken. Hiermee krijg je dan eerder het gevoel dat je ook iets nuttigs met dat rare squeak kan doen.
Om het sudoku spel te tonen hebben we een seaside WAComponent nodig. In het model-view-controller paradigma bevat dit component zowel de controller als de view. We hebben daarnaast natuurlijk het model, onze game, nodig. Met de volgende code definieren we Sudokucomponent als subclass van WAComponent met een ‘game’ instance variabele.
WAComponent subclass: #SudokuComponent
instanceVariableNames: 'game'
classVariableNames: ''
poolDictionaries: ''
category: 'Sudoku'
We initialiseren onze game.
initialize
game:= Matrix new: 9.
game
atRow: 1 put: #(7 9 nil nil nil nil 3 nil nil);
atRow: 2 put: #(nil nil nil nil nil 6 9 nil nil);
atRow: 3 put: #(8 nil nil nil 3 nil nil 7 6 );
atRow: 4 put: #(nil nil nil nil nil 5 nil nil 2 );
atRow: 5 put: #(nil nil 5 4 1 8 7 nil nil);
atRow: 6 put: #(4 nil nil 7 nil nil nil nil nil);
atRow: 7 put: #(6 1 nil nil 9 nil nil nil 8 );
atRow: 8 put: #(nil nil 2 3 nil nil nil nil nil);
atRow: 9 put: #(nil nil 9 nil nil nil nil 5 4 ).
Dit is de code om ons spel te tonen:
renderContentOn: html
html heading: 'Sudoku Puzzel' level: 1.
html form:
[html table:
[1 to: 9 do:
[:row | html tableRow:
[1 to: 9 do:
[:col | html tableData:
[html textInputWithValue: (game at: row at:col)
callback: []]]]]]]
Nog even ons SudokuComponent registreren in de Seaside server:
SudokuComponent registerAsApplication: 'sudoku'.
En we hebben een simpele tabel met text vakken dat onze matrix voorspelt. Met wat stylesheet info geven we het een wat leukere layout:
style
^'
INPUT {
WIDTH: 20px
}
'
Ik heb een class met drie methodes nodig gehad om een simpele sudoku spel op een webpagina te plaatsen. En dit is ook echt alle code. Geen xml configuratie files, ook geen yaml files, ook geen jsp of rhtml. Ok, de taal is wat cryptisch als je smalltalk nog niet kent, maar het leren lezen van smalltalk is niet moeilijk. Er zijn namelijk maar vijf keywords en het enige moeilijke vind ik af en toe het lezen van de codeblocks.
Het doet allemaal nog niets, maar je kunt wel al wat feedback krijgen van een potentiele gebruiker.

Implement the message comma to make each row of the matrix easier to deal with.
Number>>,
UndefinedObject>>,
and
Tuple>>,
Then you can also have Matrix>>allPointsDo: as self rowsWithIndexDo:, etc…
Just my 2 cents,
Andres.
Comment by Andres — November 10, 2006 @ 1:51 am