Die Mocking-Kata: StringCalculator Fassade

Einleitung

In Coding Katas werden überwiegend Programmieraufgaben gestellt, die ein bestimmtes Problem auf einer grünen Wiese lösen sollen. Ich erlebe es häufig, dass Teilnehmer:innen der Katas diese Kleinstaufgaben gut in ihre Projekte übernehmen können. Sie tun sich jedoch oft schwer damit, wenn es darum geht, bestehende Lösungen zu integrieren, in denen sie Mocken müssen, um die bestehenden Komponenten nicht vollständig initialisieren zu müssen. 

In echten Projekten trifft man oft auf Situtationen, in denen man auf fremde Abhängigkeiten angewiesen ist und deren Interfaces bedienen und benutzen muss. Leider wird dieses Vorgehen bislang in vielen Coding Kata Beispielen vernachlässigt. In diesem Artikel möchte ich eine Aufgabe erläutern, die ich zu diesem Zweck in meinen Coding Dojos bei team neusta benutze.

Die Idee ist nicht ausschließlich auf meinem Mist gewachsen. Ich danke den Kollegen Frank Supper und Sebastian Foot für die initiale Idee und Sebastian Bock beim Schreiben dieses Artikels.

Grundlage

Die Grundlage der Aufgabe bildet die String Calculator Kata, mit folgendem Interface:

public function add(string $numbers): string;

Aus der StringCalculator Kata kommen die Anforderungen an den $numbers Parameter:

The method can take 0, 1 or 2 numbers separated by comma, and returns their sum.
An empty string will return "0".
Example of inputs: "", "1", "2,3".

Die Aufgabenstellung

Erstelle eine Klasse Calculator, die die vier Grundrechenarten (Addition, Subtraktion, Multiplikation & Division) beherrscht, da diese sich mathematisch alle über die Addition abbilden lassen.

Das Interface der Calculator Klasse ist:

public function calculate(string $arithmeticTask): float;

Das Format des $arithmeticTask Parameters soll, wie folgt aussehen:

  • 1+2
  • 5-2
  • 3*5
  • 15/3

Leerzeichen spielen keine Rolle, es können beliebig viele oder keine zwischen den Zeichen stehen.

Der Calculator delegiert die Berechnung an den StringCalulator.

Der StringCalculator hat keine Implementierung und soll ausschließlich als Mock-Objekt abgebildet werden.

Mögliche Erweiterungen

  1. Es soll möglich sein, mehr, als zwei Operanden in einem $arithmeticTask zu verarbeiten.
  2. Rechenarten aus der Calculator Klasse auslagern.
  3. Es soll auch möglich sein, der Calculator Klasse float-Werte zu addieren / subtrahieren / multiplizieren / dividieren, z.B. 2.5 + 3.5 oder 3 * 2.25.
  4. Klammerung von arithmetischen Ausdrücken, z.B. 10*(3+5).

Bildquelle: Wikimedia Commons

Kommentare