TDD Kata 04: Word Wrap

Dies ist mein wöchentlicher Kata Post. Lies den ersten um zu erfahren, worum es hier geht.

Letzte Woche: Prime Factors

Zunächst bin ich den Schritten in den PowerPoint Slides gefolgt, außer dass ich eine einfache Funktion geschrieben habe, statt einer Klasse mit statischer Methode. Das ist schließlich PHP und nicht Java:

namespace PrimeFactors;

function generate($n)
{
    $primes = [];
    for ($candidate = 2; $n > 1; $candidate++) {
        for (;$n % $candidate == 0; $n /= $candidate) {
            $primes[] = $candidate;
        }
    }
    return $primes;
}

Beim nächsten Mal habe ich einen objektorientierten Ansatz probiert (die Funktion einfach nur in eine Klasse verfrachten, macht sie noch nicht objektorientiert) und habe außerdem yield genutzt, um die temporäre Variable $primes loszuwerden.

class Number
{
    private $n;

    public function __construct(int $n)
    {
        $this->n = $n;
    }

    public function primeFactors() : array
    {
        return iterator_to_array($this->primeFactorsGenerator($this->n));
    }

    private function primeFactorsGenerator(int $n) : Generator
    {
        for ($candidate = 2; $n > 1; $candidate++) {
            for (; $n % $candidate == 0; $n /= $candidate) {
                yield $candidate;
            }
        }
    }
}

Ich habe die Kata genutzt um endlich einmal Behat auszuprobieren. Dies sind die ersten Scenarios in meinem Feature File:

Feature: Generate
  In order to calculate prime factors
  As a user of the library
  I want to retrieve the prime factors for a given number

  Scenario: Calculate prime factors of two
    Given I want to find all the prime factors for "2"
    When I calculate the prime factors
    Then I should be informed that the prime factors are "2"

  Scenario: Calculate prime factors of three
    Given I want to find all the prime factors for "3"
    When I calculate the prime factors
    Then I should be informed that the prime factors are "3"

  Scenario: Calculate prime factors of four
    Given I want to find all the prime factors for "4"
    When I calculate the prime factors
    Then I should be informed that the prime factors are "2,2"

Ich fand diese Gherkins Syntax etwas umständlich für so einen Low Level Test, und es ist wahrscheinlich auch nicht dafür gemacht. Ich verstehe Behat als Framework, um Spezifikationen auf Geschäfts-Ebene zu schreiben, die in Tests übersetzt werden können.

“Primfaktoren berechnen” ist nun keine typische Endnutzer-Anforderung, aber dennoch war es eine gute, um mit Behat zu beginnen. Die PhpStorm Integration ist auch brauchbar. Ich freue mich darauf, mehr damit zu machen.

Vierte Kata: Word Wrap

Word Wrap wurde von Uncle Bob in der “Craftsman” Serie beschrieben. In Story-Form hier nachzulesen: http://thecleancoder.blogspot.de/2010/10/craftsman-62-dark-path.html

“Yeah, it’s a simple problem to understand, but it’s oddly difficult to solve. The basic premise is really simple. You write a class called Wrapper, that has a single static function named wrap that takes two arguments, a string, and a column number. The function returns the string, but with line breaks inserted at just the right places to make sure that no line is longer than the column number. You try to break lines at word boundaries.”

Meine persönlichen Ziele diese Woche

  • Mich mehr mit Behat vertraut machen