Modifier

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 :

IDE WinDev avec des tests unitaires

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

Article précédent

Blog Comments powered by Disqus.