Tim Van Wassenhove home

Last couple of months i have been using the concept of (Fluent) Builder classes in order to create context specifications and i blogged about the steps i take to design their API. Lately i have realised that this concept has more uses than context specifcation only. Here is an example:

In sokoban a game board can be stored in plain text using the following ‘protocol’:

Level element Character
Wall #
Player @
Player on Goal +
Box $
Box on Goal *
Goal .
Floor (space)

Notice how a Fluent Builder allows us to implement this protocol with some elegant code:

actions.Add('#', aBoard => aBoard.AddFloor().WithWall());
actions.Add('@', aBoard => aBoard.AddFloor().WithPlayer());
actions.Add('+', aBoard => aBoard.AddGoal().WithPlayer());
actions.Add('$', aBoard => aBoard.AddFloor().WithBox());
actions.Add('*', aBoard => aBoard.AddGoal().WithBox());
actions.Add('.', aBoard => aBoard.AddGoal());
actions.Add(' ', aBoard => aBoard.AddFloor());