Kata Fizzbuzz en WinDev
Introduction
J'ai effectué ce kata pour répondre à la curiosité d'un développeur ne connaissant pas WinDev (mais versé dans les bonnes pratiques de développement). Je souhaitais lui montrer une résolution de kata plus complexe, mais je n'ai pas retrouvé le code source. En attendant, voici un exemple de code WinDev avec tests automatisés.
Pour ceux qui ne connaissent pas WinDev, vous constaterez donc que le langage est assez verbeux. Il peut être écrit en Français ou en Anglais (vous trouverez plus bas la traduction automatique du code en Français).
Je n'ai mis en place qu'un seul test unitaire. Je procède souvent ainsi quand je ne développe qu'une seule fonction. Je considère chaque ligne comme un test à part entière.
Pour vous donner un aperçu de l'écran de développement, voici comment se présente le code :
Règles du kata
Il faut écrire une fonction qui prend un entier et qui respecte les règles suivantes :
- La fonction renvoie une chaîne de caractère ayant pour valeur l'entier passé en paramètre.
- Lorsque l'entier est un multiple de 3, on renvoie la chaîne Fizz.
- Lorsque l'entier est un multiple de 5, on renvoie la chaîne Buzz.
- Lorsque l'entier est un multiple de 3 et de 5, on renvoie la chaîne FizzBuzz
Etape 1
Code de test
PROCEDURE MyScenario()
TestCheckEqual(convert_to_fizzbuzz(1), "1")
Code de production pour passage au vert
PROCEDURE convert_to_fizzbuzz(number is int)
RESULT "1"
Etape 2
Code de test
PROCEDURE MyScenario()
TestCheckEqual(convert_to_fizzbuzz(1), "1")
TestCheckEqual(convert_to_fizzbuzz(2), "2")
Code de production pour passage au vert
PROCEDURE convert_to_fizzbuzz(number is int)
RESULT NumToString(number)
Etape 3
Code de test
PROCEDURE MyScenario()
TestCheckEqual(convert_to_fizzbuzz(1), "1")
TestCheckEqual(convert_to_fizzbuzz(2), "2")
TestCheckEqual(convert_to_fizzbuzz(3), "Fizz")
Code de production pour passage au vert
PROCEDURE convert_to_fizzbuzz(number is int)
IF number = 3 THEN
RESULT "Fizz"
END
RESULT NumToString(number)
Etape 4
Code de test
PROCEDURE MyScenario()
TestCheckEqual(convert_to_fizzbuzz(1), "1")
TestCheckEqual(convert_to_fizzbuzz(2), "2")
TestCheckEqual(convert_to_fizzbuzz(3), "Fizz")
TestCheckEqual(convert_to_fizzbuzz(5), "Buzz")
Code de production pour passage au vert
PROCEDURE convert_to_fizzbuzz(number is int)
IF number = 3 THEN
RESULT "Fizz"
END
IF number = 5 THEN
RESULT "Buzz"
END
RESULT NumToString(number)
Etape 5
Code de test
PROCEDURE MyScenario()
TestCheckEqual(convert_to_fizzbuzz(1), "1")
TestCheckEqual(convert_to_fizzbuzz(2), "2")
TestCheckEqual(convert_to_fizzbuzz(3), "Fizz")
TestCheckEqual(convert_to_fizzbuzz(5), "Buzz")
TestCheckEqual(convert_to_fizzbuzz(6), "Fizz")
Code de production pour passage au vert
PROCEDURE convert_to_fizzbuzz(number is int)
IF modulo(number, 3) = 0 THEN
RESULT "Fizz"
END
IF number = 5 THEN
RESULT "Buzz"
END
RESULT NumToString(number)
Etape 6
Code de test
PROCEDURE MyScenario()
TestCheckEqual(convert_to_fizzbuzz(1), "1")
TestCheckEqual(convert_to_fizzbuzz(2), "2")
TestCheckEqual(convert_to_fizzbuzz(3), "Fizz")
TestCheckEqual(convert_to_fizzbuzz(5), "Buzz")
TestCheckEqual(convert_to_fizzbuzz(6), "Fizz")
TestCheckEqual(convert_to_fizzbuzz(10), "Buzz")
TestCheckEqual(convert_to_fizzbuzz(15), "FizzBuzz")
Code de production pour passage au vert
PROCEDURE convert_to_fizzbuzz(number is int)
IF modulo(number, 3) = 0 THEN
IF modulo(number, 5) = 0 THEN
RESULT "FizzBuzz"
END
RESULT "Fizz"
END
IF modulo(number, 5) = 0 THEN
RESULT "Buzz"
END
RESULT NumToString(number)
Code après refactoring
PROCEDURE convert_to_fizzbuzz(LOCAL number is int)
IF is_fizz() THEN
IF is_buzz() THEN
RESULT "FizzBuzz"
END
RESULT "Fizz"
END
IF is_buzz() THEN
RESULT "Buzz"
END
RESULT NumToString(number)
INTERNAL PROCEDURE is_fizz()
RESULT modulo(number, 3) = 0
END
INTERNAL PROCEDURE is_buzz()
RESULT modulo(number, 5) = 0
END
Code traduit
PROCEDURE convert_to_fizzbuzz(LOCAL number est entier)
SI is_fizz() ALORS
SI is_buzz() ALORS
RENVOYER "FizzBuzz"
FIN
RENVOYER "Fizz"
FIN
SI is_buzz() ALORS
RENVOYER "Buzz"
FIN
RENVOYER NumériqueVersChaîne(number)
PROCEDURE INTERNE is_fizz()
RENVOYER modulo(number, 3) = 0
FIN
PROCEDURE INTERNE is_buzz()
RENVOYER modulo(number, 5) = 0
FIN