Merci pour le retour.
Donc il y a bien un problème lié à WinDev concernant la récursion.
Récursion terminale
Si je comprends bien pour la partie récursion, mon implémentation correspond à une récursion non terminale car il n'y a pas de valeur de retour qui renvoie de la récursivité, c'est bien ça ?
Tu m'indiques qu'il faut plutôt employer une récursion terminale, et en relisant la liste des TPP j'observe effectivement que celle-ci est positionnée plus haut dans liste que la récursion non terminale.
Ce qui indique qu'elle est moins complexe, et qu'il faut la privilégier en 1er. Ai-je bien compris ?
Meilleur affichage des résultats des tests
Effectivement le fait de "coupler" le nom à un détail d'implémentation du test n'est pas idéal.
J'ai aussi lu qu'il fallait éviter de mentionner les valeurs testées dans le nom du test.
Exemple :
PROCEDURE ShouldReturn2WhenGivenNumberIs2()
Qu'en penses-tu ? C'est aussi un "couplage" avec l'implémentation ?
Retour à l'utilisation d'une boucle
Je retourne donc à ma dernière itération en ajoutant l'étape de refactoring.
9ème itération (3ème tentative boucle)
Tests
PROCEDURE ShouldReturnArrayOfCorrespondingPrimeFactorsToTheGivenNumber()
let primeFactor = new cPrimeFactor()
TestCheckEqual(primeFactor.generate(1), [])
TestCheckEqual(primeFactor.generate(2), [2])
TestCheckEqual(primeFactor.generate(3), [3])
TestCheckEqual(primeFactor.generate(4), [2,2])
TestCheckEqual(primeFactor.generate(5), [5])
TestCheckEqual(primeFactor.generate(6), [2,3])
TestCheckEqual(primeFactor.generate(7), [7])
TestCheckEqual(primeFactor.generate(8), [2,2,2])
TestCheckEqual(primeFactor.generate(9), [3,3])
TestCheckEqual(primeFactor.generate(25), [5,5])
Code RED
PROCEDURE generate(number int)
factors is array of int
divisor is int = 2
WHILE modulo(number, divisor) = 0
factors.Add(divisor)
number = number / divisor
END
divisor++
WHILE modulo(number, divisor) = 0
factors.Add(divisor)
number = number / divisor
END
IF number > 1 THEN
factors.Add(number)
END
RESULT factors
Code GREEN
PROCEDURE generate(number int)
factors is array of int
divisor is int = 2
WHILE number > 1
WHILE modulo(number, divisor) = 0
factors.Add(divisor)
number = number / divisor
END
divisor++
END
IF number > 1 THEN
factors.Add(number)
END
RESULT factors
Code REFACTOR
PROCEDURE generate(number int)
factors is array of int
divisor is int = 2
WHILE number > 1
WHILE modulo(number, divisor) = 0
factors.Add(divisor)
number = number / divisor
END
divisor++
END
RESULT factors
J'ai ici modifié la condition de ma boucle principale dans le code qui passe les tests au vert, comme tu me l'as suggéré.
Ce qui m'a ensuite permis d'appliquer un refactoring et de supprimer du code mort.
Qu'en penses tu @Johjo ? Est-ce le résultat auquel tu arrives ?
Pour la suite, je suis partant pour commencer un autre kata. Lequel me proposes-tu ?
En parallèle, j'essaierai de repartir à l'étape 4 avec la récursion terminale.
Approchant de la fin de l'exercice, je me suis permis de jeter un œil sur l'implémentation de ce kata par Uncle Bob lors d'une conférence où il parle des TPP.
Voici le lien si cela peut intéresser quelqu'un : Robert C Martin - The Transformation Priority Premise
Merci et bonne soirée.
Yvan