Godzina 5.00, za oknami ciemno, pora na codzienne ćwiczenia. Zgodnie z definicją: “Kata - wysoce sformalizowany rodzaj ćwiczeń stosowanych w wielu tradycyjnych sztukach i sportach walki…”, “Są to sekwencje technik ataku i obrony, połączone z określonym poruszaniem, przyjęciem ściśle określonej pozycji i sposobu oddychania. Niektóre techniki w kata mają charakter wyłącznie symboliczny.”

Kata w kontekście IT to codzienne krótkie ćwiczenia (najlepiej do 30 minut), w których wykonujemy powtarzalne czynności. W ciągu tych ćwiczeń rozwiązujemy dowolne zadanie jak na przykład opisane poniżej FizzBuzz. Podczas treningu używamy skrótów, składni języka, gita czy specyficznych frameworków. Takie codzienne powtarzanie czynności pozwala nam być zawsze w “formie”. Kata są także dobrym rozwiązaniem do nauki nowej technologii. Cykliczne powtarzanie utrwala w naszej głowie mechanizmy specyficzne dla danej technologii.

FizzBuzz jest szybkim ćwiczeniem często stosowanym na rozmowach kwalifikacyjnych, aby sprawdzić jak kandydat porusza się w IDE oraz jakie stosuje podejście przy programowaniu. Ćwiczenie to jest także często wykonywane w połączeniu z TDD.

  • Wypisz wszystkie liczby od 1 do 100
  • Jeśli liczba jest podzielna przez trzy wypisz “Fizz
  • Jeśli liczba jest podzielna przez pięć wypisz “Buzz
  • Jeśli liczba jest podzielna przez trzy i pięć wypisz “FizzBuzz

Moja proponowana implementacja w Javie:

public class FizzBuzzTest {

private FizzBuzz fizzBuzz = new FizzBuzz();

//Should return 'Fizz' when number is divisible by three

@Test
public void shouldReturnFizzWhenNumberIsDivisibleByThree() throws Exception {
    // When
    String result = fizzBuzz.check(3);
    // Then
    assertThat(result).contains("Fizz");
}


//Should return 'Buzz' when number is divisible by five

@Test
public void shouldReturnBuzzWhenNumberIsDivisibleByFive() throws Exception {
    // When
    String result = fizzBuzz.check(5);
    // Then
    assertThat(result).contains("Buzz");
}


//Should return 'FizzBuzz' when number is divisible by five

@Test
public void shouldReturnFizzBuzzWhenNumberIsDivisibleByFiveAndThree() throws Exception {
    // When
    String result = fizzBuzz.check(15);
    // Then
    assertThat(result).contains("FizzBuzz");
}

//Should return number when number is not divisible by five and three

@Test
public void shouldReturnNumberWhenNumberIsNotDivisibleByFiveAndThree() throws Exception {
    // When
    String result = fizzBuzz.check(1);
    // Then
    assertThat(result).contains("1");
}


private class FizzBuzz {

    static final String FIZZ = "Fizz";
    static final String BUZZ = "Buzz";

    String check(int number) {
        String result = "";
        if(isDividedByThree(number)){
            result+= FIZZ;
        }
        if(isDividedByFive(number)){
            result+= BUZZ;
        }
        return result.isEmpty() ? String.valueOf(number) : result;
    }

    private boolean isDividedByFive(int number) {
        return number%5==0;
    }

    private boolean isDividedByThree(int number) {
        return number%3==0;
    }
}

}

Moja proponowana implementacja w Spocku:

class FizzBuzzSpec extends Specification {

@Shared
def fizzBuzz = new FizzBuzz()

def "Should return 'Fizz' when number is divisible by three" (){
    when:
        def result = fizzBuzz.check(3)
    then:
        result == "Fizz"
}

def "Should return 'Buzz' when number is divisible by five" (){
    when:
        def result = fizzBuzz.check(5)
    then:
        result == "Buzz"
}

def "Should return 'FizzBuzz' when number is divisible by five and three" (){
    when:
        def result = fizzBuzz.check(15)
    then:
        result == "FizzBuzz"
}

@Unroll
def "Should return #excpectedValue when number is divisible by #number" (){
    when:
        def result = fizzBuzz.check(number)
    then:
        result == excpectedValue
    where:
        number  excpectedValue
        1       "1"
        3       "Fizz"
        5       "Buzz"
        15      "FizzBuzz"
}

class FizzBuzz{

    String check(int number) {
        def result = ""
        if(isDividedByThree(number)){
            result+= "Fizz"
        }
        if(isDividedByFive(number)){
            result+="Buzz"
        }
        return result.isEmpty() ? String.valueOf(number) : result
    }

    private boolean isDividedByFive(int number) {
        number % 5 == 0
    }

    private boolean isDividedByThree(int number) {
        number % 3 == 0
    }
}

}

Całość jak zawsze na GitHubie.