Event Sourcing Challenge: Die Bowling Game Kata
Freunde des EventSourcing, wie würdet ihr die folgende Anforderung auf der Basis von ES lösen? Welche Events würdet ihr definieren?

Es geht um die Bowling Game Kata, die gewöhnlich zum Üben von TDD herangezogen wird. Aber da es sich um ein deutliches “Zustandsproblem” handelt, erlaube ich mir mal die Umwidmung zur ES Kata. Davon sollte es mehr geben, finde ich. Also mache ich mal den Anfang😉

Die Anforderungen

Beschrieben ist die Kata hier sehr ausführlich von Robert C. Martin. Es geht darum, den Punktestand eines Bowling-Spiels zu berechnen. 

Spielregeln
  • Ein Bowling-SPIELER rollt wiederholt die Bowling-Kugel, um damit Kegel (PIN) umzuwerfen. Pro Kugelwurf können das 0..10 sein.
  • Würfe werden normalerweise in Paaren gemacht, die zusammen einen Rahmen (FRAME) darstellen. Ein SPIEL besteht aus 10 frames. Die sind im obigen Bild zu sehen.
  • Die Punktzahl eines frame ist die Summe der pins beider Würfe. Allerdings kann man pro frame auch Bonuspunkt bekommen:
  • SPARE: Ein spare frame liegt vor, wenn mit beiden Würfen alle 10 Kegel umgeworfen wurden, z.B. mit 3+7 oder 6+4. In dem Fall wird der erste Wurf des nächsten frame noch als Bonus dazugerechnet. Das ist im obigen Bild der Fall im 3. frame. Das schwarze Dreieck zweigt einen spare an: 1. der zweite Wurf hat die verbleibenden 4 pins abgeräumt, 2. zu den 10 Punkten für den frame werden noch die 5 des ersten Wurfs aus dem nächsten addiert.
  • STRIKE: Ein strike frame liegt vor, wenn mit dem ersten Wurf schon alle 10 Kegel umgeworfen wurden. Dann hat der Frame nur diesen einen Wurf, aber er bekommt als Bonus die Punkte der nächsten beiden Würfe hinzugerechnet. Das gefüllt kleine Quadrat im obigen Bild zeigt das z.B. für den 5. frame an. Dessen 10 Punkte werden um die 0 und 1 Punkte der nächsten beiden Würfe vergrößert. (Die nächsten beiden Würfe können auch auf zwei nächsten frames verteilt sein, falls auf einen strike ein zweiter folgt.)
  • Weil der 10. frame ein spare oder strike sein kann, kann er nicht nur 2, sondern 3 Würfe enthalten. Die Bonuspunkte sollen ja gesammelt werden können, auch wenn es der letzte frame ist.

Messages
Ich gebe zur Realisierung der Anforderungen mal zwei CQS-Nachrichten vor, die ich aus dem Code von Robert C. Martin ableite:
  • Register roll(pins) command: Für jeden Wurf werden die umgestoßenen Pins registriert.
  • Kann fehlschlagen, wenn 
  • das Spiel schon beendet ist oder 
  • die pins nicht im Bereich 0..10 liegen oder 
  • in dem Bereich, aber nicht zum vorhergehenden Wurf im frame passen (d.h. die Summe > 10 wäre), z.B. erster Wurf 7 pins, zweiter Wurf 4 pins.
  • Score query: Am Ende des Spiels kann man erfragen, wieviele Punkte der Spieler erreicht hat.
  • Falls die Query vor Spielende abgesetzt wird, kann es sein, dass es nur ein vorläufiges Ergebnis gibt, weil Würfe für die Bonuspunkte eines frame noch ausstehen.

Die Challenge

Mich interessiert nun, welche Events seht ihr als nötig/nützlich an, um Command und Query zu befriedigen? Dass das ohne Events geht, ist klar. Dass EventSourcing für das Problem vielleicht überkandidelt ist, mag auch sein. Mir geht’s um eine Übung für’s Denken, das ES Mindset.

Und ich glaube, dass ES sich selbst in so einem kleinen Szenario beweisen können muss, um weitere Akzeptanz zu finden. Denn wie immer gilt ja: Was heute noch klein ist, kann morgen schon wachsen und übermorgen sehr groß und unternehmenskritisch sein.

Also: Wer lässt sich auf die Aufgabe ein?