Fluent Builders: More than creating context specifications
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());