Description d’une séance de coding dojo : le fizzbuzz

Présentation

Cinq développeurs sont réunis dans une salle, il y a un dojo master qui donne l’énoncé de l’exercice puis gère le temps de codage de chaque développeur. Le principe est simple, chaque développeur code pendant un moment sur un PC relié à un vidéoprojecteur puis ensuite le PC change de main pour que tout le monde puisse coder.

L’exercice

Créer une fonction qui prend en paramètre un nombre (on suppose que le nombre est toujours compris entre 1 et 100), quand le nombre est un multiple de 3 la fonction doit retourner « fizz », quand le nombre est un multiple de 5 la fonction doit retourner « buzz » et quand le nombre est un multiple de 15 la fonction doit retourner « fizzbuzz » dans tous les autres cas elle doit retourner le nombre.

Le but : développer une fonctionnalité en utilisant le Test Driven Development.

Les outils : Visual Studio, XUNit et NCrunch.

Réalisation de l’exercice.

A chaque fois on commence par écrire le code du test puis on écrit le code de l’exercice ensuite.

Premier test. On voit l'installation de NCruch avec Visual Studio qui lance le test automatiquement, le test ne passe pas, c'est normal le code de l'exercice n'est pas complet. Le test teste si avec la valeur 1 on retourne bien 1.

TTD avec NCrunch et Visual Studio

Premier code pour faire passer le test. Le code a été généré avec Visual Studio. La fonction n'est pas encore implémenté.

Code Fizzbuzz avec Visual Studio

On implémente la fonction pour que le test passe.

public class FizzBuzz
{
        public string Display(int value)
        {
            return 1.ToString();
        }
}

On implémente le deuxième test.

[Theory]
[InlineData(3, "fizz")]
public void TestFizzBuzzReturnFizz(int value, string expectedResult)
{
            FizzBuzz fizz = new FizzBuzz();
            string result = fizz.Display(value);
            Assert.Equal(expectedResult, result);
}

On modifie le code pour que la méthode retourne "fizz" pour 3.

public string Display(int value)
{      
            if (value % 3 == 0) return "fizz";
            return 1.ToString();
}

On implémente le troisième test. Le nombre passé en paramètre est 2, on doit obtenir 2. Pour aller aller plus vite et comme le test ne change pas on rajoute simplement la ligne ci-dessus au premier test.

[InlineData(2, "2")]

Le troisième code

public string Display(int value)
{      
            if (value % 3 == 0) return "fizz";
            return value.ToString();
}

Le quatrième test. On test si on retourne bien "buzz" pour un multiple de 5.

[InlineData(5, "buzz")]

Le quatrième code

public string Display(int value)
{
            if (value % 3 == 0) return "fizz";
            if (value % 5 == 0) return "buzz";    
            return value.ToString();
}

La cinquième et dernier test

[InlineData(30, "fizzbuzz")]

Le cinquième code

public string Display(int value)
{
            if (value % 15 == 0) return "fizzbuzz";
            if (value % 3 == 0) return "fizz";
            if (value % 5 == 0) return "buzz";      
            return value.ToString();
}

C'est fini !

Il y a bien sûr d'autres façons de réaliser l'exercice.

Fizzbuzz étendu

La séance de coding dojo continue avec la suite de l'exercice.

Développer une nouvelle version qui peut accepter n’importe quel test et pas seulement un multiple de 3, 5 et 15. Le nouveau FizzBuzz devra pouvoir fonctionner comme la version précédente mais en plus il pourra accepter n’importe quelles conditions. Par exemple si le mot passé en paramètre contient la lettre "a" la méthode doit retourner "fazz" et si le mot passé en paramètre contient la lettre "o" la méthode doit retourner "bozz". Le nombre de conditions n’est pas limité et la valeur retournée est toujours de type string.

Indice : on peut utiliser une liste de fonctions anonymes qui prennent une valeur en entrée et qui retourne une chaîne. Si la condition contenue dans la fonction anonyme est vraie on retourne le mot demandé sinon on retourne une valeur indiquant que la condition n’a pas été réalisée (null). On passe en revue toutes les fonctions anonymes si aucune condition n’a été satisfaite on retourne la valeur passée en paramètre.

Qui commence ?

Conclusion

Les impressions par le dojo master pendant la séance :" Plus vite, cela ne va pas assez vite, il faut coder plus vite. C’est pourtant simple, tu ne sais pas utiliser les génériques ?"

Vivement le prochain coding dojo !